นี่คือความคิด
หากคุณแยก linestrings ตัวใดตัวหนึ่งออกมาเพื่อเปรียบเทียบและทดสอบว่าจุดยอดอยู่ภายในระยะทางจากจุดเชื่อมต่ออื่น ๆ เพื่อเปรียบเทียบคุณสามารถควบคุมการทดสอบได้หลายวิธี
ตัวอย่างเหล่านั้นทำงานใน PostGIS (ผู้ที่สามารถเดาได้ :-))
ก่อนอื่นถ้าเราบอกว่ามีการแข่งขันถ้าจุดยอดทั้งหมดใน linestring ใน table_1 คือ 0.5 เมตร (หน่วยแผนที่) หรือใกล้กับ linestring ใน 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% ของจุดยอด _ จุดใน linestring ใน table_1 อยู่ในระยะทางของ linestring ใน 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_Dithin มีประสิทธิภาพมากขึ้น
HTH Nicklas