2009-12-09 40 views
15

Tôi đang sử dụng PostgreSQL với phần mở rộng GIS để lưu trữ dữ liệu bản đồ, cùng với OpenLayers, GeoServer, vv .. Cho một đa giác, ví dụ: của một vùng lân cận, tôi cần phải tìm tất cả các điểm LAT/LONG được lưu trữ trong một số bảng (ví dụ: đèn giao thông, nhà hàng) nằm trong đa giác. Ngoài ra, được đưa ra một tập hợp các đa giác tôi muốn tìm tập các điểm trong mỗi đa giác (như truy vấn GROUP BY, thay vì sau đó lặp qua từng đa giác).Trong PostGIS, làm cách nào để tìm tất cả các điểm trong một đa giác?

Có phải những chức năng này tôi cần để lập trình hay chức năng có sẵn (như SQL mở rộng) không? Xin hãy giải thích.

Cũng cho dữ liệu 2D đơn giản mà tôi có, tôi thực sự cần phần mở rộng GIS (giấy phép GPL là giới hạn) hay PostgreSQL sẽ đủ?

Cảm ơn!

Trả lời

11

Trong bài đăngGIS bạn có thể sử dụng toán tử hộp giới hạn để tìm các ứng cử viên, rất hiệu quả vì nó sử dụng các chỉ mục GiST. Sau đó, nếu yêu cầu kết quả khớp nghiêm ngặt, hãy sử dụng toán tử chứa.

Something như

SELECT 
    points,neighborhood_name from points_table,neighborhood 
WHERE 
    neighborhood_poly && points /* Uses GiST index with the polygon's bounding box */ 
AND 
    ST_Contains(neighborhood_poly,points); /* Uses exact matching */ 

Về nếu điều này là cần thiết, phụ thuộc vào yêu cầu của bạn. Để làm việc ở trên bạn chắc chắn cần cài đặt PostGIS và GEOS. Tuy nhiên, nếu kết hợp hộp kết hợp là đủ, bạn có thể mã nó đơn giản trong SQL không cần PostGIS.

Nếu kết hợp chính xác là bắt buộc, có chứa các thuật toán công khai, nhưng để triển khai chúng một cách hiệu quả đòi hỏi một số nỗ lực triển khai nó trong thư viện mà sau đó sẽ được gọi từ SQL (giống như GEOS).

+1

Xem thêm [ST_DWithin] (http://www.postgis.org/docs/ST_DWithin.html). –

4

Tôi tin ST_Contains tự động ghi đè các truy vấn để sử dụng các ý chính lập chỉ mục hộp bounding, vì nó nhấn mạnh:

"gọi hàm này sẽ tự động bao gồm một so sánh hộp bounding rằng sẽ tận dụng bất kỳ chỉ mục là có sẵn trên hình học. Để tránh sử dụng chỉ mục , hãy sử dụng hàm _ST_Contains. "

http://postgis.refractions.net/docs/ST_Contains.html

+0

Đây là một bình luận nhiều hơn là một câu trả lời. – RickyA

+0

Đó là câu trả lời theo SO FAQ. – IamIC

2

ST_Contains sẽ giải quyết vấn đề của bạn.

SELECT 
polygon.gid, points.x, points.y 
FROM 
    polygons LEFT JOIN points 
ON st_contains(polygon.geom, points.geom) 
WHERE 
    polygon.gid=your_id 
Các vấn đề liên quan