Name

ST_HausdorffDistance — Renvoie la distance de Hausdorff entre deux géométries.

Synopsis

float ST_HausdorffDistance(geometry g1, geometry g2);

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

Description

Renvoie la distance de Hausdorff entre deux géométries. La distance de Hausdorff est une mesure de la similarité ou de la dissemblance de deux géométries.

La fonction calcule en fait la "Discrete Hausdorff Distance". Il s'agit de la distance de Hausdorff calculée en des points discrets des géométries. Le paramètre densifyFrac peut être spécifié pour fournir une réponse plus précise en densifiant les segments avant de calculer la distance discrète de Hausdorff. Chaque segment est divisé en un certain nombre de sous-segments de longueur égale dont la fraction de la longueur du segment est la plus proche de la fraction donnée.

Les unités sont celles du système de référence spatiale des géométries.

[Note]

Cet algorithme n'est PAS équivalent à la distance standard de Hausdorff. Cependant, il calcule une approximation qui est correcte pour un large sous-ensemble de cas utiles. Un cas important est celui des lignes qui sont à peu près parallèles les unes aux autres et dont la longueur est à peu près égale. Il s'agit d'une métrique utile pour l'appariement des lignes.

Disponibilité : 1.5.0

Exemples

Distance de Hausdorff (rouge) et distance (jaune) entre deux lignes

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

Exemple: Distance de Hausdorff avec densification.

SELECT ST_HausdorffDistance(
            'LINESTRING (130 0, 0 0, 0 150)'::geometry,
            'LINESTRING (10 10, 10 150, 130 10)'::geometry,
            0.5);
 ----------------------
          70

Exemple: Pour chaque bâtiment, trouvez la parcelle qui le représente le mieux. Tout d'abord, nous exigeons que la parcelle intersecte la géométrie du bâtiment. DISTINCT ON garantit que chaque bâtiment ne sera listé qu'une seule fois. ORDER BY .. ST_HausdorffDistance sélectionne la parcelle qui est la plus similaire au bâtiment.

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

Voir aussi

ST_FrechetDistance