Đây là một ý tưởng
Nếu bạn xé một trong các linestrings để so sánh và kiểm tra xem các đỉnh có nằm trong khoảng cách so với các linestring khác để so sánh hay không, bạn có thể kiểm soát bài kiểm tra theo nhiều cách.
những ví dụ này hoạt động trong PostGIS (ai có thể đoán :-))
Đầu tiên, nếu chúng ta nói rằng có một trận đấu nếu tất cả các điểm đỉnh trong một linestring trong bảng_1 là 0,5 mét (đơn vị bản đồ) hoặc gần hơn với một linestring trong bảng_2:
SELECT a.id, b.id FROM
(SELECT ST_NPoints(the_geom) as num_of_points,
(ST_Dumppoints(the_geom)).geom as p, id FROM table_1) a
INNER JOIN
table_2 b
ON ST_DWithin(a.p, b.the_geom, 0.5) GROUP BY a.id, b.id
HAVING COUNT(*)=num_of_points;
Sau đó, chúng ta có thể nói rằng có một trận đấu nếu hơn 60% số đỉnh trong một dòng trong bảng_1 nằm trong khoảng cách của một dòng trong bảng_2
SELECT a.id, b.id FROM
(SELECT ST_NPoints(the_geom) as num_of_points,
(ST_Dumppoints(the_geom)).geom as p, id FROM table_1) a
INNER JOIN
table_2 b
ON ST_DWithin(a.p, b.the_geom, 0.5) GROUP BY a.id, b.id
HAVING COUNT(b.id)/num_of_points::float > 0.6
Hoặc chúng ta có thể chấp nhận rằng một điểm không nằm trong phạm vi:
SELECT a.id, b.id FROM
(SELECT ST_NPoints(the_geom) as num_of_points,
(ST_Dumppoints(the_geom)).geom as p, id FROM table_1) a
INNER JOIN
table_2 b
ON ST_DWithin(a.p, b.the_geom, 0.5) GROUP BY a.id, b.id
HAVING COUNT(b.id)-num_of_points <= 1;
Bạn cũng sẽ phải chạy truy vấn với bảng_1 và bảng_2 trong các vai trò đảo ngược.
Tôi không biết nó sẽ nhanh như thế nào. ST_Dumppoints hiện là một hàm sql trong PostGIS và không phải là hàm C làm cho nó chậm hơn mức cần thiết. Nhưng tôi nghĩ dù sao nó cũng sẽ khá nhanh.
Các chỉ mục không gian sẽ giúp ích rất nhiều cho ST_Dwithin có hiệu quả.
NickH HTH