ST_HausdorffDistance — Gibt den kürzesten 3-dimensionalen Abstand zwischen zwei geometrischen Objekten als Linie zurück
float ST_HausdorffDistance(
geometry g1, geometry g2)
;
float ST_HausdorffDistance(
geometry g1, geometry g2, float densifyFrac)
;
Liefert den Hausdorff-Abstand zwischen zwei Geometrien. Der Hausdorff-Abstand ist ein Maß dafür, wie ähnlich oder unähnlich 2 Geometrien sind.
Die Funktion berechnet die "Diskrete Hausdorff-Distanz". Dies ist der Hausdorff-Abstand, der an diskreten Punkten der Geometrien berechnet wird. Der Parameter densifyFrac
kann angegeben werden, um durch Verdichtung der Segmente vor der Berechnung des diskreten Hausdorff-Abstands eine genauere Antwort zu erhalten. Jedes Segment wird in eine Anzahl von Untersegmenten gleicher Länge aufgeteilt, deren Anteil an der Segmentlänge dem angegebenen Anteil am nächsten kommt.
Die Einheiten sind in den Einheiten des räumlichen Bezugssystems der Geometrien angegeben.
Dieser Algorithmus ist NICHT gleichwertig mit dem Standard-Hausdorff-Abstand. Er berechnet jedoch eine Annäherung, die für eine große Teilmenge nützlicher Fälle korrekt ist. Ein wichtiger Fall sind Linien, die ungefähr parallel zueinander verlaufen und ungefähr gleich lang sind. Dies ist eine nützliche Metrik für die Anpassung von Linien. |
Verfügbarkeit: 1.5.0
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
Beispiel: Hausdorff-Abstand mit Verdichtung.
SELECT ST_HausdorffDistance( 'LINESTRING (130 0, 0 0, 0 150)'::geometry, 'LINESTRING (10 10, 10 150, 130 10)'::geometry, 0.5); ---------------------- 70
Beispiel: Finden Sie für jedes Gebäude die Parzelle, die es am besten repräsentiert. Zunächst muss sich die Parzelle mit der Geometrie des Gebäudes schneiden. DISTINCT ON
garantiert, dass jedes Gebäude nur einmal aufgeführt wird. ORDER BY .. ST_HausdorffDistance
wählt die Parzelle aus, die dem Gebäude am ähnlichsten ist.
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);