Chọn hộp giới hạn bằng postGIS?


36

Tôi muốn tạo một truy vấn để chọn tất cả các cách và các nút của chúng tồn tại trong một hộp giới hạn bằng postGIS. Hộp giới hạn sẽ bao gồm tất cả các chi tiết dưới dạng lệnh "- hộp hướng dẫn" thẩm thấu sẽ lấy ra.

Có cách nào để làm điều đó?

Câu trả lời:


36

Đối với các tài liệu thẩm thấu, tôi thấy tùy chọn lệnh :

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

đối với PostGIS, bạn có thể sử dụng ST_MakeEn phong bì (trái, dưới, phải, trên, srid) để xây dựng một hộp giới hạn, sau đó &&toán tử hộp giới hạn để tìm nơi các hộp giới hạn giao nhau:

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

SRID 4326 dành cho WGS84 Lat / Long và chỉ được yêu cầu cho PostGIS 1.5; nó có thể được bỏ qua cho các phiên bản sau.


Cảm ơn. hàm ST_MakeEnvel cần thêm một tham số, srid. Tôi không biết phải đặt gì ở đó .. có ý kiến ​​gì không?
uriel

1
Có vẻ như bạn đang sử dụng PostGIS 1.5, yêu cầu tham số đó. Tôi nghĩ rằng SRID bị bỏ qua, vì vậy bất kỳ giá trị nào cũng có thể mang lại kết quả tương tự. Nếu bạn có dữ liệu trễ / dài, thường sử dụng SRID là 4326.
Mike T

1
Hầu hết các công cụ hiện nay cho phép bạn chọn SRID cho dữ liệu OSM khi bạn tải nó. OSM SRID mặc định là 3857 (bộ tạo hình cầu). SRID mặc định cho hầu hết dữ liệu lat / lon là SRID 4326 (Lat / Lon AKA WGS84). Ví dụ: nếu bạn tải dữ liệu bằng SRID 3857, bạn sẽ phải thực hiện chuyển đổi từ LAT / LON WGS84 thành 3857: ST_Transform (ST_MakeEn phong bì (LON1, LAT1, LON2, LAT2, 4326), 3857) hiện tại chỉ hỗ trợ SRID 3857
Justin Swanhart

Lưu ý toán tử && không chuyển đổi SRID cho bạn. Hãy chắc chắn rằng Phong bì bạn thực hiện có cùng SRID với hình dạng thử nghiệm, nếu không thì tự biến đổi nó. trac.osgeo.org/postgis/ticket/2320
Nelson

1
Toán tử && chậm hơn so với ST_Intersects
caiohamamura

8

Tôi nghĩ nó sẽ giống như thế này: Hộp giới hạn trong PostGIS được tạo bởi

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

Truy vấn sẽ sử dụng ST_Intersection với truy vấn con.

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

Tôi ít nhiều đã lấy điều này từ các trang trợ giúp của PostGIS
Một truy vấn thứ hai, trên bảng cách, được thiết kế tương tự như trên (nhưng với ST_Dimension () = 1) sẽ có được các cách.

HTH, Micha


Xin chào, cảm ơn! những gì srid? Tôi cần chèn shoul nào trong <srid>? và ".geom" (dòng 4) có vẻ như không hợp lệ, nó có nên ở đó không?
uriel

Xin lỗi, tôi đã bỏ lỡ bình luận của bạn từ tuần trước. Srid là mã hệ thống tham chiếu tọa độ. tức là năm 2039 đối với Israel. Bổ sung .geom trích xuất phần Hình học của "Hình học. Bạn có thể đúng rằng không bắt buộc ở đây.
Micha

5

có một chủ đề ở đây tương tự như câu hỏi của bạn ở đây ...

ST_Intersection - (T) Trả về hình học đại diện cho phần được chia sẻ của geomA và geomB. Việc thực hiện địa lý thực hiện chuyển đổi thành hình học để thực hiện giao cắt và sau đó chuyển đổi trở lại WGS84.

1. bạn cũng có thể nhận được một số thông tin ở đây về Hàm xây dựng hình học.

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

ngã tư

2.Một thông tin khác ở đây về Giao lộ Giao lộ: PostGIS - ST_Intersects, ST_Intersection ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

ngã tư

Tôi hy vọng nó sẽ giúp bạn...


0

Đây là một nhận xét về mã của @ Micha.

Các cặp tọa độ cho POLYGONtheo thứ tự theo chiều kim đồng hồ (hoặc ngược chiều kim đồng hồ): phía trên bên trái, phía trên bên phải, phía dưới bên phải, phía dưới bên trái, phía trên bên trái một lần nữa.

Vì vậy, theo chiều kim đồng hồ, chức năng gọi phải là:

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

Hoặc ngược chiều kim đồng hồ:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
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.