我有一个完整的点几何图表,可以在GIS客户端中正常显示。我想对属性(groupid)上的点进行分组,并围绕这些点创建凸包。看起来很简单,但获得了意想不到的结果:一个混合了点,线串和多边形的“几何”字段。我只期待多边形,也许对于计数为1的组可能会被忽略。有什么想法吗?
查询:
SELECT groupid, ST_ConvexHull(ST_Collect(geom))) As hull_geom into hulledpoints
FROM somepoints
GROUP BY groupid;
答案 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发帖。