Làm thế nào để có được khoảng cách & mang giữa một điểm và phần gần nhất của đa giác?


9

Tôi còn khá mới để viết SQL và sử dụng PostGIS vì vậy xin lỗi nếu điều này có vẻ hơi đơn giản hoặc rõ ràng. Tôi có một bảng các tính năng đa giác được giữ trong cơ sở dữ liệu postGIS và tôi cần viết một truy vấn SQL để chọn tất cả các thuộc tính, khoảng cách và hướng của các tính năng đa giác trong một khoảng cách nhất định của một điểm được xác định trước. Tôi đã quản lý để chọn các tính năng và tính toán khoảng cách (sử dụng ST_Distance) nhưng không thể tìm ra cách lấy ổ đỡ.

Đây là kịch bản tôi đang sử dụng cho đến nay:

SELECT *,
  ST_Distance (Geometry, ST_GeomFromText ('POINT(292596 90785)', 27700))
FROM mytable
WHERE
  ST_DWithin(
    Geometry,
    ST_GeomFromText('POINT(292596 90785)', 27700),
    250) 

Làm thế nào để tôi tìm ra mang các tính năng cũng như khoảng cách?

Câu trả lời:


4

Bạn có thể sử dụng ST_Azimuth để tính toán ổ trục, nhưng chỉ mất điểm hình học làm tham số, vì vậy bạn phải quyết định ổ trục nào bạn thực sự muốn.

Bạn có thể chọn dòng ngắn nhất như @Nicklas đã đề xuất (đó là dòng có khoảng cách bạn đã tính toán), điều này có ý nghĩa nếu bạn cần "hướng" nhanh nhất để đến đa giác. Đối với bất cứ điều gì khác, tôi khuyên bạn nên tính toán nó dựa vào đa giác trung tâm (ST_Centroid), sẽ cho kết quả tốt hơn cho các hình dạng tùy ý.


2

Sử dụng

ST_Azimuth (ST_Shortestline (geom1, geom2))

biên tập

Tôi mới nhận ra rằng ST_Azimuth không lấy một dòng dõi như argumetn nên bạn sẽ cần cho nó hai điểm thay thế.

Nếu một trong những hình học là một điểm thì bạn có thể sử dụng trực tiếp và sử dụng ST_ClosestPoint để lấy điểm trên đa giác.


1

ST_Azimuth là chức năng bạn muốn. Nó trả về góc theo radian theo chiều kim đồng hồ từ phía bắc. Như mẫu trên ST_Azimuth()trang hiển thị, chỉ cần gói nó trong degrees()hàm sẽ cung cấp cho bạn góc theo độ nếu đó là những gì bạn cần.

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.