Bagaimana saya bisa menemukan titik di dalam poligon di PostGIS?


22

Bagaimana saya bisa menemukan titik yang dijamin berada dalam poligon tertentu di PostGIS?

Saya mengetahui ST_Centroidfungsinya. Namun, centroid tidak selalu berada dalam poligon, lihat di bawah:

sebuah centroid yang terletak di luar poligon

Selain itu, saya ingin menghindari menggunakan titik yang ada di batas poligon, tetapi ingin yang ada di dalam batas (dan tidak di dalam lubang di poligon berbentuk donat).

Jawaban:


17

Jika Anda mencari fungsi PostGIS yang akan memberi tahu Anda titik yang ada di dalam poligon Anda, maka fungsi ST_PointOnSurface dapat memberi Anda apa yang Anda butuhkan.

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

Menemukan fungsi ini di milis PostGIS. Saya kira itulah yang Anda butuhkan:

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;

Saya suka bahwa solusi ini memberikan titik yang lebih dekat ke pusat massa daripada ST_PointOnSurface dengan sendirinya, tetapi juga menghasilkan titik yang lebih dekat ke tepi poligon. ST_PointOnSurface tampaknya memilih titik yang sejauh mungkin dari sisi mana pun. Saya kira ini masalah selera, sejauh memilih solusi yang tepat untuk Anda.
dslh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.