Ось ідея
Якщо ви відірвете одну з рядків рядків для порівняння та перевірки, чи вершинні точки розташовані на деякій відстані від іншої рядкової рядки для порівняння, ви можете контролювати тест багатьма способами.
ці приклади працюють у PostGIS (хто може здогадатися :-))
По-перше, якщо ми скажемо, що існує збіг, якщо всі вершинні точки в рядку рядка в таблиці_1 дорівнюють 0,5 метра (одиниці карти) або ближче до рядка рядка в таблиці_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;
Тоді ми можемо сказати, що існує збіг, якщо більше 60% точок вершини у рядковій рядку таблиці_1 знаходиться в межах відстані від рядка рядка в таблиці_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
Або ми можемо прийняти, що одна точка не в діапазоні:
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;
Вам також доведеться запустити запит з таблицею_1 та table_2 у перетворених ролях.
Я не знаю, як швидко це буде. ST_Dumppoints в даний час є sql-функцією в PostGIS, а не C-функцією, яка робить її повільніше, ніж повинна бути. Але я думаю, все одно це буде досить швидко.
Просторові індекси дуже допоможуть ST_Dwithin для ефективності.
HTH Nicklas