Nom

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

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.

Code
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;
Export de raster
37.262066 | 20.000000 | 37.262066 | LINESTRING(20 70,20 90)
Figure
Geometry figure for visual-st-hausdorffdistance-01

Exemple: Distance de Hausdorff avec densification.

Code
SELECT ST_HausdorffDistance(
            'LINESTRING (130 0,0 0,0 150)'::geometry,
            'LINESTRING (10 10,10 150,130 10)'::geometry,
            0.5);
Export de raster
70
Figure
Geometry figure for visual-st-hausdorffdistance-02

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.

Code
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