PostGIS ST_Buffer Bán kính Trợ giúp


9

Tôi đang cố gắng tìm tất cả các điểm trong bán kính năm dặm của một điểm nhất định. Tôi có một truy vấn như thế này:

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

Tôi không thể tìm ra những gì tôi đặt ở vị trí của ?(bán kính) để có được năm dặm. Mọi thứ đều nằm trong EPSG 4326 và theo tài liệu của PostGIS (tốt nhất tôi có thể nói), bán kính của tôi phải tính bằng mét. Nếu tôi đặt trong 12,070.0m (khoảng 5 dặm), tôi nhận được trận đấu nửa đường trên cả nước. Có ai biết tôi đang thiếu gì không?


4326 là dd (độ thập phân). 12070 là một khu vực khá lớn (bán kính) khi nó được chiếu dưới dạng latlon.
Brad Nesom

1
không chính xác - 12 070 mét = 7,49995029 dặm quá 5 dặm là 8046,72 mét như vậy (= 8046,72?) - là vị trí địa lý dữ liệu của bạn hoặc hình học?
Mapperz

Câu trả lời:


14

Bởi vì dữ liệu của bạn không được chiếu - đó là các điểm trên một hình cầu - khoảng cách tuyến tính không có ý nghĩa. Năm dặm tại đường xích đạo là một góc nhỏ hơn nhiều so với 5 dặm trên vòng tròn Bắc Cực. Nhưng may mắn là PostGIS (> = 1.5) có câu trả lời bạn đang tìm kiếm:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

Nó có một geographyloại được thiết kế cho loại điều này. Nó tương tự như hình học, nhưng nó chỉ sử dụng EPSG: 4326 và có rất ít chức năng hoạt động với nó.

Trong mẫu ở trên, tôi đã gọi ST_GeogFromText () (Ngoài ra còn có ST_GeographyFromText () và tôi không chắc có sự khác biệt nào không) về điểm quan tâm (nó có thể hoạt động với WKT thông thường, vì tham số SRID là dự phòng) và chuyển cột latlon sang loại địa lý. Nếu bạn đang thực hiện nhiều trong số này, có thể hiệu quả hơn khi tạo một cột địa lý trong bảng của bạn và bỏ qua toàn bộ diễn viên. Cuối cùng, ST_DWithin () có thể lấy tham số địa lý và nó thực hiện đúng với khoảng cách tuyến tính.


Tôi đánh giá cao sự giúp đỡ. Tôi vẫn còn khá mới với PostGIS.
Nik

4

có lẽ bạn muốn hàm ST_DWithin thay thế. xem ghi chú trong tài liệu st_buffer.
Bộ đệm

Mọi người thường mắc sai lầm khi sử dụng chức năng này để cố gắng thực hiện tìm kiếm bán kính. Tạo một bộ đệm để tìm kiếm bán kính là chậm và vô nghĩa. Sử dụng ST_DWithin thay thế.

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.