PostGIS : 레이어 A의 포인트 ID를 레이어 B의 가장 가까운 포인트에 할당


15

이것은 내 다른 질문 : PostGIS에서 스파이더 다이어그램 (허브 라인)을 만드는 방법 에 대한 명백한 선구자 였어야합니다 .

계층 A (상점)의 점과 계층 B (고객)의 점 사이의 관계를 모르는 경우 일반적으로 "고객 1은 가장 가까운 상점에서 서비스합니다."라고 말하고 싶습니다. 나는이 사실이 사실이 아니라는 것을 알고 있지만, 대리자가 될 수 있습니다.

PostGIS를 사용하면 레이어 A (저장소)에서 가장 가까운 포인트의 ID를 레이어 B (고객)의 각 포인트에 할당하는 가장 효율적인 방법입니다. 내가 찾고있는 출력은 다음과 같습니다.

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

답변:


6

마찬가지로:

CUST_ID로 A.ID를 선택하고 A에서 STORE_ID로 st_distance (A.geom, B.geom) 한계 1을 기준으로 B 순서에서 B.ID를 선택하십시오.


이것이 작업을 수행하는 가장 좋은 방법이었습니다. 내가 사용한 실제 코드는 아래의 참고 사항을 참조하십시오.
RyanKDalton

8

상점보다 많은 고객이있는 경우 상점에 대한 보로 노이 다각형 레이어를 작성한 다음 상점 다각형에 대해 고객의 공간 결합을 수행하는 것이 더 효율적일 수 있습니다 .


1
나는이 접근법을 좋아한다!
underdark

보로 노이 폴리를 생성하는 가장 쉬운 방법은 무엇입니까? 무엇을하는 것은 여기에 언급되는 다른 옵션이 있습니다 bostongis.com/... bostongis.com/...
RyanKDalton

두 번째 자습서의 Delaunay Triangulation 및 Dirichlet Package가 가장 적합하다고 확신하지는 않습니다.
Kirk Kuykendall


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

모두의 의견을 보내 주셔서 감사합니다. 나는 궁극적으로 eprand 's와 underdark의 제안을 조합하여 갔다. 내가 사용한 마지막 코드는 다음과 같습니다.

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;

그런 다음 상점 계층에서 voronoi 다이어그램을 만들어 결과가 올바르게 작동했는지 확인했습니다. 위대한 일에 감사드립니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.