Name

ST_HausdorffDistance — Returnerar Hausdorff-avståndet mellan två geometrier.

Synopsis

float ST_HausdorffDistance(geometry g1, geometry g2);

float ST_HausdorffDistance(geometry g1, geometry g2, float densifyFrac);

Beskrivning

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.

[Note]

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

Exempel

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);