¿Cómo puedo encontrar un punto dentro de un polígono en PostGIS?

22

¿Cómo puedo encontrar un punto que esté garantizado dentro de un polígono dado en PostGIS?

Soy consciente de la ST_Centroidfunción. Sin embargo, el centroide no siempre está dentro de un polígono, vea a continuación:

un centroide que yace fuera de un polígono

Además, me gustaría evitar usar un punto que esté en el límite del polígono, pero prefiero uno que esté dentro del límite (y no dentro de un agujero en los polígonos en forma de rosquilla).

fmark
fuente

Respuestas:

17

Si está buscando una función PostGIS que le dirá un punto que está dentro de su polígono, entonces la función ST_PointOnSurface puede darle lo que necesita.

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)
Ian Dodd
fuente
6

Encontré esta función en la lista de correo de PostGIS. Supongo que es lo que necesitas:

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;
Skinkie
fuente
Me gusta que esta solución proporcione un punto que esté más cerca del centroide que ST_PointOnSurface por sí mismo, pero también produce un punto que está más cerca del borde del polígono. ST_PointOnSurface parece elegir un punto lo más alejado posible de los bordes. Supongo que es cuestión de gustos, en cuanto a elegir la solución adecuada para usted.
dslh