2012-04-23 32 views
8

Tôi có vấn đề như vậy và tôi sẽ tốt đẹp Nếu ai đó có thể giúp tôi. Tôi có bảng điểm với chỉ số GIST. Những điểm đó không thay đổi theo thời gian.Tìm các điểm gần nhất dọc theo đường kẻ trong giới hạn khoảng cách được chỉ định và đặt hàng

Tôi muốn tìm nạp các điểm gần một số linestring nhất định. Ví dụ: Hãy tưởng tượng rằng linestring là đường và các điểm được poi dọc theo con đường. Tôi muốn lấy poi's nằm trong khoảng cách 5 km từ con đường đã cho. Tôi muốn lấy những pois theo thứ tự đúng (thứ tự lái xe dọc theo con đường). Nhìn vào hình ảnh:

image

Đối với đường cho từ điểm 1-5 tôi muốn lấy POI đó là trong vòng 5 km max từ đường và theo thứ tự từ điểm 1-5 dọc đường. Vì vậy, kết quả nên là:

POI_ID 
1 
5 
6 
8 
9 
10 
12 
13 

Điều này sẽ cho tôi biết tôi có thể ghé qua POI khi đi dọc theo con đường với chi phí tối thiểu.

Có ai có một số ý tưởng làm thế nào để làm điều đó với postgres và postgis?

Trả lời

8

Giả sử bạn có các cột hình học geom rằng sử dụng một SRID dự mét trong bảng road (chuỗi đường) và poi (POINT), truy vấn của bạn để tìm tất cả POI trong vòng 5 km đường (nơi id = 123) nên được một cái gì đó như:

SELECT poi.*, ST_Distance(road.geom, poi.geom)/1000.0 AS distance_km 
FROM road, poi 
WHERE road.id = 123 AND ST_DWithin(road.geom, poi.geom, 5000.0) 
ORDER BY ST_LineLocatePoint(road.geom, poi.geom), 
     ST_Distance(road.geom, poi.geom); 

các ORDER phần đầu tiên với ST_LineLocatePoint sử dụng một phần nhỏ giữa 0.0 và 1.0, tùy thuộc nơi điểm là dọc theo chuỗi đường. Nếu hướng của đường đi "sai hướng", sau đó nối thêm DESC để đảo ngược thứ tự. Phần ORDER thứ hai được dựa trên khoảng cách, có thể được sử dụng nếu điểm vượt quá điểm bắt đầu/kết thúc của LINESTRING (trong đó ST_LineLocatePoint sẽ trả về 0.0 hoặc 1.0, tương ứng).

Truy vấn này cũng có thể hoạt động nếu bạn đang sử dụng loại geography với giá trị Long/Latitude, vì nó tự động tính toán mét - chứ không phải độ. Kiểm tra tài liệu để biết thêm:

+0

Cám ơn câu trả lời của bạn. Tôi nghĩ rằng điều này sẽ không hoạt động bởi vì trật tự sẽ sai. Nếu đường (linestring) với id = 123 có điểm 1,2,3,4 tôi muốn lấy điểm (pois) để bạn sẽ được đi dọc theo đường để poi gần nhất gần điểm 1, sau đó 2, 3 và kết thúc bởi điểm cuối cùng của linestring 4. –

+0

Tôi hiểu rồi, hãy cập nhật câu trả lời để sử dụng 'ST_Line_Locate_Point'. –

+0

Tôi sẽ thử bạn của tôi :) Tôi cũng cập nhật câu hỏi để dễ hiểu hơn. –

Các vấn đề liên quan