ここにアイデアがあります
比較するためにラインストリングの1つを引き裂いて比較し、頂点ポイントが他の比較するラインストリングからある距離内にあるかどうかをテストする場合、多くの方法でテストを制御できます。
それらの例は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;
次に、table_1の線ストリングの頂点ポイントの60%以上が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
または、1つのポイントが範囲内にないことを受け入れることができます。
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は現在、PostGISのsql関数であり、必要以上に遅くなるC関数ではありません。しかし、とにかく非常に高速になると思います。
空間インデックスは、ST_Dwithinが効果的に機能するのに役立ちます。
HTHニクラス