Здесь приходит идея
Если вы разрываете одну из строк линий для сравнения и проверки, находятся ли точки вершин на некотором расстоянии от другой строки, для сравнения вы можете контролировать тест разными способами.
эти примеры работают в PostGIS (кто бы мог догадаться :-))
Во-первых, если мы говорим, что есть совпадение, если все точки вершин в строке строки в table_1 равны 0,5 метра (единицы карты) или ближе к строке строки в table_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% точек vertex_points в строке строки в table_1 находится на расстоянии от строки строки в table_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;
Вам также нужно будет выполнить запрос с table_1 и table_2 в обратных ролях.
Я не знаю, как быстро это будет. ST_Dumppoints в настоящее время является sql-функцией в PostGIS, а не C-функцией, которая делает ее медленнее, чем должна быть. Но я думаю, что все равно будет довольно быстро.
Пространственные индексы очень помогут для ST_D с эффективностью.
HTH Никлас