私はPostgreSQLとPostGISの初心者です。 PostgreSQL 9.1.1データベーステーブルに緯度と経度の値を保存したい。 2つのポイント間の距離を計算し、この位置の値を使用してより近いポイントを見つけます。
緯度と経度に使用するデータ型はどれですか?
データ型 point
を使用できます-(x,y)
を組み合わせて、lat/longにすることができます。 16バイトを占有:2 float8
番号を内部的に。
または、タイプ float
(= float8
またはdouble precision
)の2列にします。各8バイト。
または追加の精度が必要ない場合は、real
(= float4
)。各4バイト。
または偶数 numeric
絶対精度が必要な場合。 4桁のグループごとに2バイト、および3〜8バイトのオーバーヘッド。
数値型 および 幾何学的型 に関する詳細なマニュアルをお読みください。
geometry
および geography
データ型は追加モジュールによって提供されますPostGISおよびテーブル内のone列を占有します。各ポイントは、32バイトを占有します。 SRIDのような追加のオーバーヘッドがあります。これらのタイプは、(lat/long)ではなく(long/lat)を格納します。
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 を強く推奨します。これはその種類のデータタイプに固有であり、ポイント間の距離を計算するためのすぐに使用可能なメソッドがあります。他のGIS操作の中で、将来役立つ可能性があります。
PostGISが提供するすべての機能が必要でない場合、Postgres(現在)は earthdistance と呼ばれる拡張モジュールを提供しています。距離計算の精度のニーズに応じて、 point または cube データ型を使用します。
earth_box関数を使用して、たとえば、場所から一定の距離内にあるポイントを照会できます。