Snap point

        ไปพบแนวคิดการ snap point กับ line ด้วยฟังก์ชั่นกลุ่ม LRS(Linear referencing system) จาก mailing list น่าสนใจดีเลยนำมาเขียนเก็บไว้ โดยปกติใน postgis จะไม่มีฟังก์ชั่น snapping พอดีผมกำลังทำ network analysis application เวลาให้ผูใช้กำหนดตำแหน่ง ต้นทาง ปลายทาง จำเป็นที่จะต้อง snap เข้าหาถนน หาไปหามาก็เลยได้ทางออก

        วิธีการก็ไม่มีอะไรซับซ้อนครับ ใช้ฟังก์ชั่น ST_Line_Locate_Point(line, point) และ ST_Line_Interpolate_Point(line, %location) ตัวอย่างแสดงการ snap point ที่อยู่ในระยะห่าง 10 เมตร ให้เข้าหา line โดยใช้ Dwithin เป็นตัวกรอง point dataset จากนั้นก็ใช้ ST_line_interpolate_point หาตำแหน่ง x,y ใหม่บนเส้น เขียน PL ได้ดังนี้

 SELECT
   DISTINCT ON (pt_id)
   pt_id,
   ln_id,
   ST_AsText(
     ST_line_interpolate_point(
       ln_geom,
       ST_line_locate_point(ln_geom, vgeom)
     )
   )
 FROM
   (
   SELECT
     ln.the_geom AS ln_geom,
     pt.the_geom AS pt_geom,
     ln.id AS ln_id,
     pt.id AS pt_id,
     ST_Distance(ln.the_geom, pt.the_geom) AS d
   FROM
     point_table pt,
     line_table ln
   WHERE
     ST_DWithin(pt.the_geom, ln.the_geom, 10.0)
   ORDER BY
     pt_id,d
   ) AS subquery;

ไม่มีอะไรยุ่งยากมากนัก แต่ความถูกต้องก็อยู่ที่ระดับหนึ่งพอรับได้โดยเป็นวิธีแก้ขัดนะครับ ที่ผมเลือกใช้เพราะค่อนข้างเร็ว ที่สำคัญถ้า point อยู่ห่างจากเส้นมากๆ อาจจะใช้ไม่ได้ ถ้าจะเอาให้ถูกต้องมากๆอาจจะต้องใช้ algorithm ที่ซับซ้อนมากกว่านี้

ใส่ความเห็น