Enlem / boylamı bir miktar metre ile dengelemek için kullanılan algoritma


108

Enlem ve boylam çifti verildiğinde ve metre cinsinden Kartezyen koordinatlarda (x, y) bir vektör çevirisinin bana yeni bir koordinat vereceği bir algoritma arıyorum. Bir ters Haversine gibi. Aynı zamanda mesafe ve başlık dönüşümü ile de çalışabilirim, ancak bu muhtemelen daha yavaş ve doğru olmaz. İdeal olarak, gömülü bir sistem üzerinde çalışırken algoritma hızlı olmalıdır. Doğruluk kritik değildir, 10 metre içinde iyi olurdu.


Öyleyse dünyayı bir küre olarak modelleyebilecek misin?
underdark

1
Evet, <1km ofset beklediğimden bu iyi olurdu.
Thomas O

Yanıtlar:


107

Eğer yer değiştirmeleriniz çok büyük değilse (birkaç kilometreden daha az) ve direklerde haklı değilseniz, y yönünde 111,111 metre (111.111 km) 1 derece (enlem) ve 111,111 * cos (enlem) metre x yönünde 1 derecedir (boylam).


3
@ Tomolar: Aslında, kutuplara çok yakın olabilirsiniz. 1400 m'lik eşit x ve y-yer değiştirmelerini kullanarak UTM hesaplamasını kontrol ettim (toplam yer değiştirme 2 km'dir). Sonuçlar 8,6 metre veya daha iyidir. En kötü enlem (bu yön ve yer değiştirme miktarı için) 81 derecedir: kuzeye doğru hareket ettiğinizde yaklaşım yaklaşık olarak daha kesinleşir ve hata 89.6 derecenin üzerine çıkıncaya kadar 10 metrenin altında kalır!
whuber

60
Bu arada, 111.111'in bu sihirli sayıları, bazı tarihi bilerek hatırlamak kolaydır: Fransızlar, başlangıçta , 10 ^ 7 metrenin Paris meridyeni boyunca ekvatordan kuzey kutbuna kadar olan mesafe olacağını tanımladılar . Böylece, 10 ^ 7/90 = 111.111.1 metre, iki yüzyıl önce Fransız sörveyörlerin yetenekleri ile bir dereceye kadar enlemdedir.
whuber

3
Yani formül ile + 100m'yi y yönünde 10.0 N, 10.0 E deyimiyle hareket ettirmek istesem, 100/111111 ekler miydim? + 100m x yönünde hareket ediyorsa, 100 ÷ (111,111 × (cos 10)) olur mu? Sadece bunu doğru yaptığımdan emin olmak için.
Thomas O

5
@Tomolar Evet, doğru. İkinci formülün görünür x-yer değiştirmeyi nasıl genişlettiğini (1'den küçük bir sayıya bölünerek) olması gerektiği gibi genişlettiğine dikkat edin, çünkü ekvatordan kutuplara doğru ilerlerken bir boylam derecesi daha küçük olur. Tek olası aksilik sizin ve yazılım platformunuzun "cos" nin ne anlama geldiğine karar verdiğinizden emin olmanızdır: cos (10) 'u 10 radyan değil , 10 derece kosinüs olarak daha iyi yorumladı ! (Değilse, 10 derece = 10 * pi / 180 radyan basit dönüşümü gösterir.) Bu noktada, @haakon_d tarafından sunulan kod tam anlamıyla anlam ifade etmelidir.
whuber

7
Biri bu cevabı "metre" yerine "km" ile değiştirmeye çalıştı. Muhtemelen virgül "," Avrupa'yı ondalık virgülle okuyorlardı. Amerikan rakamlarını (uluslararası yayınların sözleşmesi olduğuna inanıyorum) uzun basamaklı dizeleri üçlü gruplara ayırmak için virgül kullanmaya ve ondalık basamağa "." virgül yerine. (Bu kullanım önceki yorumlarda açıkça gösterilmiştir.) Herhangi bir belirsizliği önlemek için cevabı, virgül ve puanın ne anlama geldiğini açıkça göstermek için düzenledim.
whuber

56

Liedman'ın cevabında dediği gibi Williams havacılık formülleri paha biçilemez bir kaynaktır ve 1 km'ye kadar yer değiştirmeler için doğruluğu 10 metre içinde tutmak için muhtemelen bunların daha karmaşıkını kullanmanız gerekecektir.

Ancak, yaklaşık 200 metreden fazla kayma noktaları için 10 metrenin üzerindeki hataları kabul etmeye istekliyseniz, basitleştirilmiş bir düz toprak hesaplaması kullanabilirsiniz. Bence 1 km'ye kadar olan ofsetlerde hatalar hala 50 metreden az olacak.

 //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 

Bu geri dönmeli:

 latO = 51,00089832
 lonO = 0,001427437

7
Sadece bunun, verdiğim cevapla aynı olduğunu, ancak derece için 111.111 metre değerimi 111.319.5 ile değiştirmiş olduğumuzu belirtmek istiyorum. Değeriniz yüksek enlemlerde biraz daha iyidir, ancak daha düşük enlemlerde biraz daha kötüdür (0 - 40 derece arası). Her iki değer de belirtilen doğruluk gereksinimlerini karşılar.
whuber

1
Kod sağlamak için +1. Şüphelendiğinizden daha doğru olduğunu unutmayın (hata genellikle 2000 metrede 5 metreden azdır).
whuber

1
Cevabımda bunun, R'nin değeri dışında sizin için özde bir çözüm olduğuna dair bir yorum ekleyip eklememem gerektiğini merak ettim, ama kısalık nedeniyle bıraktım. Hassasiyet söz konusu olduğunda, sisteme herhangi bir dönme hatası eklemediğiniz sürece haklısınızdır. Yerel olarak öngörülen bir koordinat sisteminde ölçülen ofsetlerin kullanılması, dönme hataları oldukça büyük olabilir.
haakon_d

1
Bu mükemmel bir nokta: x-yer değiştirmesinin en azından gerçek doğu-batıya yakın olduğunu ve y-yer değiştirmenin kuzey-güneye yakın olduğunu varsaydık . Olmazsa, latonon eşdeğerlerini hesaplamadan önce eşdeğer EW ve NS yer değiştirmelerine (sadece "doğu" ve "kuzey") dönüştürülmeleri gerekir.
whuber

Aviation Formulary denklemlerinin d mesafe parametresi radyan cinsindendir, örneğin (dünyanın uzaklığı / yarıçapı).
user1089933 15:12

23

Ben Havacılık formüler bulmak burada formüller ve algoritmalar bu tür için mükemmeldir. Sorununuz için "enlem / boylamda verilen radyal ve mesafeyi" kontrol edin: burada

Trigonometri işlevlerinin kullanımını düşük tutmak istiyorsanız bu algoritmanın kullanımınız için biraz karmaşık olabileceğini unutmayın.


Bunun için teşekkürler - ideal görünüyor. Yine de mesafenin metre cinsinden mi yoksa başka bir ölçüm mü olduğunu çözemiyorum.
Thomas O

2

İlk önce noktayı yansıtmak mantıklı olabilir. Bu sözde kod gibi bir şey yapabilirsiniz:

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

burada (x, y) istenen uzaklıktır.

Utm kullanmanıza gerek yok, bölgenizde yapacağınız herhangi bir düz koordinat sistemi var.

Hangi yazılımla çalışıyorsunuz?


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.