数十万のPostGIS POINTを持つPostgreSQL 9.1テーブルがあります。これらのそれぞれについて、POINTの別のテーブルで最も近いポイントを見つけたいと思います。2番目の表の点は、全世界のグリッドを表しています。そのため、常に1度以内で一致することがわかります。これは、これまでに使用したクエリで、GISTインデックスを使用しているため、かなり高速です(合計約30秒)。
SELECT DISTINCT ON (p.id)
p.id, ST_AsText(p.pos)
, ST_AsText(first_value(g.location) OVER (PARTITION BY p.id ORDER BY ST_Distance(p.pos, g.location::geography)))
FROM point p
JOIN grid g ON ST_DWithin(p.pos::geometry, g.location, 1)
唯一の問題は日付変更線です。グリッドポイントの緯度は180度のみで、-180ではありません。ST_Distanceのジオメトリバージョンを使用する場合、これは日付変更線の反対側のポイントを返しません。例えば。p.posがPOINT(-179.88056 -16.68833)
最も近いグリッドポイントである可能性がありますPOINT(180 -16.25)
が、上記のクエリはそれを返しません。これを修正する最良の方法は何ですか?
1つのグリッドポイントに2つの座標(-180と+180)を使いたくありません。この特定のケースをチェックする独自の関数を追加しようとしましたが、おそらくインデックスを使用できなくなったため、クエリが5分で返されません。ST_DWithinの地理バージョンも使用してみましたが、そのクエリも5分後に返されませんでした。
良い質問です(そして返信で巧妙なハックを!)。ただし、ソフトウェアが経度の-180 = 180を認識できない場合は、これらが投影座標であると偽っており、ユークリッドアルゴリズムを使用して最も近い点を検出しているため、エラーが発生します(微妙に近い)赤道、極と+ -180子午線の近くで巨大です)。それがアプリケーションに重大な問題を引き起こすかどうかはわかりませんが、他の多くのケースではそれが起こり、その回避策はエラーを解決しません。
—
whuber
良い点ですが、この場合、クライアントアプリケーションは他の「最も近い」計算を行いません。クエリから返されたグリッドポイントに関連付けられたデータを取得するだけです。
—
EM0