web-dev-qa-db-ja.com

Postgisの2つのポイント間の距離(メートル単位)

これはおそらく簡単な質問ですが、私はPostGISがあまり得意ではなく、これらすべてを完全に理解しているわけではありません。

基本的に、私はPOINT列(nodes)を持つテーブル(point)を持っています。この列にインデックスを作成しました

_create index nodes__points on nodes using Gist (point)
_

列はで作成されました

_select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2)
_

フォーム(緯度、経度)のデータを追加しているため、srid4326を使用しています。 (つまり、アイルランドのダブリンの位置がlat = 53.353 lon = -6.264である座標系(GeomFromText('POINT(-6.264 53.535)')で追加しました))。

各ポイントについて、そのポイントを中心とした1kmのボックス内にあるすべてのポイントを見つけたいと思います(つまり、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;。正確である必要はなく、大まかなヒューリスティックな数値です。1kmのbboxは結構です、1kmの円は結構です。正確に1kmである必要はなく、その桁だけです。

_ST_Distance_/_ST_DWithin_/etc。すべてSRIDの単位を使用します。これは、4326/WGS64の場合は度です(したがって、1 = 1度の緯度/経度)。しかし、私はメートルを使いたいです。

メートルを使用できる_ST_distance_sphere_と_st_dwithin_を試しましたが、そうすると、explainはインデックスが使用されていないことを示します。

どうすれば私が望むものを大まかに取得できますかそして地理的インデックスを使用しますか?

[〜#〜] update [〜#〜]:これはPostgreSQL9.1およびPostGIS2.0svnビルドにあります。

21
Rory

これを書いた後、PostGISの「geometry」タイプとは対照的に「geographic」を発見しました。これは私が望むことを正確に実行する可能性があります。

5
Rory

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  |
23

古い質問ですが、次のようにキャストする必要があります:ST_Distance(p.geom::geography, u.geom::geography)ここで、pとuは2つのテーブルのエイリアスです

3