これはおそらく簡単な質問ですが、私は PostGIS にあまり詳しくなく、このすべてを完全に理解しているわけではありません。
nodes
基本的に、 POINT列()を持つテーブル()がありますpoint
。この列にインデックスを作成しました。
create index nodes__points on nodes using gist (point)
このコラムは
select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2)
私は (緯度、経度) 形式のデータを追加しているので、srid 4326 を使用しています。(つまり、アイルランドのダブリンの位置が lat=53.353 lon=-6.264 である座標系です (これは で追加しましたGeomFromText('POINT(-6.264 53.535)')
))。
各ポイントについて、そのポイントを中心としたおよそ 1 km のボックス内にあるすべてのポイントを見つけます (つまり、selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id;
。正確である必要はなく、大まかなヒューリスティックな数字で十分です。1 km のボックスでも、1 km の円でもかまいません。正確に 1 km である必要はなく、その大きさのオーダーで十分です。
/ /などはすべて SRID の単位を使用します。4326/WGS64 の場合は度です (つまり、1 = 緯度/経度の 1 度)。ただし、私はメートルを使用したいと思いますST_Distance
。ST_DWithin
ST_distance_sphere
メートルを使用できる とを試しましたst_dwithin
が、そうすると、explain
インデックスが使用されていないことが示されます。
どうすれば大体欲しいものを手に入れることができるのか、そして地理インデックスを使用しますか?
アップデート: これは PostgreSQL 9.1 および PostGIS 2.0 svn ビルドです。
ベストアンサー1
ST_Transform を使用してメートルを使用することもできます。また、すべての関数が地理型で使用できるわけではないことに注意してください。ただし、速度が本当に必要な場合は、ST_DWithin を使用するのが最も速い方法です。度とメートルの変換の近似値は次のとおりです。
| places | degrees | distance |
| ------ | ---------- | -------- |
| 0 | 1.0 | 111 km |
| 1 | 0.1 | 11.1 km |
| 2 | 0.01 | 1.11 km |
| 3 | 0.001 | 111 m |
| 4 | 0.0001 | 11.1 m |
| 5 | 0.00001 | 1.11 m |
| 6 | 0.000001 | 0.111 m |
| 7 | 0.0000001 | 1.11 cm |
| 8 | 0.00000001 | 1.11 mm |