ที่ตั้งโครงการบนเส้นทาง (วงกลมใหญ่)


9

ฉันค้นหาไซต์ SE นี้มาหลายชั่วโมงแล้วและฉันยังคงพยายามหาทางแก้ไขคำถามของฉัน เป้าหมายของฉันคือให้วิธีใน OSM และตำแหน่งของฉัน (พิกัดละติจูด / ลองจิจูด) ฉันต้องการค้นหาตำแหน่งที่ใกล้ที่สุด (พิกัดละติจูด / ลองจิจูด) ในวิธีนั้น จุดสามารถไปได้ทุกที่ไม่ จำกัด เฉพาะจุดที่ใช้กำหนดเส้นทาง

ดังนั้นฉันคิดว่าอัลกอริทึมต่อไปนี้:

  1. เส้นทางแยกเข้าสู่ขอบที่แยกกันแต่ละด้านเชื่อมต่อกันเพียงสองจุด
  2. เลือกขอบที่ใกล้เคียงที่สุด
  3. ฉายตำแหน่งของฉันลงบนขอบนั้น

ขณะนี้มีคำถามมากมายเกี่ยวกับการคำนวณระยะทางระหว่างสถานที่และเส้นทาง:

นอกจากนี้คำถามที่คล้ายกันมากซึ่งฉันไม่สามารถคำนวณหรือยืนยันได้อย่างถูกต้อง:

นอกจากนี้ยังมีข้อมูลบางส่วนจากดร. คณิตศาสตร์เกี่ยวกับเรื่องนั้น อย่างไรก็ตามฉันไม่สามารถหาอัลกอริทึมในการคำนวณตำแหน่งในขั้นตอนที่ 3 ได้เนื่องจากฉันไม่ได้แตะพีชคณิต (เวกเตอร์) สักพักฉันไม่เข้าใจตรรกะในคำตอบเหล่านั้น

มีคนแสดงอัลกอริทึมให้ทำสิ่งนี้ได้ไหม วิธีการแก้ปัญหาในการเขียนโปรแกรมภาษาที่เหมาะสมจะดีกับฉัน


1
เนื่องจากดูเหมือนว่าสำคัญต่อ "การปฏิเสธ" ของคำถามอื่น ๆ ของคุณโปรดอธิบายอย่างละเอียดเกี่ยวกับ "ฉายตำแหน่งของฉันไปยังขอบนั้น" การฉายภาพอาจไม่อยู่บนขอบ ฉันเชื่อว่าปัญหานี้ได้รับการแก้ไขในคำถามอื่น ๆ (ทำได้ดีมากสำหรับการวิจัย BTW)
มาร์ติน F


@MartinF คำถามที่คำนวณระยะทางจากจุดหนึ่งไปยังอีกบรรทัดหนึ่ง แต่ไม่ใช่จุดที่อยู่ใกล้ที่สุดในบรรทัด
bouke

มีเป็นวิธีการแก้ปัญหาที่gis.stackexchange.com/a/23500/3195แม้ว่ามันจะเป็นอาจจะยากที่จะเข้าใจ
Martin F

อ่าใช่ขอบคุณฉันได้อัพเดทหมายเลขอ้างอิงแล้ว 3. 'การแก้ปัญหา' ในคำถามเฉพาะนั้นลิงก์ไปยังคำอธิบายทั่วไปของฟิลด์ปัญหา แม้ว่านี่จะเพียงพอสำหรับนักคณิตศาสตร์ที่มีพื้นฐานดี แต่ฉันไม่เข้าใจคณิตศาสตร์ในบทความนั้น
bouke

คำตอบ:


7

การใช้แบบจำลองทรงกลมของโลกอาจให้ความแม่นยำเพียงพอและนำไปสู่การคำนวณที่รวดเร็ว

แปลงพิกัดทั้งหมดเป็นพิกัดคาร์ทีเซียนที่มีศูนย์กลางของโลก (3D) ตัวอย่างเช่นสูตร

(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat))

จะทำ. (ใช้การวัดระยะทางซึ่งรัศมีของโลกเป็นหนึ่งหน่วยซึ่งสะดวกสบาย)

การเขียน X0 = (x0, y0, z0) สำหรับจุดเริ่มต้นและ X1 = (x1, y1, z1) สำหรับจุดปลายทางซึ่งกำหนดวงกลมใหญ่ (หาก X0 นั้นแตกต่างจาก X1 และทั้งสองไม่ตรงข้ามกัน) ให้ U เป็นผลิตภัณฑ์ครอสปกติของ X0 และ X1 สิ่งนี้คำนวณในสองขั้นตอน:

V = (xv, yv, zv) = (y0*z1 - z0*y1, z0*x1 - x0*z1, x0*y1 - y0*x1)

ความยาวของ V คือ

|V| = sqrt(xv^2 + yv^2 + zv^2)

การทำให้เป็นมาตรฐานยืดความยาว V เป็นหน่วย:

U = (xu, yu, zu) = V / |V| = (xv/|V|, yv/|V|, zv/|V|).

ระยะทาง 3 มิติที่มุ่งเน้นระหว่างจุดใดก็ตาม X = (x, y, z) และระนาบของวงกลมขนาดใหญ่นี้เป็นเพียงผลคูณดอทของ X กับ Z ที่กำหนดโดย

d = X * U = x*xu + y*yu + z*zu

จุดที่ใกล้ที่สุดในแง่ของระยะทางบนพื้นผิวของโลกที่เป็นหนึ่งที่ใกล้เคียงกับเครื่องบิน: จึงมีค่าสัมบูรณ์ที่เล็กที่สุดของd

รูป

รูปนี้แสดงวงกลมใหญ่ (สีดำ) ที่กำหนดโดยจุดสีขาวสองจุดและจุดสุ่ม 2000 จุดบนทรงกลมที่มีสีและแรเงาตามระยะทาง 3 มิติที่แน่นอนไปยังระนาบของวงกลมขนาดใหญ่นั้น นั่นคือ | d |

เมื่อพบจุดที่ใกล้ที่สุดแล้วให้ฉายไปยังวงกลมขนาดใหญ่โดยเริ่มจากการฉายไปยังระนาบวงกลมใหญ่ (ในแบบ 3 มิติ) จากนั้นขยายรัศมีออกไปสู่ผิวโลก การฉายเพียงลบ d * U:

X' = (x', y', z') = X - d*U = (x - d*xu, y - d*yu, z - d*zu).

การฉายในแนวรัศมีนั้นทำให้ X 'renormalizes แบบเดียวกับที่ V ถูกทำให้เป็นรูปเป็นร่างใหม่:

X'' = X' / |X'|.

(นี่จะเป็นปัญหาถ้า | X '| = 0 ซึ่งเกิดขึ้นเมื่อจุดที่ใกล้ที่สุดคือหนึ่งในเสาของวงกลมใหญ่รวมการทดสอบในโค้ดสำหรับเงื่อนไขนี้ถ้ามันสามารถเกิดขึ้นได้และจัดการแยกต่างหาก ใช้เครื่องหมายของdเพื่อระบุว่าขั้วใด)

หากต้องการแปลงพิกัดของ X '' กลับไป (ลาดพร้าว, lon) โดยใช้สูตรปกติ


หนึ่งคำถาม. พิจารณากรณีที่ไม่ผิดปกติมากเกินไปซึ่งเราสามารถเลือก X1 และ X0 ใด ๆ (บนวงกลมใหญ่) จากมุมมองของความถูกต้องดีกว่าที่จะเลือก X1 และ X0 ใกล้หรือไกลออกไป (อีกครั้งว่า X0 แตกต่างจาก X1 และ ทั้งสองไม่ตรงกันข้ามตรงกันข้าม)?
user189035

1
@ user189035 เลือกพวกมัน 90 องศา เมื่อพวกเขาอยู่ใกล้มากผลิตภัณฑ์ข้ามของพวกเขามีความไม่แน่นอนเชิงตัวเลข: มีการยกเลิกจำนวนมากในการลบซึ่งนำไปสู่การสูญเสียตัวเลขที่สำคัญ
whuber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.