Comment trouver un point à l'intérieur d'un polygone dans PostGIS?


22

Comment puis-je trouver un point qui est garanti dans un polygone donné dans PostGIS?

Je connais la ST_Centroidfonction. Cependant, le centroïde n'est pas toujours dans un polygone, voir ci-dessous:

un centroïde se trouvant à l'extérieur d'un polygone

De plus, je voudrais éviter d'utiliser un point qui se trouve sur la limite du polygone, mais plutôt en vouloir un qui est à l'intérieur de la limite (et non à l'intérieur d'un trou dans des polygones en forme de beignet).

Réponses:


17

Si vous recherchez une fonction PostGIS qui vous indiquera un point à l'intérieur de votre polygone, la fonction ST_PointOnSurface peut vous donner ce dont vous avez besoin.

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

Trouvé cette fonction sur la liste de diffusion PostGIS. Je suppose que c'est ce dont vous avez besoin:

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;

J'aime que cette solution donne un point qui est plus proche du centroïde que ST_PointOnSurface en soi, mais elle produit également un point qui est plus proche du bord du polygone. ST_PointOnSurface semble choisir un point aussi éloigné que possible des bords. Je suppose que c'est une question de goût, en ce qui concerne le choix de la solution qui vous convient.
dslh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.