返回包含所有輸入Geometry對象的凹包。

語法

geometry  ST_ConcaveHull(geometry  geomA , float  targetPercent , boolean  allowHoles);

參數

參數名稱 描述
geomA 目標Geometry對象。
targetPercent 在不斷地進行包收縮結束前,所能得到的凹包面積的占凸包面積的比例值。
allowHoles 是否允許帶孔的polygon對象,默認為false。

描述

  • 返回的Geometry對象的維度不會高于單例polygon對象。
  • 如果輸入對象是Point類型、LineString類型或者GeometryCollection 類型對象,使用函數ST_Collect,如果你的處理對象是Polygon類型對象,使用函數ST_Union,因為對于無效的Geometry對象,ST_ConcaveHull會失敗。
  • 參數target_percent的值越小,生成凹包的所需要的時間越長,也越可能導致拓撲異常,當然,獲得數值的精度也越高。一般的操作步驟為:
    • 首先嘗試0.99,通常會非常快,有時候和計算凸包一樣快。一般來說得到的對象占比會比99%小一些。
    • 慢慢的降低該值,直到滿意為止,當然,計算速度也會越來越慢。
  • 為了減小計算結果的數值精度,可以在使用函數ST_ConcaveHull后再使用函數ST_SimplifyPreserveTopology或ST_SnapToGrid 。函數ST_SnapToGrid稍微快一些,但有可能會導致無效的對象,函數ST_SimplifyPreserveTopology總是會驗證輸入Geometry對象的有效性,但會慢一些。
  • 該函數通常用于Multi和GeometryCollection類型對象。雖然該函數不是聚合函數,但你可以與函數ST_Collect 或 ST_Union 一起使用來獲得一個Point/LineString/Polygon對象集合的凹包,例如ST_ConcaveHull(ST_Collect(somepointfield),0.80)
  • 該函數計算凹包比計算凸包要慢很多,但是會更好地包圍Geometry對象,在圖像識別領域也很有用。

示例

原始圖形,targetPercent=0.99時的凹包圖形和targetPercent=0.98時的凹包圖形效果對比:
SELECT g,ST_ConcaveHull(g,0.99),ST_ConcaveHull(g,0.98),g from
    (select 'MULTIPOLYGON(((0 0,1 0,1 1,0 1,0 0)),((0 6,6 3,6 6,0 6)))'::geometry as g) as test
123