PostGISでポリゴン内のポイントを見つけるにはどうすればよいですか?


22

PostGISの特定のポリゴン内にあることが保証されているポイントを見つけるにはどうすればよいですか?

私はST_Centroid機能を知っています。ただし、重心は常にポリゴン内にあるとは限りません。以下を参照してください。

ポリゴンの外側にある重心

さらに、多角形の境界上にある点の使用を避けたいのですが、境界内にある(ドーナツ型の多角形の穴内にはない)点が必要です。

回答:


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.