2017-01-04 9 views
1

場所を含むテーブルを作成しました。その位置は、(緯度、経度)ポストグラムで表されます。私は同じのために使用されるコマンドは、次のとおりPostgresが距離結合クエリを使用して正しい結果を返す

私はPostgresの私が自分の空間座標とともに(緯度、経度で表現さ位置を含むテーブルを作成し

で(経度、緯度)等の空間座標を挿入(度) )ポストグルで。私は同じのために使用されるコマンドは以下のとおりです。

CREATE TABLE spatialTest(
    name character varying(100), 
    the_geo geography 
); 
\copy spatialTest(name,the_geo) FROM 'testSpatial.csv' DELIMITERS E'\t' CSV; 

testSpatial.csvは、以下の値が含まれます。

A SRID=4326;POLYGON((0.178773 -127.681841,0.178711 -127.681962,0.179125 -127.682083,0.179176 -127.682006,0.179153 -127.681986,0.179143 -127.681962,0.179147 -127.681935,0.179166 -127.681913,0.179195 -127.681897,0.179244 -127.681886,0.179284 -127.681887,0.179336 -127.681904,0.179464 -127.681757,0.179489 -127.681736,0.179429 -127.681680,0.179370 -127.681516,0.179221 -127.681331,0.179184 -127.681185,0.179051 -127.681264,0.178822 -127.681499,0.178761 -127.681698,0.178796 -127.681703,0.178839 -127.681721,0.178857 -127.681736,0.178861 -127.681740,0.178871 -127.681756,0.178873 -127.681782,0.178859 -127.681809,0.178843 -127.681825,0.178812 -127.681839,0.178773 -127.681841)) 
B SRID=4326;POINT(0.628912 -127.700922) 

は、今私はお互いの50キロの距離内にあるすべての空間位置を見つけたいです。そうするために私は、次のコマンドを使用:

select s1.name, s2.name from spatialTest s1, 
    spatialTest s2 where ST_DWithin(s1.the_geo, s2.the_geo, 50000); 

はしかし、私の驚きに、私はAとBは50キロ(正確には50.0995キロよりも大きな距離によって互いに分離されているが、ことがわかったクリスを使用して見つかりました。 Venessの測地線の公式(緯度と経度の点と線分の距離を計算する))が、結果としてポストグルに返されます。誰かが私がどこに間違っているのか理解してもらえますか?

私はPostgreSQLの9.6develと私が使用していますPostGISのバージョンをされて使用しています:PostGISのは= "2.2.1 r14555"

+2

あなたはPostgresの「バグ」メーリングリストでそのための答えを得ました" - あなたはそれをやりました?そして、なぜあなたは適切なPostgresのリリースを使用していないのですか? –

+0

あなたのコードとサンプルデータが私にエラーを返します: 'ERROR:解析エラー - 無効なジオメトリ ヒント:" SRID = 4326; POINT(0.628912、 - " - ジオメトリ内の位置26の解析エラー。コード例 –

+1

*「ポストグルでの(緯度、経度)で表される空間座標」*経度、緯度順で引数を渡す必要があると思います。つまり、最初の引数は緯度ではなく経度です。 –

答えて

1

他の人が言ったように、あなたが負荷にこれを取得している。..

NOTICE: Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY 
CONTEXT: COPY spatialtest, line 2, column the_geo: "SRID=4326;POINT(0.628912 -127.700922)" 

おそらく、(lat,long)をロードしようとしており、PostgreSQLは(long,lat)をロードしようとしています。ただし、入力列の順序を回避することは可能です。

  1. テンポラリテーブルasジオメトリを作成するだけです。

    CREATE TEMP TABLE foo(name text, the_geo geometry); 
    
  2. インポート時にSRIDビット(EKWT)を切り落とします。

    sed -i -e's/SRID=4326;//' ./foo.csv 
    
  3. 入力をロードします。

    \copy foo(name,the_geo) FROM 'foo.csv' DELIMITERS E'\t' CSV; 
    
  4. ポイントを並べ替える。
  5. メインテーブルにコピーします。サイドノートとして

    INSERT INTO spatialTest(name, the_geo) 
    SELECT 
        name, 
        ST_Union(
        ST_SetSRID(
         ST_MakePoint(st_y(geom), st_x(geom)) 
        ,4326) 
    )::geography 
    FROM foo 
    CROSS JOIN ST_DumpPoints(foo.the_geo) AS t 
    GROUP BY name 
    ORDER BY name; 
    

:名前にvarchar型を使用しないでください。ちょうどそれをTEXTのままにしておきます。あなたが文字制限を課す正当な理由がない限り。 *私はあなたが、PostGISのメーリングリストにそのことについてではない、ここに依頼する必要があると思う」*:

その後、あなたの距離を実行します。..

SELECT ST_Distance(
    (SELECT the_geo FROM spatialtest WHERE name='A'), (SELECT the_geo FROM spatialtest WHERE name='B') 
); 
    st_distance 
---------------- 
49740.52214618 
(1 row) 
+0

私は(長い、緯度)で試しましたが、同じエラーが発生しました – user7364669

+0

あなたは何を意味するのですか?エラー、私はちょうど49.7キロメートルのst_distanceを持っていますか?なんでしょう? –

関連する問題