2013-12-11 19 views
0

我有一張表格,其中包含了GIS客戶端中正常顯示的點幾何圖形。我想將屬性上的點(groupid)分組,並在這些屬性周圍創建凸包。看起來很簡單,但得到了意想不到的結果:一個包含點,線條和多邊形的「幾何」字段。我只期待多邊形,也許對於計數爲1的組被忽略。有任何想法嗎?ST_ConvexHull(ST_Collect(pointgeom))返回點,線串和多邊形

查詢:

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

回答

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

對不起,接受和謝謝你的答案。這是訣竅;現在顯而易見 - 有一天必須坐下來閱讀所有ST_函數(例如ST_GeometryType)! – kgeo

+0

是的,閱讀這些文檔非常值得,但需要一段時間 - 他們不斷添加新功能:-) –

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

+0

我不知道這真的回答瞭如何確保他們都是這同排除只有一個成員的類型或組。 –

+0

@JohnBarça我回答了問題的一部分,詢問爲什麼結果可能是點,線和多邊形的混合。 – underdark

+0

正確,downvote刪除。 –