2011-12-11 6 views
13

これはおそらく簡単な質問ですが、私はPostGISにはあまりよくありません。Postgisの2つのポイント間の距離は、srid 4326(メーター単位)で

基本的に私はPOINT列(point)を持つテーブル(nodes)を持っています。私は列が、私は、フォーム(緯度、経度)でのデータを追加しているので、私はSRID 4326を使用しています

select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2) 

を使用して作成されたこのコラム

create index nodes__points on nodes using gist (point) 

にインデックスを作成しました。 (すなわち、ダブリン、アイルランドの位置が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;)正確である必要はありません。大雑把な人間的な数字です。 1キロの円で結構です。それは正確に1キロ、マグニチュードのちょうどその順序である必要はありません。

ST_Distance/ST_DWithinの/ etc。すべて4326/WGS64のためにそれほど度(あるSRIDの単位を使用します1 = 1度の緯度/経度)

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

私はお望みのものを得るにはどうすれば地理的なインデックスを使用できますか?

UPDATE:これはPostgreSQL 9.1およびPostGIS 2.0 svn buildです。

+0

おそらくいくつかの助けを:[ST_DWithinはなぜ、メートル、度などのパラメータを取りません?](http://stackoverflow.com/questions/8444753/st-dwithin -takes-parameter-as-degree-not-meters-why) – radek

+1

義務的な質問:PostGISのバージョンは何ですか? PostgreSQLのバージョン – filiprem

答えて

5

これを書いて以来、私はPostGISの「ジオメトリ」タイプではなく、「地理的な」タイプであることを発見しました。

+1

地理学はうまくいくはずです。あなたは質問のデータ型について言及していませんでした。 Geomの問題は、最終的には2Dオブジェクトだということです。地理学は4Dオブジェクトです。地球パラメータの高度と曲率が含まれています。これらの2つのパラメータがないと、実際には異なる緯度/経度が異なるため、あなたはどこにいるのか分かりません惑星上で。あなたが書いているときには些細なことかもしれませんが、あなたが参照している列のデータ型がわかるように、テーブル作成文を含めてください – Twelfth

16

メトリックを使用するにはST_Transformを使用できますが、すべての機能が地理タイプで使用できるとは限りませんが、実際にはST_DWithinを使用する必要がある場合は最も速い方法です。ここで度とメートル間の変換のaproximationです:

| 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 | 
関連する問題