Có chức năng PostGIS để xác định xem một dòng có giao nhau không?


16

Tôi đã tìm kiếm một chức năng có thể cho tôi biết nếu LineString giao nhau. Tôi đã thử gọi st_intersectsvới cùng một LineString hai lần, nhưng rõ ràng các dòng giống hệt nhau sẽ giao nhau. Kế hoạch của tôi nếu không có chức năng nào là lấy tất cả các điểm trong chuỗi dòng và tạo các chuỗi riêng lẻ và sau đó kiểm tra từng dòng mới với nhau bằng st_intersects. Tôi không muốn nó đến với điều này, nhưng tôi sợ nó sẽ xảy ra.

Vì vậy, có bất kỳ chức năng PostGIS nào để kiểm tra xem một linestring có tự giao nhau không? Nó tương tự như việc tìm hiểu xem một đa giác có phức tạp không


Có một câu trả lời thứ hai ở đây không giúp tôi PostGIS khôn ngoan, nhưng nó có chứa một liên kết đến một số thông tin hữu ích về vấn đề nói chung. Có vẻ như nó đã bị xóa. Có ai có liên kết đó?
Jeff

Câu trả lời:


14

Bạn có thể kiểm tra một linestring tự giao với ST_IsSimple(geom):

SELECT ST_IsSimple('LINESTRING (50 50, 150 150, 50 150, 150 50)');
 st_issimple
-------------
 f
(1 row)

Tự giao nhau tại POINT (100.0 100.0)

Hình ảnh bên trên và chú thích bên dưới là từ JTS TestBuilder (nhấp vào "Đơn giản?")

Tự giao nhau tại POINT ( 100.0 100.0 )

Điều này có thể được sửa với ST_UnaryUnion(geom)(kể từ PostGIS 2.0), trả về đa tuyến ba mảnh hợp lệ / đơn giản:

MULTILINESTRING((50 50, 100 100), 
  (100 100, 150 150, 50 150, 100 100), 
  (100 100, 150 50))

Đây là hoàn hảo! Tôi biết câu trả lời phải thật đơn giản. Bạn nói rằng bạn đã sử dụng JTS Testbuilder để tạo hình ảnh. Có cách nào bạn biết trong Postgis để lấy điểm / điểm giao nhau không?
Jeff

Đó là chi tiết đầy thách thức. JTS TestBuilder có CheckNoding, nhưng điều này chỉ tìm thấy một tọa độ nút cho mỗi cuộc gọi, thay vì MULTIPOINT. Tôi không chắc chắn chính xác làm thế nào để có được (các) điểm mã hóa với PostGIS.
Mike T
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.