PostGIS:レイヤーAのポイントのIDをレイヤーBの最も近いポイントに割り当てます


15

これは、他の質問に対する明確な前兆であったはずです(質問しませんでした )。PostGISでスパイダーダイアグラム(ハブライン)を作成する方法は?

レイヤーAのポイント(店舗)とレイヤーBのポイント(顧客)の関係がわからない場合は、一般的に「顧客1は最寄りの店舗からサービスを受けています」と言いたいと思います。私はこの事実が真実ではないかもしれないことを理解していますが、それはまともな代理になる可能性があります。

PostGISを使用して、レイヤーA(店舗)の最も近いポイントのIDをレイヤーB(顧客)の各ポイントに割り当てる最も効率的な方法は何ですか。私が探している出力は以下のようなものです。

Customer | Store
    1    |   A
    2    |   A
    3    |   B
    4    |   C

回答:


6

同様に:

A.IDをCUST_IDとして選択します(BからB.IDをst_distance(A.geom、B.geom)limit 1で選択)AからSTORE_IDとして選択します


これがタスクを達成するための最良の方法でした。使用した実際のコードについては、以下のメモを参照してください。
RyanKDalton-OffTheGridMaps

8

店舗よりも多くの顧客がいる場合は、店舗用のボロノイポリゴンのレイヤーを作成し、店舗ポリゴンに対して顧客を空間的に結合する方が効率的かもしれません。


1
私はこのアプローチが好きです!
暗闇

どのアプローチがボロノイポリを作成するのに最も簡単でしょうか?ここに記載されている他のオプションがあります: bostongis.com/…bostongis.com/…– RyanKDalton
OffTheGridMaps

2番目のチュートリアルのDelaunay Triangulation and Dirichletパッケージが適切だと思いますが、それが最も簡単かどうかはわかりません。
カーククイケンドール


5

から http://www.bostongis.com/?content_name=postgis_nearest_neighbor

テーブル内のすべてのレコードの最近傍を取得する必要があるが、各レコードの最初の最近傍のみが必要な場合は、PostgreSQLのDISTINCT ON構文を使用できます。これは次のようになります。

SELECT DISTINCT ON(g1.gid)  g1.gid As gref_gid, 
       g1.description As gref_description, 
       g2.gid As gnn_gid, 
       g2.description As gnn_description  
FROM sometable As g1, sometable As g2   
WHERE g1.gid <> g2.gid 
      AND ST_DWithin(g1.the_geom, g2.the_geom, 300)   
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom) 

これにより、300ユニットまでの最小距離が検出されます。そのため、最初にデータを確認し、最小距離がどれだけ大きくなるかを調べる必要があります。



3

皆様のご意見ありがとうございます。最終的に私はエプランと暗闇の提案を組み合わせて行きました。最終的に使用したコードは次のとおりです。

CREATE TABLE closest_point as
SELECT DISTINCT ON (A.GID) A.GID AS CUST_ID, 
      (SELECT B.GID FROM "STORES" as B 
       ORDER BY ST_Distance(A.the_geom, B.the_geom) limit 1) as STORE_ID, 
       A.the_geom 
FROM "CUSTOMERS" as A, "STORES" as B;

次に、storesレイヤーでボロノイ図を作成し、結果が正しく機能することを確認しました。すばらしい仕事に感謝します!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.