PostGIS関数を使用して最も近いポイントを見つける方法は?


8

テーブルA:

lat | long | the_geom | code | sign 
13.8433095 | 100.6360357 | 0101000020E61.... | ABC | start_point
13.7544738 | 100.5459646 | 0101000020E6..... | ABC | end_point
13.4124215 | 100.6232332 | 0101000020E61.... | DEF | start_point
13.2423438 | 100.2324426 | 0101000020E6..... | DEF | end_point

テーブルB:

lat | long | the_geom | code    
13.7546285 | 100.5458729 | 0101000020E.... | ABC    
13.7546698 | 100.5458513 | 0101000020E.... | ABC
13.7547107 | 100.5458233 | 0101000020E.... | DEF    
...

各ポイント(テーブルAの開始ポイントと終了ポイント)の最も近いポイントを見つけて、テーブルBで同じ「コード」を持つすべてのポイントと比較しますか?

これを解決するのに最適なPostGIS関数/ PostgreSQLクエリは何ですか?私が試したのは..

ST_Distance_SpheroidおよびST_DWithinおよびST_Distance

しかし、1つのクエリ内でそれらを組み合わせる方法はわかりません。

回答:


9

多分このようなものです(各テーブルにいくつかの主キー列「id」があると仮定します):

SELECT A.id, A.code AS Code, A.sign AS Sign, B.id, 
   ST_Distance(A.geom, B.geom) AS Distance 
FROM Table_A AS A, Table_B AS B
WHERE A.id IN ( 
   SELECT X.id
   FROM TableA as X, TableB as Y
-- Here's the important part: refer to the A table **outside** of the subquery
   WHERE X.code=Y.code AND X.id=A.id
-- and use ORDER BY ... LIMIT 1 to get the closest point
   ORDER BY ST_Distance(X.geom, Y.geom) ASC LIMIT 1
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.