PostGIS: Gán ID của điểm trong lớp A cho điểm gần nhất trong Lớp B


15

Đây có lẽ là một tiền thân rõ ràng (mà tôi không hỏi) cho câu hỏi khác của tôi: Làm thế nào để tạo sơ đồ nhện (đường trung tâm) trong PostGIS?

Nếu tôi không biết mối quan hệ giữa một điểm trong lớp A (cửa hàng) và điểm ở lớp B (khách hàng), tôi thường nói "Khách hàng 1 được phục vụ bởi cửa hàng gần nhất". Trong khi tôi nhận ra sự thật này có thể không đúng, nó có thể là một người thay thế đàng hoàng.

Sử dụng PostGIS, cách hiệu quả nhất để gán ID của điểm gần nhất trong lớp A (cửa hàng) cho từng điểm trong lớp B (khách hàng). Đầu ra tôi đang tìm kiếm là một cái gì đó như dưới đây.

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

Câu trả lời:


6

tương tự như vậy:

chọn A.ID là CUST_ID, (chọn B.ID từ thứ tự B theo st_distance (A.geom, B.geom) giới hạn 1) làm STORE_ID từ A


Đây là cách tốt nhất để hoàn thành nhiệm vụ. Xem ghi chú của tôi dưới đây cho mã thực tế mà tôi đã sử dụng.
RyanKDalton-OffTheGridMaps

8

Có vẻ như nếu bạn có nhiều khách hàng hơn so với các cửa hàng, thì việc tạo ra một lớp đa giác voronoi cho các cửa hàng sẽ hiệu quả hơn , sau đó thực hiện liên kết không gian của khách hàng với các đa giác cửa hàng.


1
Tôi thích cách tiếp cận này!
underdark

Cách tiếp cận nào là dễ nhất để tạo ra voronoi polys? Có những lựa chọn khác mà những gì được ghi nhận ở đây: bostongis.com/... bostongis.com/...
RyanKDalton-OffTheGridMaps

Tôi nghĩ rằng Gói Triangulation và Dirichlet Delaunay trong hướng dẫn thứ hai sẽ phù hợp, không chắc nó có dễ nhất hay không.
Kirk Kuykendall


5

Từ http://www.bostongis.com/?content_name=postgis_nearest_neighbor :

Nếu bạn cần lấy hàng xóm gần nhất cho tất cả các bản ghi trong một bảng, nhưng bạn chỉ cần hàng xóm gần nhất đầu tiên cho mỗi bản ghi, thì bạn có thể sử dụng cú pháp DISTINCT ON đặc biệt của PostgreQuery. Mà sẽ trông giống như thế này:

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) 

Điều này sẽ tìm thấy khoảng cách tối thiểu lên đến 300 đơn vị. Vì vậy, trước tiên bạn phải kiểm tra dữ liệu của mình và tìm hiểu khoảng cách tối thiểu của bạn sẽ đạt được.



3

Cảm ơn cho đầu vào của mọi người. Cuối cùng tôi đã đi với sự kết hợp của các đề xuất của eprand và underdark. Mã cuối cùng tôi sử dụng là:

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;

Sau đó tôi đã tạo một sơ đồ voronoi trên lớp cửa hàng để xác nhận kết quả hoạt động chính xác, tất nhiên họ đã làm. Cảm ơn tất cả các công việc tuyệt vời!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.