緯度と経度のデータ型はどれですか?


154

私はPostgreSQLとPostGISの初心者です。PostgreSQL 9.1.1データベーステーブルに緯度と経度の値を保存したいのですが。2点間の距離を計算し、この位置の値を使用してより近い点を見つけます。

緯度と経度にはどのデータ型を使用すればよいですか?


4
2つのポイント(2D緯度/経度マップ)を実行している場合は、Geometryデータタイプを使用します。距離計算に地球の高度または曲率を導入する必要がある場合、地理学はあなたが行きたい場所です。
12

4
以下の回答のいずれかがあなたの質問に対処しましたか?もしそうなら、私はあなたが答えとして一つを選択することをお勧めします:)
Volte

回答:


140

データ型を使用できます point - (x,y)緯度/経度の組み合わせです。16バイトを占有:float8内部的に2つの数値。

または、タイプfloat(= float8またはdouble precision)の2つの列にします。それぞれ8バイト。
またはreal(= float4)追加の精度が必要ない場合。それぞれ4バイト。
または、numeric絶対精度が必要な場合でも。4桁のグループごとに2バイト、さらに3〜8バイトのオーバーヘッド。

数値タイプ幾何タイプについての詳細なマニュアルを読んでください。


データ型は、追加のモジュールによって提供されているのPostGISと占有1つのあなたのテーブルの列を。各ポイントは32バイトを占めます。SRIDのような追加のオーバーヘッドがいくつかあります。これらのタイプは(lat / long)ではなく(long / lat)を格納します。geometrygeography

ここからPostGISマニュアルを読み始めます


5
floatデータ型の使用はお勧めしません。座標の計算が非常に複雑になります。geographyそのような計算にはPostGISとデータ型を使用する必要があります。
m13r 2016

8
本当に良いマニュアルですね。ドキュメントの輝かしい例。
otocan 2017年

1
元の長い緯度のgeogを解析するよりも、長い時間、緯度、およびgeogを保存する方が高速でしょうか?
Dan

1
@ダン:依存します。詳細については、新しい質問をしてください。あなたはいつでもコンテキストのためにこれにリンクすることができます。コメントは新しい質問の場所ではありません。
Erwin Brandstetter、2018年

40

PostGISでは、緯度と経度を持つポイントにgeographyデータ型があります。

列を追加するには:

alter table your_table add column geog geography;

データを挿入するには:

insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)');

4326は空間参照IDで、GPSと同じように経度と緯度でデータを表します。詳細:http : //epsg.io/4326

次数は経度、緯度です。マップとしてプロットすると、(x、y)になります。

最も近いポイントを見つけるには、まず空間インデックスを作成する必要があります。

create index on your_table using gist (geog);

そして、たとえば、特定のポイントに最も近い5を要求します。

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;

1
明確化SRID 4326は、この順序で緯度経度を求めています。しかし、PostGISのSRID 4326の解釈では、この順序で経度緯度が必要です。例はPostGISの使用に適しています。 postgis.net/2013/08/18/tip_lon_lat
ハハメド

26

PostGisを強く支持します。これは、その種のデータ型に固有であり、ポイント間の距離を計算するためのすぐに使えるメソッドがあり、将来的に役立つと思われる他のGIS操作の中でも特に


5

PostGISが提供するすべての機能が必要ない場合は、Postgres(現在)がearthdistanceという拡張モジュールを提供しています。距離計算に必要な精度に応じて、ポイントまたはキューブデータタイプを使用します。

これで、earth_box関数を使用して、たとえば場所の特定の距離内にあるポイントを照会できます。


2

PostGISでは、ジオメトリ(ラウンドアースモデル)よりもジオメトリが推奨されます。これは、計算がはるかに単純であるため、処理が高速になるためです。また、利用可能な関数が非常に多くありますが、非常に長い距離では精度が低下します。

CSVを長い緯度フィールドからDECIMAL(10,6)列にインポートします。6桁は10cmの精度で、ほとんどのユースケースで十分です。

次に、インポートしたデータをキャストします

SELECT 
    --ST_SetSRID(ST_Point(long, lat),4326) geom -- the wrong way because SRID not set in geometry_columns table
    ST_Point(long, lat)::geometry(Geometry, 4326) geom
INTO target_table
FROM source_table;

SRIDがゼロでないことを確認してください!

SELECT * FROM public.geometry_columns WHERE f_table_name = 'target_table';

WKTビューアを使用して長緯度パラメータの順序を検証し、 ST_AsEWKT(target_table.geom)

次に、最高のパフォーマンスを得るためにインデックスを作成します

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.