ST_ConvexHull(ST_Collect(pointgeom))返回点,线串和多边形

时间:2013-12-11 00:01:25

标签: postgis convex-hull

我有一个完整的点几何图表,可以在GIS客户端中正常显示。我想对属性(groupid)上的点进行分组,并围绕这些点创建凸包。看起来很简单,但获得了意想不到的结果:一个混合了点,线串和多边形的“几何”字段。我只期待多边形,也许对于计数为1的组可能会被忽略。有什么想法吗?

查询:

SELECT groupid, ST_ConvexHull(ST_Collect(geom))) As hull_geom into hulledpoints
    FROM somepoints
    GROUP BY groupid;

2 个答案:

答案 0 :(得分:2)

确保只有多边形的最简单方法是确保只采用groupid计数大于2的组的凸包。

SELECT groupid, ST_ConvexHull(ST_Collect(geom))) As hull_geom into hulledpoints
FROM somepoints
GROUP BY groupid
HAVING count(groupid)>2;

这是因为两个点的凸包是一个线串,而一个点的凸包是同一个点,例如,

select ST_AsText(ST_ConvexHull(ST_Collect(St_MakePoint(1,1),St_MakePoint(2,2))));

返回LINESTRING(1 1,2 2)。

如果你想使用几何而不是sql方法,你可以检查返回的船体是多边形。以下示例不返回任何内容,因为虽然有三个点,但两个是重合的,因此凸包仍然是一个线串。

with hulls as (select ST_ConvexHull(ST_Collect(Array[St_MakePoint(1,1),
  St_MakePoint(2,2), St_MakePoint(2,2)])) as hull)
select * from hulls where ST_GeometryType(hull)='ST_Polygon';

在原始示例中,您将按照

的方式编写上述查询
with hulls as (SELECT groupid, ST_ConvexHull(ST_Collect(geom)) As hull_geom 
  FROM somepoints  GROUP BY groupid)
select * from hulls where ST_GeometryType(hull_geom)='ST_Polygon';

答案 1 :(得分:1)

广告

  

“获得意想不到的结果:'几何'字段混合了点,线串和多边形。”

这很容易测试:一个点的凸包是一个点

select st_astext(st_convexhull(st_makepoint(1,2)))

st_astext
POINT(1 2)

两点,这是一行

select st_astext(st_convexhull(st_collect(st_makepoint(1,2),st_makepoint(2,2))))

st_astext
LINESTRING(1 2,2 2)

如果您有更多与GIS相关的问题,请随时在http://gis.stackexchange.com发帖。