Làm cách nào tôi có thể tìm thấy một điểm bên trong đa giác trong PostGIS?


22

Làm cách nào tôi có thể tìm thấy một điểm được đảm bảo nằm trong một đa giác đã cho trong PostGIS?

Tôi nhận thức được ST_Centroidchức năng. Tuy nhiên, trọng tâm không phải luôn luôn nằm trong một đa giác, xem bên dưới:

một trung tâm nằm bên ngoài một đa giác

Hơn nữa, tôi muốn tránh sử dụng một điểm nằm trên ranh giới đa giác, mà chỉ muốn một điểm nằm trong ranh giới (chứ không phải bên trong một lỗ trong đa giác hình bánh rán).

Câu trả lời:


17

Nếu bạn đang tìm kiếm một chức năng PostGIS sẽ cho bạn biết một điểm nằm trong đa giác của bạn thì chức năng ST_PointOnSurface có thể cung cấp cho bạn những gì bạn cần.

SELECT 
   ST_AsText(ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry));

   st_astext
----------------
 POINT(2.5 2.5)
(1 row)

6

Tìm thấy chức năng này trên danh sách gửi thư của PostGIS. Tôi đoán đó là những gì bạn yêu cầu:

CREATE OR REPLACE FUNCTION point_inside_geometry(param_geom geometry)
  RETURNS geometry AS
$$
  DECLARE
     var_cent geometry := ST_Centroid(param_geom);
     var_result geometry := var_cent;
  BEGIN
  -- If the centroid is outside the geometry then 
  -- calculate a box around centroid that is guaranteed to intersect the geometry
  -- take the intersection of that and find point on surface of intersection
 IF NOT ST_Intersects(param_geom, var_cent) THEN
  var_result := ST_PointOnSurface(ST_Intersection(param_geom, ST_Expand(var_cent, ST_Distance(var_cent,param_geom)*2) ));
 END IF;
 RETURN var_result;
  END;
  $$
  LANGUAGE plpgsql IMMUTABLE STRICT
  COST 100;

Tôi thích rằng giải pháp này cung cấp một điểm gần với tâm hơn so với ST_PointOnSurface, nhưng nó cũng tạo ra một điểm gần với cạnh của đa giác hơn. ST_PointOnSurface dường như chọn một điểm càng xa các cạnh càng tốt. Tôi cho rằng đó là vấn đề của hương vị, theo như lựa chọn giải pháp phù hợp với bạn.
dslh
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.