Eine wirklich einfache, aber nicht fantastische Maßnahme besteht darin, den Hausdorff-Abstand zwischen jeder Kombination zu ermitteln, was mit der Funktion ST_HausdorffDistance erfolgt . Unter Verwendung der ungefähren LineStrings aus Ihrer Figur werden diese alle in Blau angezeigt, und der Hausdorff-Abstand wird für eines der Linienpaare in Rot angezeigt:
Und die Abfrage zum Sortieren der 6 Kombinationen in absteigender Reihenfolge:
WITH data AS (
SELECT 'blue' AS name, 'LINESTRING (60 200, 110 290, 200 320, 330 320, 430 240, 450 200)'::geometry AS geom
UNION SELECT 'black', 'LINESTRING (60 200, 120 270, 235 297, 295 207, 450 200)'::geometry
UNION SELECT 'green', 'LINESTRING (60 200, 280 190, 450 200)'::geometry
UNION SELECT 'red', 'LINESTRING (60 200, 150 210, 257 195, 360 210, 430 190, 450 200)'::geometry)
SELECT a.name || ' <-> ' || b.name AS compare, ST_HausdorffDistance(a.geom, b.geom)
FROM data a, data b WHERE a.name < b.name
ORDER BY ST_HausdorffDistance(a.geom, b.geom) DESC;
compare | st_hausdorffdistance
-----------------+----------------------
blue <-> green | 130
blue <-> red | 125
black <-> blue | 110.102502131467
black <-> green | 104.846289061163
black <-> red | 97.9580173908678
green <-> red | 15.2677257073823
(6 rows)
In diesem Beispiel funktioniert es also gut, aber es ist keine großartige oder robuste Technik zum Clustering von Linien, da die einzige Metrik der einzelne Punkt mit der größten Entfernung ist, anstatt die Unterschiede vollständiger Linien zu vergleichen. Es gibt viel bessere Methoden, aber sie werden komplizierter sein.