Como posso encontrar um ponto dentro de um polígono no PostGIS?

22

Como posso encontrar um ponto que é garantido dentro de um determinado polígono no PostGIS?

Estou ciente da ST_Centroidfunção. No entanto, o centróide nem sempre está dentro de um polígono, veja abaixo:

um centróide deitado fora de um polígono

Além disso, eu gostaria de evitar o uso de um ponto que esteja no limite do polígono, mas quero um que esteja dentro do limite (e não dentro de um buraco nos polígonos em forma de anel).

fmark
fonte

Respostas:

17

Se você estiver procurando por uma função PostGIS que indique um ponto dentro do polígono, a função ST_PointOnSurface poderá fornecer o que você precisa.

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
fonte
6

Encontrei esta função na lista de discussão do PostGIS. Eu acho que é o que você precisa:

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
fonte
Eu gosto que esta solução dê um ponto que está mais próximo do centróide do que o ST_PointOnSurface por si só, mas também produz um ponto que está mais próximo da borda do polígono. ST_PointOnSurface parece escolher um ponto o mais distante possível de todas as arestas. Suponho que seja uma questão de gosto, tanto quanto escolher a solução certa para você.
precisa