如何在PostGIS中的多边形内找到点?


22

如何找到保证在PostGIS中给定多边形内的点?

我知道这个ST_Centroid功能。但是,质心并不总是在多边形内,请参见下文:

多边形外的质心

此外,我想避免使用一个在多边形边界上的点,而是想要一个在边界内的点(而不是在甜甜圈形多边形的孔内)。

Answers:


17

如果您正在寻找一个PostGIS函数,该函数将告诉您多边形内的点,则ST_PointOnSurface函数可能会为您提供所需的信息。

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

在PostGIS邮件列表中找到此功能。我想这就是您的要求:

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;

我喜欢这种解决方案,其点本身比ST_PointOnSurface更靠近质心,但它的确产生一个更靠近多边形边缘的点。ST_PointOnSurface似乎选择了一个尽可能远离任何边缘的点。我认为这是一个品味问题,就为您选择合适的解决方案而言。
dslh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.