Làm cách nào để tạo sơ đồ nhện (đường trung tâm) trong PostGIS?


8

Tôi còn khá mới mẻ với PostGIS nhưng tôi đã đọc rất nhiều. Một điều mà tôi đã tìm kiếm là một chức năng cho phép người dùng tạo ra một "sơ đồ nhện" (còn được gọi là "đường mong muốn" hoặc "đường trung tâm") trong PostGIS.

Ví dụ: vẽ các đường từ một cửa hàng tạp hóa (điểm) đến tất cả các địa chỉ khách hàng được mã hóa địa lý (điểm) của cửa hàng tạp hóa đó. Tất nhiên, mặc dù, hãy tưởng tượng rằng có hàng trăm cửa hàng và hàng ngàn khách hàng. Tôi sẽ tưởng tượng rằng mỗi cửa hàng sẽ có một ID duy nhất mà mỗi điểm khách hàng sẽ được nhúng trong một trường để phần mềm biết kết nối điểm gốc.

Có một hàm ST_ đơn giản sẽ hoàn thành nhiệm vụ này không, hay điều này đòi hỏi phải kết hợp nhiều truy vấn để hoàn thành nhiệm vụ?

Câu trả lời:


9

Giả sử rằng lược đồ cơ sở dữ liệu của bạn trông như thế này:

table customer:                     table shops:
customer_id | shop_id | the_geom    shop_id | the_geom
--------------------------------    ------------------
       1000 |     100 |    ...          100 |    ...
       1001 |     100 |    ...          101 |    ...
       1002 |     101 |    ...

Câu lệnh sau sẽ tạo một "sơ đồ nhện" cho cửa hàng 100:

SELECT c.customer_id, c.shop_id, ST_MakeLine(c.the_geom,s.the_geom)
FROM customer as c JOIN shops as s
     ON c.shop_id = s.shop_id
WHERE shop_id = 100

Tài liệu: http://postgis.net/docs/ST_MakeLine.html


Mã này đã làm việc hoàn hảo lần đầu tiên. Điều duy nhất tôi xóa là câu lệnh WHERE, vì tôi muốn tạo dòng từ tất cả khách hàng đến tất cả các cửa hàng. Thông minh!
RyanKDalton

9

Câu hỏi ít nhiều đã được trả lời, tôi chỉ muốn thêm một vài bình luận để chỉ ra sự linh hoạt và sức mạnh của việc làm những việc như thế này với sql không gian

Khi tôi đọc câu hỏi, nó có thể được chia thành hai câu hỏi. Một câu hỏi GIS và một câu hỏi sql về cách kết hợp các hàng trong các bảng khác nhau.

Phần gis có thể được đề cập trước khi được giải quyết tốt nhất với ST_MakeLine, nếu đó là hai điểm mà bạn muốn kết nối với dòng của mình. Nếu đó là các đường hoặc đa giác, bạn có thể sử dụng ST_Shortestline thay vào đó để lấy một đường từ hình học giữa các điểm gần nhất của chúng. Điều đó sẽ làm việc với cả điểm, đường và đa giác.

Phần khác là về cách kết nối đúng điểm lưu trữ với điểm khách hàng phù hợp.

Đó là một câu hỏi cơ sở dữ liệu cơ bản. Hiểu được điều đó sẽ mang lại nhiều niềm vui hơn khi sử dụng PostGIS.

Tình huống dễ dàng nhất là một cửa hàng có nhiều khách hàng. Sau đó, bạn chỉ cần một bảng khách hàng và điểm cửa hàng của bạn và nó sẽ trông giống như:

Select ST_Makeline(customers.the_geom, yourPoint) from custmers;

Nếu bạn có cửa hàng duy nhất của bạn trong một bảng, nó sẽ trông như thế này:

Select ST_Makeline(customers.the_geom, stores.the_geom) from custmers, stores;

Nhưng nếu có nhiều cửa hàng và mỗi khách hàng chỉ sử dụng một cửa hàng, bạn sẽ nhận được một giải pháp giống như các câu trả lời khác ở đây, ví dụ:

Select ST_Makeline(customers.the_geom, stores.the_geom) 
 from custmers, stores
   where customers.storeid = stores.id;

PostgreSQL sẽ xử lý truy vấn đó giống như:

    Select ST_Makeline(customers.the_geom, stores.the_geom) 
     from custmers inner join stores 
      on customers.storeid = stores.id;

Nhưng trong thế giới thực, bạn có thể sẽ gặp phải tình huống hầu hết khách hàng đang sử dụng nhiều cửa hàng. Trong các ví dụ trước đây, chúng tôi đã có mối quan hệ một cửa hàng với nhiều khách hàng, bây giờ chúng tôi có nhiều tình huống. Nhiều khách hàng sử dụng nhiều cửa hàng.

Sau đó, có một giải pháp tồi tệ mà đôi khi bạn nhìn thấy. Mọi người thêm một hàng khách hàng mới cho mỗi cửa hàng anh ta sử dụng. Điều đó sẽ gây ra nhiều vấn đề nếu bạn muốn thay đổi địa chỉ của anh ấy, bạn phải làm điều đó ở nhiều nơi. Cơ sở dữ liệu chính xác hơn để làm điều đó là tạo một "bảng liên kết". Tôi không biết đó có phải là từ đúng trong tiếng Anh hay không. Đó là một bảng chứa tất cả dữ liệu cụ thể cho mối quan hệ khách hàng với mỗi cửa hàng anh ta sử dụng. Vì vậy, sau đó bạn có ba bảng. Một với các cửa hàng và tất cả các thuộc tính thuộc về cửa hàng như khi nó được mở và số điện thoại để liên lạc. Sau đó, bạn có bảng khách hàng có thể với địa chỉ và số điện thoại cho khách hàng. Sau đó, bạn có "bảng liên kết" này bao gồm một id cho cửa hàng, id cho khách hàng và có thể thêm thông tin như tần suất ghé thăm cửa hàng cụ thể đó, hoặc khoảng cách đến cửa hàng, hoặc dòng này bạn đang tạo (nhưng khoảng cách và dòng tốt hơn để tạo khi bạn cần). Sau đó, với bảng mới này, truy vấn của bạn sẽ trông giống như:

Select ST_Makeline(customers.the_geom, stores.the_geom) 
  from customers inner join  
     c_s_link_table on customers.id = c_s_link_table.customerid 
     inner join stores 
     on c_s_link_table.storeid = stores.id;

Sau đó, bạn có sự linh hoạt đầy đủ. Ví dụ, giả sử bạn thêm vào liên kết của mình bao nhiêu lần một tháng khách hàng ghé thăm cửa hàng đó. Sau đó, bạn có thể viết một truy vấn như thế này:

Select ST_Makeline(customers.the_geom, stores.the_geom), 
c_s_link_table.visits_per_month from
 customers inner join c_s_link_table on customers.id = c_s_link_table.customerid 
  inner join stores on c_s_link_table.storeid = stores.id;

sau đó, bạn có thể sử dụng thuộc tính đó, Visit_per_month để xác định độ dày của các dòng trên bản đồ minh họa số lượt truy cập mà mỗi cửa hàng nhận được.


4

Một cách để thực hiện digram nhện trong PostGIS là sử dụng hàm ST_MakeLine . Xem ví dụ dưới đây:

SELECT ST_MakeLine(a.the_geom, b.the_geom), a.id as customer_id, a.store_id 
FROM customers a, stores b WHERE a.store_id = b.id

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.