Một biện pháp thực sự dễ dàng, nhưng không tuyệt vời là lấy khoảng cách Hausdorff giữa mỗi kết hợp, được thực hiện với hàm ST_HausdorffDistance . Sử dụng LineStrings gần đúng từ hình của bạn, tất cả đều được hiển thị bằng màu xanh lam và khoảng cách Hausdorff được hiển thị cho một trong các cặp dòng màu đỏ:
Và truy vấn để sắp xếp 6 kết hợp theo thứ tự giảm dần:
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)
Vì vậy, nó hoạt động tốt trong ví dụ này, nhưng nó không phải là một kỹ thuật tuyệt vời hay mạnh mẽ để phân cụm các dòng, vì chỉ số duy nhất là điểm duy nhất có khoảng cách lớn nhất, thay vì so sánh sự khác biệt của các dòng hoàn chỉnh. Có nhiều phương pháp tốt hơn, nhưng chúng sẽ phức tạp hơn.