ST_HausdorffDistance — 返回两个几何对象之间的 Hausdorff 距离。
float ST_HausdorffDistance(
geometry g1, geometry g2)
;
float ST_HausdorffDistance(
geometry g1, geometry g2, float densifyFrac)
;
返回两个几何对象之间的Hausdorff 距离。 Hausdorff 距离衡量的是两个几何对象之间的相似或差异程度。
该函数实际上计算的是“离散 Hausdorff 距离”。这是在几何对象上的离散点计算出的 Hausdorff 距离。可以指定densifyFrac
参数,通过在计算离散 Hausdorff 距离之前细化线段来提供更准确的答案。每个线段被分成若干个等长的子线段,这些子线段的长度与线段长度的比值最接近给定的比例。
单位与几何对象的空间参考系统单位相同。
此算法不等同于标准的 Hausdorff 距离。但是,它计算出的近似值在很大一部分有用情况下是正确的。一个重要的例子是彼此大致平行且长度大致相等的线串。这对于线匹配来说是一个有用的度量。 |
可用性:1.5.0
SELECT ST_HausdorffDistance(geomA, geomB), ST_Distance(geomA, geomB) FROM (SELECT 'LINESTRING (20 70, 70 60, 110 70, 170 70)'::geometry AS geomA, 'LINESTRING (20 90, 130 90, 60 100, 190 100)'::geometry AS geomB) AS t; st_hausdorffdistance | st_distance ----------------------+------------- 37.26206567625497 | 20
示例: 使用细化的 Hausdorff 距离。
SELECT ST_HausdorffDistance( 'LINESTRING (130 0, 0 0, 0 150)'::geometry, 'LINESTRING (10 10, 10 150, 130 10)'::geometry, 0.5); ---------------------- 70
示例: 对于每个建筑物,找到最能代表它的地块。首先,我们需要地块与建筑物几何形状相交。DISTINCT ON
保证我们每个建筑物只列出一次。ORDER BY .. ST_HausdorffDistance
选择与建筑物最相似的地块。
SELECT DISTINCT ON (buildings.gid) buildings.gid, parcels.parcel_id FROM buildings INNER JOIN parcels ON ST_Intersects(buildings.geom, parcels.geom) ORDER BY buildings.gid, ST_HausdorffDistance(buildings.geom, parcels.geom);