ST_HausdorffDistance — Returns the Hausdorff distance between two geometries.
float ST_HausdorffDistance(geometry
g1, geometry
g2);
float ST_HausdorffDistance(geometry
g1, geometry
g2, float
densifyFrac);
Returns the Hausdorff distance between two geometries. The Hausdorff distance is a measure of how similar or dissimilar 2 geometries are.
The function actually computes the "Discrete Hausdorff Distance".
This is the Hausdorff distance computed at discrete points on the geometries.
The densifyFrac parameter can be specified,
to provide a more accurate answer by densifying
segments before computing the discrete Hausdorff distance.
Each segment is split into a number of equal-length subsegments
whose fraction of the segment length is closest to the given fraction.
Units are in the units of the spatial reference system of the geometries.
|
|
|
This algorithm is NOT equivalent to the standard Hausdorff distance. However, it computes an approximation that is correct for a large subset of useful cases. One important case is Linestrings that are roughly parallel to each other, and roughly equal in length. This is a useful metric for line matching. |
Availability: 1.5.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)
Example: Hausdorff distance with densification.
SELECT ST_HausdorffDistance(
'LINESTRING (130 0,0 0,0 150)'::geometry,
'LINESTRING (10 10,10 150,130 10)'::geometry,
0.5);
70
Example:
For each building, find the parcel that best represents it.
First we require that the parcel intersect with the building geometry.
DISTINCT ON guarantees we get each building listed only once.
ORDER BY .. ST_HausdorffDistance selects the parcel that is most similar to the building.
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);