ST_HausdorffDistance — Returnerar Hausdorff-avståndet mellan två geometrier.
float ST_HausdorffDistance(
geometry g1, geometry g2)
;
float ST_HausdorffDistance(
geometry g1, geometry g2, float densifyFrac)
;
Returnerar Hausdorff-avståndet mellan två geometrier. Hausdorff-avståndet är ett mått på hur lika eller olika två geometrier är.
Funktionen beräknar faktiskt det "diskreta Hausdorff-avståndet". Detta är Hausdorff-avståndet som beräknas vid diskreta punkter på geometrierna. Parametern densifyFrac
kan specificeras för att ge ett mer exakt svar genom att segmenten förtätas innan det diskreta Hausdorff-avståndet beräknas. Varje segment delas upp i ett antal lika långa undersegment vars fraktion av segmentlängden ligger närmast den givna fraktionen.
Enheterna är i enheterna i geometriernas spatiala referenssystem.
![]() |
|
Den här algoritmen är INTE likvärdig med standardavståndet Hausdorff. Den beräknar dock en approximation som är korrekt för en stor delmängd av användbara fall. Ett viktigt fall är linjesträngar som är ungefär parallella med varandra och ungefär lika långa. Detta är ett användbart mått för linjematchning. |
Tillgänglighet: 1.5.0
Hausdorff-avstånd (rött) och avstånd (gult) mellan två linjer
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
Exempel: Hausdorff-avstånd med förtätning.
SELECT ST_HausdorffDistance( 'LINESTRING (130 0, 0 0, 0 150)'::geometry, 'LINESTRING (10 10, 10 150, 130 10)'::geometry, 0.5); ---------------------- 70
Exempel: För varje byggnad, hitta den tomt som bäst representerar den. Först krävs att tomten korsar byggnadens geometri. DISTINCT ON
garanterar att varje byggnad bara listas en gång. ORDER BY .. ST_HausdorffDistance
väljer det skifte som är mest likt byggnaden.
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);