Oto pomysł
Jeśli oderwiesz jeden z linii w celu porównania i przetestujesz, czy punkty wierzchołkowe znajdują się w pewnej odległości od drugiego linii w celu porównania, możesz kontrolować test na wiele sposobów.
te przykłady działają w PostGIS (kto może zgadywać :-))
Po pierwsze, jeśli powiemy, że istnieje dopasowanie, jeśli wszystkie punkty wierzchołków w linii w tabeli_1 mają 0,5 metra (jednostki mapy) lub są bliżej linii w tabeli_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;
Następnie możemy powiedzieć, że istnieje dopasowanie, jeśli więcej niż 60% punktów wierzchołków w linii w tabeli_1 znajduje się w odległości od linii w tabeli_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
Lub możemy zaakceptować, że jeden punkt nie jest w zasięgu:
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ędziesz także musiał uruchomić zapytanie z table_1 i table_2 w odwróconych rolach.
Nie wiem jak szybko to będzie. ST_Dumppoints jest obecnie funkcją SQL w PostGIS, a nie funkcją C, która sprawia, że jest wolniejsza niż powinna. Ale myślę, że i tak będzie dość szybko.
Indeksy przestrzenne bardzo pomogą ST_Dwithin w skuteczności.
HTH Nicklas