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).

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)

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;

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.