Une mesure vraiment facile, mais pas fantastique, est d'obtenir la distance de Hausdorff entre chaque combinaison, ce qui est fait avec la fonction ST_HausdorffDistance . En utilisant les chaînes de lignes approximatives de votre figure, elles sont toutes affichées en bleu et la distance de Hausdorff est indiquée pour l'une des paires de lignes en rouge:
Et la requête pour trier les 6 combinaisons par ordre décroissant:
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)
Donc, cela fonctionne bien pour cet exemple, mais ce n'est pas une technique excellente ou robuste pour regrouper des lignes, car la seule métrique est le point unique avec la plus grande distance, plutôt que de comparer les différences de lignes complètes. Il existe de bien meilleures méthodes, mais elles seront plus compliquées.