PostGIS - Nhận một điểm trong một dòng hoặc đa giác


10

Tôi cần lấy điểm trung tâm của một đường hoặc đa giác để tạo markercho ứng dụng của mình. Vì vậy, khi bạn nhấp vào điểm đánh dấu, hình học xuất hiện (đường hoặc đa giác). Tôi đã sử dụng ST_Centroidđể làm cho nó hoạt động.

Kết quả là những gì tôi mong đợi không nhất định một số đa giác hoặc dòng mà centroid là ra khỏi hình học. Những gì tôi muốn cho các dòng hoặc đa giác là để có được "điểm trung tâm nhất" nhưng bên trong hình học.

Tôi có thể làm cái này như thế nào? Có một giải pháp?

Câu trả lời:


9

Từ tài liệu: ST_PointOnSurface - Trả về một ĐIỂM được đảm bảo nằm trên bề mặt.


4
Đối với các dòng ST_LineInterpolatePoint với phân số 0,5 phải là postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184

ST_PointOnSurface () hoạt động với Lines! (thx Postgis)
WKT

Đúng! Bạn đúng @ user30184 vì dường như đối với các dòng ST_PointOnSurface () có một điểm tùy ý, tôi không chắc chắn nhưng trong ví dụ tài liệu lấy điểm đầu tiên của LineString.
Jose Hermosilla Rodrigo

7

Trong trường hợp của tôi, tôi có mỗi hình học trong bảng Disctint. Những gì tôi đã làm là:

  1. Đối với dòng -> ST_LineInterpolatePoint()với 0,5 hệ số.
  2. Đối với đa giác -> Kiểm tra nếu ST_Centroid()nằm trong hình dạng của nó. Nếu vậy, ST_Centroid()là sự lựa chọn tốt nhất, nếu không tôi chọn PointOnSurface().

Đây là truy vấn:

SELECT
    CASE WHEN (SELECT the_geom FROM points WHERE gid = d.gid) IS NOT NULL
    THEN (SELECT the_geom FROM points WHERE gid = d.gid)
    WHEN (SELECT the_geom FROM lines WHERE gid = d.gid) IS NOT NULL
    THEN ST_LineInterpolatePoint((SELECT the_geom FROM lines WHERE gid = d.gid), 0.5)
    WHEN (SELECT the_geom FROM polygons WHERE gid = d.gid AND ST_Intersects(ST_Centroid(the_geom),the_geom)) IS NOT NULL
    THEN ST_Centroid((SELECT the_geom FROM polygons WHERE gid = d.gid))
    ELSE ST_PointOnSurface((SELECT the_geom FROM polygons WHERE gid = d.gid))
    END AS center
FROM someTable d

5
&& toán tử chỉ kiểm tra bbox. Bạn có thể muốn sử dụng ST_intersects ().
WKT

Bạn đúng. Tôi đã sai. Tôi sẽ cập nhật câu trả lời của tôi. Cảm ơn!
Jose Hermosilla Rodrigo
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.