web-dev-qa-db-ja.com

緯度/経度のペアをPostGIS地理タイプに変換するにはどうすればよいですか?

場所でクエリできるように、緯​​度と経度のペアをPostGIS地理タイプにロードしようとしています。

特に、floatの緯度と経度の列とgeography(Point, 4326)列のあるテーブルがあります。やりたい

update mytable set geography = ???

ドキュメントは、以下が機能することを示唆しているようです。

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' ||
                                                           longitude || ')');

そうではありません。この点を意味として解釈しているのかわかりませんが、経度が-90から90の間にあることしか許可されていないため、明らかに経度ではありません。

だから、私は何をしますか?

31
DRMacIver

...はぁ。私の側の愚かさ。どうやら正しい順序は経度、緯度です。両方の座標が同じ範囲(-180から180)であると思い込んでしまったので、もっと微妙なことが起こっていると思いました。

37
DRMacIver

地理タイプを作成するいくつかの方法は次のとおりです。

  1. 数値のlong列とlat列をgeog地理タイプに変換します。

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography
    
  2. 単純なキャストを使用して、geomジオメトリ列( SRID = 4326 )をgeogジオメトリタイプに変換します。

    UPDATE mytable SET geog = geom::geography
    
  3. 投影されたgeomジオメトリ列をgeog地理タイプに変換します。

    UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography
    

最後の2つの例は、どのジオメトリタイプでも機能することに注意してください。また、ジオメトリから地理への変換は暗黙的であることが多く、これらの例は::geographyなしで機能しますが、通常、明示的なキャストはこれらのことに対して良い習慣です。

8
Mike T

Latとlngの間の交換を実行するには、次を使用できます。

update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' ||  st_y(geom) || ')');

sridの有無にかかわらず。

5
Dawid D