กำลังสร้างบรรทัดจากคะแนนโดยใช้ PostGIS?


10

ฉันมีตาราง PostGIS พร้อมข้อมูลตำแหน่งของยานพาหนะจำนวนมากและต้องการสร้างบรรทัดจากจุดเหล่านี้

ข้อมูลสามารถเลือกได้โดย id ยานพาหนะและเรียงลำดับตามเวลา แต่จะสร้างบรรทัดจากผลลัพธ์ได้อย่างไร

สิ่งที่ฉันต้องการโดยทั่วไปคือส่วนของเส้นหนึ่งจากจุดที่ 1 ถึงจุดที่ 2 จบบรรทัดแล้วอีกครั้งจากจุดที่ 2 ถึงจุดที่ 3 แน่นอนว่าทั้งหมดนั้นอยู่ภายใต้การพิจารณาของ id ยานพาหนะ

อันหลังจำเป็นเพราะฉันต้องการคำนวณทิศทางการล่องเรือและความเร็วของยานพาหนะจากจุดหนึ่งไปอีกจุดหนึ่ง


1
ฟังก์ชั่น ST_MakeLine () จะทำเช่นนี้เมื่อคุณมี GROUP BY vehicle_id และ OREST BY timestamp แล้ว ดู: postgis.refractions.net/docs/ST_MakeLine.html
Micha

เอาล่ะฉันแค่ลองทำและออกแถลงการณ์ต่อไปนี้SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;นั่นจะทำให้ฉันติดตามรถทุกคันและไม่ใช่สิ่งที่ฉันต้องการ วิธีบอก ST_MakeLine () เพื่อสร้างบรรทัดจากจุดที่ 1 ถึงจุดที่ 2 จบบรรทัดและเริ่มบรรทัดใหม่จากจุดที่ 2 ถึงจุดที่ 3 ... ?
โทมัสเบกเกอร์

"จุด 1", "จุด 2", "จุด 3" คืออะไร? คุณรู้จักพวกเขาได้อย่างไร
Micha

ฉันคิดว่าจะจดจำพวกเขาผ่านการสั่งซื้อการประทับเวลา ... ORDER BY ais_data.bs_ts- เป็นไปได้หรือไม่ ดังนั้นจุดที่ 1 จุดที่ 2 เป็นต้นไปนั้นเป็นข้อมูลจุดที่กำหนดในแต่ละบรรทัดอันเป็นผลมาจากคำสั่ง Select
Thomas Becker

คุณสามารถสร้างขั้นตอนแรกได้หนึ่งบรรทัดต่อรถยนต์หนึ่งคันและหลังจากสร้างจุดสุดยอดจากบรรทัดนี้โดยใช้เคล็ดลับจากรายชื่อผู้รับจดหมายpostgis.17.x6.nabble.com/…
ThomasG77

คำตอบ:


12

สามารถทำได้หลายวิธีโดยใช้การรวมตัวเองหรือแบบสอบถามย่อยที่มีความสัมพันธ์กัน แต่การใช้ฟังก์ชั่นหน้าต่างน่าจะเป็นวิธีที่ง่ายที่สุด

ฟังก์ชันlead()ส่งคืนค่าที่อยู่ข้างหน้าในพาร์ติชันที่กำหนดและพาร์ติชันของเราคือ(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

ข้อความค้นหานี้ให้หมายเลขยานพาหนะตำแหน่งของจุดนั้นในพาร์ติชัน (ซึ่งเท่ากับตำแหน่งของบรรทัดที่ขึ้นต้นด้วย) และรูปทรงเรขาคณิตสองแบบที่จะสร้างบรรทัด แน่นอนว่ามันคืนค่า NULL geom2 สำหรับจุดสุดท้ายดังนั้นเราจึงต้องตรวจสอบว่าในแบบสอบถามด้านนอก

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.