Wie finde ich einen Punkt in einem Polygon in PostGIS?

22

Wie finde ich in PostGIS einen Punkt, der garantiert innerhalb eines bestimmten Polygons liegt?

Ich bin mir der ST_CentroidFunktion bewusst . Der Schwerpunkt liegt jedoch nicht immer innerhalb eines Polygons, siehe unten:

ein Schwerpunkt, der außerhalb eines Polygons liegt

Außerdem möchte ich vermeiden, einen Punkt auf der Polygongrenze zu verwenden, sondern einen Punkt innerhalb der Grenze (und nicht innerhalb eines Lochs in ringförmigen Polygonen).

fmark
quelle

Antworten:

17

Wenn Sie nach einer PostGIS-Funktion suchen, die Ihnen einen Punkt in Ihrem Polygon anzeigt, bietet Ihnen die Funktion ST_PointOnSurface möglicherweise das, was Sie benötigen.

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

Fand diese Funktion auf der PostGIS Mailingliste. Ich denke, es ist das, was Sie benötigen:

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
quelle
Mir gefällt, dass diese Lösung einen Punkt liefert, der näher am Schwerpunkt liegt als ST_PointOnSurface an sich, aber auch einen Punkt erzeugt, der näher am Rand des Polygons liegt. ST_PointOnSurface scheint einen Punkt zu wählen, der so weit wie möglich von Kanten entfernt ist. Ich nehme an, es ist Geschmackssache, die richtige Lösung für Sie zu wählen.
dslh