返回包含所有输入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