私はPostgreSQLとPostGISの初心者です。PostgreSQL 9.1.1データベーステーブルに緯度と経度の値を保存したいのですが。2点間の距離を計算し、この位置の値を使用してより近い点を見つけます。
緯度と経度にはどのデータ型を使用すればよいですか?
私はPostgreSQLとPostGISの初心者です。PostgreSQL 9.1.1データベーステーブルに緯度と経度の値を保存したいのですが。2点間の距離を計算し、この位置の値を使用してより近い点を見つけます。
緯度と経度にはどのデータ型を使用すればよいですか?
回答:
データ型を使用できます 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)を格納します。geometry
geography
ここからPostGISマニュアルを読み始めます。
float
データ型の使用はお勧めしません。座標の計算が非常に複雑になります。geography
そのような計算にはPostGISとデータ型を使用する必要があります。
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;
PostGISが提供するすべての機能が必要ない場合は、Postgres(現在)がearthdistanceという拡張モジュールを提供しています。距離計算に必要な精度に応じて、ポイントまたはキューブデータタイプを使用します。
これで、earth_box関数を使用して、たとえば場所の特定の距離内にあるポイントを照会できます。
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);