İşte bir fikir geliyor
Karşılaştırma yapmak ve bağlantı noktalarının karşılaştırma yapmak için diğer bağlantı noktalarından belirli bir mesafede olup olmadığını test etmek için bağlantı noktalarından birini ayırırsanız testi birçok şekilde kontrol edebilirsiniz.
Bu örnekler PostGIS’de (kim tahmin edebilir :-))
Birincisi, eğer tablo_1'deki bir çizgideki tüm köşe noktalarının 0,5 metre (harita birimleri) veya tablo_2'deki bir çizgiye yakın olması durumunda bir eşleşme olduğunu söylersek:
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;
Öyleyse, tablo_1'deki bir çizgideki vertex_points öğelerinin% 60'ından fazlası, tablo_2'deki bir çizginin mesafesi dahilindeyse bir eşleşme olduğunu söyleyebiliriz.
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
Veya bir noktanın menzilde olmadığını kabul edebiliriz:
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;
Ayrıca sorguyu tablo_1 ve tablo_2 ile ters çevrilmiş rollerde çalıştırmanız gerekir.
Ne kadar hızlı olacağını bilmiyorum. ST_Dumppoints şu anda PostGIS'te bir sql işlevidir ve olması gerekenden daha yavaş olmasını sağlayan bir C işlevi değildir. Ama yine de oldukça hızlı olacağını düşünüyorum.
Mekansal dizinler ST_Dwithin'ın etkili olması için çok yardımcı olacaktır.
HTH Nicklas