Come posso trovare un punto all'interno di un poligono in PostGIS?


22

Come posso trovare un punto garantito in un determinato poligono in PostGIS?

Sono a conoscenza della ST_Centroidfunzione. Tuttavia, il centroide non è sempre all'interno di un poligono, vedere di seguito:

un centroide che giace all'esterno di un poligono

Inoltre, vorrei evitare di usare un punto che si trova sul confine del poligono, ma piuttosto ne voglio uno che si trovi all'interno del confine (e non all'interno di un buco nei poligoni a forma di ciambella).

Risposte:


17

Se stai cercando una funzione PostGIS che ti dirà un punto all'interno del tuo poligono, la funzione ST_PointOnSurface potrebbe darti ciò di cui hai bisogno.

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

Ho trovato questa funzione nella mailing list di PostGIS. Immagino sia ciò di cui hai bisogno:

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;

Mi piace che questa soluzione dia un punto più vicino al centroide rispetto a ST_PointOnSurface da solo, ma produce anche un punto più vicino al bordo del poligono. ST_PointOnSurface sembra scegliere un punto il più lontano possibile dai bordi. Suppongo sia una questione di gusti, per quanto riguarda la scelta della soluzione giusta per te.
dslh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.