การวัดระยะทางระหว่างจุดพร้อมกัน


9

ฉันทำงานกับข้อมูล GPS ดังนั้นฉันจึงมี UTM พร้อมข้อมูล DATE / เวลา ฉันมีเผ่าพันธุ์ 2 กลุ่ม (กวางมูสและหมาป่า) ฉันต้องการที่จะเข้าร่วมข้อมูลจากกวางมูสไปยังหมาป่าที่ตรงกับเวลา ดังนั้นสถานที่ 1 จาก 1 กวางอยู่ที่ 2007/03/26 14:33:49 หมาป่าทั้งหมดที่ถูกบันทึกไว้ที่ประมาณเวลาเดียวกัน คีย์คือประมาณ - หมายความว่าฉันจะต้องมีหน้าต่างเวลาหรือบัฟเฟอร์เพื่อค้นหาตำแหน่งหมาป่าทั้งหมดที่อยู่ภายในบัฟเฟอร์ 30 นาทีในช่วงเวลานั้น

ฉันกำลังมองหาสคริปต์หรือเครื่องมือที่จะตั้งค่าบัฟเฟอร์หน้าต่าง +/- X นาทีและจะสามารถ "กระบวนการ" ชุด ฉันเคยอย่างน้อย 30 มูและหมาป่า 30 ตัว - ดังนั้นการจับคู่ครั้งละหนึ่งคู่จึงไม่เป็นประโยชน์ เมื่อฉันได้จับคู่วันที่ / เวลาแล้วฉันต้องการคำนวณระยะทางระหว่างตำแหน่ง XY ของมูซและหมาป่ากับความแตกต่างของเวลา ฉันต้องการผลลัพธ์เช่น:

individualmooseID | mooseDate | mooseX | mooseY | individualwolfID | wolfDate | wolfX | wolfY | Distance(m) | TimeDiff (min)

mooseID อาจจับคู่ wolfid หลายตัวในช่วงเวลาเดียวกัน ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชม ฉันได้เขียนรหัสสำหรับ R แต่มันไม่ทำงานดูคำถามของฉัน: https://stackoverflow.com/q/15646365/675742และฉันจะต้องนำข้อมูลเข้าสู่ ArcGIS ในบางจุดดังนั้นถ้าฉันสามารถข้าม R และทำ ทุกอย่างใน ArcGIS นั้นยอดเยี่ยมมาก!


4
ฉันทำสิ่งนี้เป็นเวลานานแล้วโดยการสร้างสองชั้นซึ่งพิกัดเป็นเวลาบวกกับค่าเทียมyโดยมีy = 0 สำหรับชุดข้อมูลหนึ่งชุดและy = ค่าคงที่สำหรับชุดข้อมูลอื่น ณ จุดนี้คุณสามารถใช้การรวมเชิงพื้นที่การบัฟเฟอร์และการวิเคราะห์เชิงพื้นที่รูปแบบอื่น ๆ เพื่อตอบคำถามของคุณเนื่องจากความใกล้เคียงในพิกัดเทียมเหล่านี้เหมือนกับเวลาใกล้เคียง
whuber

คำตอบ:


4

ชุดข้อมูลเช่นนี้สามารถให้ข้อมูลได้อย่างแน่นอน

ฉันจะทำเช่นนี้ในสภาพแวดล้อมฐานข้อมูลเชิงพื้นที่โดยเฉพาะอย่างยิ่ง PostgreSQL / PostGIS

สิ่งที่คุณต้องการทำดูเหมือนการเข้าร่วมง่าย ๆ กับข้อมูลเชิงพื้นที่และเวลา

จากนั้นคุณทำทุกอย่างในแบบสอบถามเดียว ส่วนที่ยุ่งยากอาจเป็นการปรับดัชนีให้เหมาะสมสำหรับการเข้าร่วมเวลา ฉันเดาว่าชุดข้อมูลนั้นค่อนข้างใหญ่

แบบสอบถามสามารถมีลักษณะเช่นนี้ (อ่านเป็นรหัสเทียมโดยเฉพาะเวลาส่วน)

SELECT DISTINCT ON (moose_id, wolf_id, moose_time) 
moose_id, moose_geom, moose_time, wolf_id, wolf_geom, wolf_time,
ST_Distance(moose_geom, wolf_geom) as dist, moose_time-wolf_time as time_diff
FROM
moose_table as mt inner join wolf_table as wt 
on 
ST_DWithin(moose_geom, wolf_geom,10000) 
AND moose_time > ( wolf_time-30) 
AND moose_time < (wolf_time + 30) 
ORDER BY abs(time_diff), moose_id, wolf_id, moose_time;

หมายเหตุสองประการ:
1) ฉันใช้ ST_D ภายในนี้เพื่อ จำกัด การจับคู่หมาป่าที่อยู่ใกล้กว่า 10,000 เมตร นั่นคือวิธีการลดการคำนวณและไม่คำนวณชุดค่าผสมที่เป็นไปได้ทั้งหมด
2) ฉันใช้ DISTINCT ON สำหรับการรวมกันของหมาป่าแต่ละตัวในการลงทะเบียนแต่ละครั้งคุณควรจะได้ระยะทางที่ใกล้เคียงที่สุดเท่านั้น

แต่ฉันเห็นข้อความค้นหาที่น่าสนใจอีกหลายข้อเพื่อทดสอบชุดข้อมูลของคุณที่ควรให้ข้อมูลที่น่าสนใจเกี่ยวกับวิธีที่หมาป่าล่ามูซ

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

ความเร็วที่คุณได้รับจากการสืบค้นง่ายๆ :-)

ดังนั้นให้คุณตารางในฐานข้อมูล postgis และทำงานที่นั่น

หากคุณใช้ ArcGIS 10 หรือ 10.1 คุณสามารถดูข้อมูลได้โดยตรงจากฐานข้อมูล หรือจาก QGIS นั่นคือการรวมกันที่เป็นผู้ใหญ่มากขึ้น PostGIS-QGIS

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