จุด GPS ที่จับคู่แผนที่ไปยังเครือข่ายถนน!


11

ฉันค่อนข้างใหม่สำหรับ Postgres และ PostGIS

ฉันกำลังพยายามทำการจับคู่แผนที่อย่างง่าย ๆ (หรือการอนุมานเส้นทางถ้าคุณต้องการ) ของบางจุด GPS ฉันใช้postgres (PostGIS)

ฉันมีตารางในฐานข้อมูลที่มีคะแนน GPS ของฉัน: gpspoints (Lat, Long, time, speed, azimuth, geometry, ... )

ฉันได้นำเข้าไฟล์รูปร่างของเครือข่ายถนนลงในฐานข้อมูลของฉันด้วย: เส้นทาง (gid, idrte, รุ่น, nomrte, norte, clsrte, geom, ... ) - ฉันไม่มี azimuth ของลิงก์และฉันเป็น ไม่แน่ใจว่าฉันจะคำนวณได้อย่างไรโดยใช้ฟังก์ชั่น postgis ST_azimuth ทั้งหมดที่ฉันมีคือ shapefile ของเครือข่ายถนนที่มีคอลัมน์ที่ระบุข้างต้น

ฉันต้องการเชื่อมโยงจุด GPS แต่ละจุดกับลิงก์ที่ใกล้ที่สุด (ในบัฟเฟอร์ประมาณ 20 เมตรรอบจุด) เฉพาะเมื่อทิศทางของลิงก์เห็นด้วยกับราบของจุด GPS (+ หรือ -15 องศา) และดึงตำแหน่งที่คาดการณ์ไว้ มิฉะนั้นฉันต้องการให้ค้นหาลิงค์ที่ใกล้ที่สุด NEXT ภายในบัฟเฟอร์ 20 เมตรซึ่งมีราบราบที่ยอมรับได้! (เหมือนภาพ!)

ฉันต้องการพิกัดพิกัดใหม่ของจุด GPS ที่คาดการณ์ไว้ในตาราง "gpspoints" เป็น "projectedLat" และ "projectedLong"

(ในภาพด้านล่างแสดงจุดที่เกิดขึ้นจริงโดยใช้ทิศทางในขณะที่จุดที่คาดการณ์ไม่มีเครื่องหมายทิศทางใด ๆ ) ป้อนคำอธิบายรูปภาพที่นี่


มันเป็นปัญหาที่น่าสนใจ ฉันสมมติว่าหากจุดถัดไปในบัฟเฟอร์ 20 ม. มี azimuth ที่ยอมรับไม่ได้คุณต้องการทำการค้นหาต่อไปหรือไม่
John Powell

ใช่จอห์น แต่สำหรับกลุ่มถนนที่มีบัฟเฟอร์ขนาด 20 เมตร ! ที่จริงแล้วฉันต้องการระบุส่วนของถนนที่อยู่ในบัฟเฟอร์ 20 ม. จากนั้นหาส่วนที่ใกล้ที่สุดซึ่งมีมุมราบที่ยอมรับได้!
Nader

"ฉันไม่ได้มี azimuth ของการเชื่อมโยงและฉันไม่แน่ใจว่าฉันจะคำนวณได้อย่างไรโดยใช้ฟังก์ชั่น postgis ST_azimuth ทั้งหมดที่ฉันมีคือ shapefile ของเครือข่ายถนนที่มีคอลัมน์ที่ระบุด้านบน" คุณสามารถ (และควร) นำถนนของคุณลงใน Postgres / PostGIS กับshp2pgsql แล้วคุณสามารถใช้ST_Azimuthแต่จำไว้ว่ามันจะบอกคุณราบที่เกี่ยวกับทิศทางของการแปลง
alphabetasoup

คำตอบ:


1

ฉันไม่มีคำตอบที่ครบถ้วน แต่อาจพอที่จะให้คุณเริ่มต้นได้ ฟังก์ชั่นเหล่านี้อาจช่วยได้:

ST_Line_Locate_Point () ให้ระยะทางเป็นส่วนหนึ่งของความยาวบรรทัดทั้งหมดของจุดตามเส้น ST_Line_Interpolate_Point () ส่งกลับจุดเรขาคณิตสำหรับจุดที่ระยะทางที่กำหนด (อีกครั้งเป็นส่วนหนึ่งของความยาวทั้งหมด) ตามบรรทัด

สิ่งที่ฉันแนะนำให้ใช้เพื่อให้ได้รูปทรงเรขาคณิตของตำแหน่ง 'new_pts' ในบรรทัดของคุณซึ่งอยู่ใกล้กับจุด gpspoint ของคุณมากที่สุด (ในแบบสอบถามย่อยด้านล่าง จากนั้นใช้จุดนั้นเพื่อค้นหาจุดที่ใกล้ที่สุดจริง ๆ บนบรรทัด แต่ที่ระยะทางที่เล็กกว่าเล็กน้อยดังนั้นมันจะเข้าใกล้จุดเริ่มต้นมากขึ้น ถัดไปใช้จุดที่พบนี้พร้อมกับ 'new_pt' เพื่อรับ azimuth ระหว่างพวกเขา สิ่งนี้จะมากหรือน้อยแทนค่าแทนเจนต์ของเส้นตรงในจุดนั้น

จากนั้นคุณสามารถเปรียบเทียบมุมนี้กับมุมราบของ gpspoint ของคุณเพื่อพิจารณาว่าจะเพิ่ม gpspoint หรือไม่

with new_pts AS (
    SELECT ST_ClosestPoint(geom, gpspoints) AS geompt
    FROM routes JOIN gpspoints ON ST_Distance(routes.geom, gpspoints.geom)<20
    )


SELECT ST_Azimuth(new_pts.geompt, 
    ST_Line_Interpolate_Point(routes.geom, 
        ST_Line_Locate_Point(routes.geom, new_pts.geompt)*0.999))

FROM routes JOIN new_pts ON ST_Distance(routes.geom,new_pts.geompt)<20;

อีกครั้งไม่ได้ทดสอบ แต่ฉันหวังว่ามันจะช่วยได้บ้าง


0

ลองอะไรเช่นนี้:

  1. คำนวณการวางแนวของ polylines เป็นองศาตัวอย่างเช่นใน ArcGIS Field Calculator: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. แปลงเครือข่ายถนนของคุณเป็นจุดยอด (คะแนน) และนำเข้าสู่ PostGIS

  3. ใช้อัลกอริทึมการจับคู่:

    INSERT เป็นการจับคู่ (gid, vehicle_id, เซกเมนต์, วันที่, เวลา, the_geom)

    เลือก DISTINCT ON (b.gid) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, ST_Closestpoint (ST_Collect (a.the_geom), b.the_geom) จาก the

    segment_vertices_geom a เข้าร่วม vehicle_geom b บน ST_D ภายใน (ST_Transform (a.the_geom, 32632),

    ST_Transform (b.the_geom, 32632), 20) WHERE (CAST (a.azimuth AS float8) - CAST (b.direction AS float8) <180 หรือ (CAST (a.azimuth AS float8) AS float8))> -180) จัดกลุ่มตาม b.gid, b.vehicle_id, a.segment_id, b.date, b.time, a.the_geom, b.the_geom เรียงลำดับตาม b.gid, ST_Distance (a.the_geom, b .the_geom);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.