ST_HausdorffDistance — 返回两个几何图形之间的Hausdorff 距离。
float ST_HausdorffDistance(geometry g1, geometry g2);
float ST_HausdorffDistance(geometry g1, geometry g2, float densifyFrac);
返回两个几何图形之间的Hausdorff距离。 Hausdorff距离是对 2 个几何形状相似或不相似程度的度量。
该函数实际上计算“离散Hausdorff距离”。 这是在几何上的离散点计算的Hausdorff距离。 可以指定 densifyFrac 参数,以便在计算离散 Hausdorff 距离之前通过致密分段来提供更准确的答案。 每个段被分成多个等长的子段,其段长度的分数最接近给定的分数。
单位采用几何空间参考系的单位。
|
|
|
该算法不等同于标准 Hausdorff距离。 然而,它计算出的近似值对于大部分有用案例都是正确的。 一种重要的情况是线串彼此大致平行且长度大致相等。 这是线路匹配的有用指标。 |
可用性:1.1.0
Hausdorff distance and minimum distance between two lines. The Hausdorff witness segment from the original illustration is retained and its length is checked against the computed distance.
WITH lines AS (
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,
'LINESTRING (52.69230769230769 63.46153846153846,60 100)'::geometry AS hausdorff_segment
)
SELECT round(ST_HausdorffDistance(geomA, geomB)::numeric, 6) AS hausdorff_distance,
round(ST_Distance(geomA, geomB)::numeric, 6) AS distance,
round(ST_Length(hausdorff_segment)::numeric, 6) AS witness_length,
ST_ShortestLine(geomA, geomB) AS distance_segment
FROM lines;
37.262066 | 20.000000 | 37.262066 | LINESTRING(20 70,20 90)
示例:致密化的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);