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.