,以確保你只有多邊形的最簡單方法是,以確保您只需要羣體的凸包,其中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';
對不起,接受和謝謝你的答案。這是訣竅;現在顯而易見 - 有一天必須坐下來閱讀所有ST_函數(例如ST_GeometryType)! – kgeo
是的,閱讀這些文檔非常值得,但需要一段時間 - 他們不斷添加新功能:-) –