วิธีการสอดแทรกตำแหน่ง GPS ใน PostGIS


13

ฉันมีตารางตำแหน่ง GPS ของ PostGIS ทุกห้าวินาที:

2011-01-01 00:00:05, POINT(x1,y1)
2011-01-01 00:00:10, POINT(x2,y2)
2011-01-01 00:00:15, POINT(x3,y3)
...

ฉันกำลังค้นหาข้อความค้นหาที่จะคืนค่า (เวลาและจุด) ทุกวินาที มันก็โอเคที่จะคิดว่าจุดเชื่อมต่อกันเป็นเส้นตรง

ฉันกำลังมองหาวิธีการทำเช่นนี้โดยเฉพาะในฐานข้อมูลและไม่ได้โดยการเขียนสคริปต์ภายนอก


ฉันคิดว่าคุณจะต้องเขียนฟังก์ชัน PL / Python สำหรับสิ่งนั้น
Pablo

1
นี่คือตัวอย่างข้อมูลจาก postgis ในการดำเนินการที่อาจช่วยได้: bostongis.com/postgis_translate.snippet
Pablo

@Pablo: ใช่เป็นไปได้มากที่สุด ฉันจะปรับคำถามของฉัน
underdark

คำตอบ:


13

สวัสดี

หากตารางดั้งเดิมของคุณเรียกว่า gps_p เขตเวลาประทับของคุณจะเรียกว่า ts และคะแนนนั้นเรียกว่า th_geom:

SELECT (geom).geom,  ts1 + (((geom).path[1]-1) ||' seconds')::interval FROM 
    (SELECT ts1, ST_DumpPoints(ST_Segmentize(geom, ST_Length(geom)/5)) as geom FROM 
        (SELECT ts1, ST_LineFromMultipoint(ST_Union(geom1, geom2)) as geom FROM
            (SELECT p1.ts as ts1, p2.ts as ts2, p1.the_geom as geom1, p2.the_geom as geom2 
                FROM gps_p p1 INNER JOIN gps_p p2 on p1.ts + '00:00:05'::interval = p2.ts
            ) a
        )b
    ) c
WHERE (geom).path[1] <= 5;

มันทำอะไรคือมันสร้างเส้นแบ่งระหว่างจุดและใช้ st_segmentize เพื่อแบ่งเส้นใน 5 ส่วน

หากไม่ตรงกับจุดเดิมของคุณ 5 วินาทีมันจะไม่ทำงาน จากนั้นคุณสามารถเพิ่มเขตข้อมูล id ด้วยลำดับและใช้สิ่งนั้นเพื่อเข้าร่วมตารางด้วย id1 + 1 = id2 แทน

HTH

/ Nicklas


6

นี่คือรหัสร่างสำหรับ pl / python เป็นเพียงแนวคิดพื้นฐานในการแปลคะแนนตามระยะทางและ azimuth ที่กำหนด
ในการเรียกใช้ฟังก์ชั่น postgis ใน pl / python ทางออกเดียวที่ฉันพบคือใช้ plpy.prepare และ plpy.execute (น่าเบื่อมาก)

total_distance=St_distance(P1,P2)
azimuth=st_azimuth(p1,p2)
partial_distance=total_distance / 5

for i in range(4):
  distance = (i+1)*partial_distance
  x_increment=distance*math.cos(math.degrees(azimuth))
  y_increment=distance*math.sin(math.degrees(azimuth))
  ST_translate(P1, x_increment, y_increment)

0

ถ้าฉันไม่เข้าใจผิด ...
สิ่งที่คุณต้องทำคือกำหนดเส้นเชื่อมต่อแล้วทำการหารมัน

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