อัลกอริทึมสำหรับการชดเชยละติจูด / ลองจิจูดด้วยจำนวนเมตร


108

ฉันกำลังมองหาอัลกอริทึมซึ่งเมื่อได้รับละติจูดและลองจิจูดคู่และการแปลเวกเตอร์เป็นเมตรในพิกัดคาร์ทีเซียน (x, y) จะให้พิกัดใหม่กับฉัน จัดเรียงของเช่น Haversine ย้อนกลับ ฉันยังสามารถทำงานกับระยะทางและการแปลงหัวเรื่องได้ แต่นี่อาจจะช้ากว่าและไม่แม่นยำ ในอุดมคติแล้วอัลกอริทึมควรจะรวดเร็วเมื่อฉันทำงานกับระบบฝังตัว ความแม่นยำไม่ใช่เรื่องสำคัญภายในระยะ 10 เมตรก็น่าจะดี


ดังนั้นคุณจะสร้างแบบจำลองโลกได้ดีในรูปทรงกลมหรือไม่?
underdark

1
ใช่ว่าจะไม่เป็นไรตามที่ฉันคาดหวัง <1km ออฟเซ็ต
โทมัส O

คำตอบ:


107

หากการกระจัดของคุณไม่ดีเกินไป (น้อยกว่าสองสามกิโลเมตร) และคุณไม่ได้อยู่ที่เสาให้ใช้การประมาณที่รวดเร็วและสกปรกที่ทิศทาง 111,111 เมตร (111.111 กิโลเมตร) ในทิศทาง y คือ 1 องศา (ละติจูด) และ เมตร 111,111 * cos (ละติจูด) ในทิศทาง x คือ 1 องศา (จากลองจิจูด)


3
@ โทมัส: จริงๆแล้วคุณอยู่ใกล้กับเสามาก ฉันตรวจสอบเทียบกับการคำนวณ UTM โดยใช้ x- และ y-displacements เท่ากันที่ 1400 m (ดังนั้นการกระจัดทั้งหมดคือ 2 กม.) ผลลัพธ์ดีถึง 8.6 เมตรหรือดีกว่า ละติจูดที่แย่ที่สุด (สำหรับทิศทางนี้และปริมาณการกระจัด) คือ 81 องศา: การประมาณนั้นแม่นยำยิ่งขึ้นเมื่อคุณเคลื่อนที่ไปทางเหนือและความผิดพลาดจะอยู่ต่ำกว่า 10 เมตรจนกว่าคุณจะเกิน 89.6 องศา!
whuber

60
อนึ่งตัวเลขเวทย์มนตร์ของ 111,111 นั้นง่ายต่อการจดจำโดยรู้ประวัติบางอย่าง: ชาวฝรั่งเศสได้กำหนดค่ามิเตอร์ไว้เพื่อให้ 10 ^ 7 เมตรเป็นระยะทางตามเส้นลมปราณปารีสจากเส้นศูนย์สูตรไปจนถึงขั้วโลกเหนือ ดังนั้น 10 ^ 7/90 = 111,111.1 เมตรเท่ากับละติจูดหนึ่งองศาภายในขีดความสามารถของนักสำรวจชาวฝรั่งเศสเมื่อสองศตวรรษก่อน
whuber

3
ด้วยสูตรถ้าฉันต้องการย้าย + 100m ในทิศทาง y จากพูด 10.0 N, 10.0 E ฉันจะเพิ่ม 100/111111 หรือไม่ หากเคลื่อนที่ในทิศทาง x + 100m จะเป็น 100 ÷ (111,111 × (cos 10)) หรือไม่ แค่ทำให้แน่ใจว่าฉันมีสิทธิ์
โทมัส O

5
@ โทมัสใช่แล้ว โปรดสังเกตว่าสูตรที่สองขยายการกระจัดที่เห็นได้ชัด x (โดยอาศัยการหารด้วยจำนวนที่น้อยกว่า 1) เท่าที่ควรเนื่องจากระดับลองจิจูดมีขนาดเล็กลงเมื่อคุณเลื่อนไปทางขั้วจากเส้นศูนย์สูตร ข้อผูกมัดที่มีศักยภาพเพียงอย่างเดียวคือการทำให้แน่ใจว่าคุณและแพลตฟอร์มซอฟต์แวร์ของคุณเห็นด้วยกับ "cos" หมายความว่าอะไร: มันตีความได้ดีกว่า cos (10) เป็นโคไซน์ของ 10 องศาไม่ใช่เรเดียน 10! (หากไม่ใช่ 10 องศา = 10 * pi / 180 เรเดียนแสดงให้เห็นถึงการแปลงอย่างง่าย) ณ จุดนี้รหัสที่นำเสนอโดย @haakon_d ควรเป็นข้อมูลที่สมบูรณ์สำหรับคุณ
whuber

7
มีคนพยายามแก้ไขคำตอบนี้เพื่อแทนที่ "เมตร" ด้วย "กม." พวกเขาอาจกำลังอ่านเครื่องหมายจุลภาค "," ในความหมายของทศนิยมแบบยุโรป ฉันทำตามแบบแผนของอเมริกา (ซึ่งฉันเชื่อว่าเป็นแบบแผนของสิ่งพิมพ์ระหว่างประเทศด้วย) ของการใช้เครื่องหมายจุลภาคเพื่อแยกสตริงตัวเลขยาวออกเป็นกลุ่มที่สามและจุดทศนิยม "." แทนเครื่องหมายจุลภาค (การใช้งานนี้แสดงให้เห็นอย่างชัดเจนในความคิดเห็นก่อนหน้า) เพื่อหลีกเลี่ยงความคลุมเครือใด ๆ ฉันได้แก้ไขคำตอบเพื่อแสดงให้เห็นอย่างชัดเจนว่าเครื่องหมายจุลภาคและจุดหมายถึงอะไร
whuber

56

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

แต่ถ้าคุณยินดีที่จะยอมรับข้อผิดพลาดที่สูงกว่า 10 ม. สำหรับคะแนนชดเชยมากกว่า 200 เมตรโดยประมาณคุณอาจใช้การคำนวณแบบพื้นราบที่เรียบง่าย ฉันคิดว่าข้อผิดพลาดยังคงน้อยกว่า 50 ม. สำหรับออฟเซ็ตสูงสุด 1 กม

 //Position, decimal degrees
 lat = 51.0
 lon = 0.0

 //Earth’s radius, sphere
 R=6378137

 //offsets in meters
 dn = 100
 de = 100

 //Coordinate offsets in radians
 dLat = dn/R
 dLon = de/(R*Cos(Pi*lat/180))

 //OffsetPosition, decimal degrees
 latO = lat + dLat * 180/Pi
 lonO = lon + dLon * 180/Pi 

สิ่งนี้ควรกลับมา:

 latO = 51,00089832
 lonO = 0,001427437

7
ฉันแค่ต้องการชี้ให้เห็นว่าสิ่งนี้เป็นเหมือนคำตอบที่ฉันให้ไว้ยกเว้นคุณได้เปลี่ยนค่าของฉันที่ 111,111 เมตรต่อการศึกษาระดับปริญญาเป็น 111,319.5 ค่าของคุณจะดีกว่าเล็กน้อยที่ละติจูดสูง แต่แย่ลงในละติจูดต่ำกว่าเล็กน้อย (จาก 0 ถึงประมาณ 40 องศา) ค่าทั้งสองตรงตามข้อกำหนดความถูกต้องที่ระบุไว้
whuber

1
+1 สำหรับการให้รหัส โปรดทราบว่ามันแม่นยำกว่าที่คุณสงสัย (โดยปกติแล้วข้อผิดพลาดจะน้อยกว่า 5 ม. มากกว่า 2000 ม.)
whuber

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

1
นั่นคือจุดที่ยอดเยี่ยม: เราได้สันนิษฐานว่าโดยปริยาย x-displacement อยู่ใกล้กับทิศตะวันออก - ตะวันตกที่แท้จริงและ y-displacement อยู่ใกล้กับทิศเหนือ - ใต้ ถ้าไม่พวกเขาจะต้องถูกแปลงเป็นแทนที่ EW และ NS เทียบเท่า (ไม่ใช่แค่ "eastings" และ "northings") ก่อนคำนวณ lat-lon ของพวกเขาเทียบเท่า
whuber

พารามิเตอร์ d distance ของสมการการบินสูตรเป็นเรเดียนเช่น (distance / radius-of-earth)
user1089933

23

ฉันพบว่า Aviation Formulary ที่นี่ยอดเยี่ยมสำหรับสูตรและอัลกอริธึมประเภทนี้ สำหรับปัญหาของคุณลองดู "รัศมี / lat ที่กำหนดและระยะทางไกล": ที่นี่

โปรดทราบว่าอัลกอริทึมนี้อาจซับซ้อนเกินไปสำหรับการใช้งานของคุณหากคุณต้องการใช้ฟังก์ชันตรีโกณมิติต่ำ ๆ เป็นต้น


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

2

มันอาจเข้าท่าที่จะฉายจุดก่อน คุณสามารถทำบางอย่างเช่นรหัสหลอกนี้:

falt_coordinate = latlon_to_utm(original_koordinate)
new_flat_coordinate = flat_coordinate + (x,y)
result_coordinate = utm_to_latlon(new_flat_coordinate)

โดยที่ (x, y) เป็น offset ที่ต้องการ

คุณไม่จำเป็นต้องใช้ utm หรือระบบพิกัดแบบแบนใด ๆ ที่เหมาะสมในพื้นที่ของคุณ

คุณทำงานกับซอฟต์แวร์อะไร


0

ฉันสร้างแผนที่แบบกำหนดเองอย่างง่ายบน Google Maps ซึ่งแสดงขั้นตอนวิธีการประมาณที่กล่าวถึงโดยคำตอบที่ยอมรับ (1/111111 == หนึ่งเมตร) รู้สึกอิสระที่จะเห็นและเล่นกับมันที่นี่:

https://drive.google.com/open?id=1XWlZ8BM00PIZ4qk43DieoJjcXjK4z7xe&usp=sharing

ป้อนคำอธิบายรูปภาพที่นี่

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