Küresel Mercator ile bölgelendirilmiş UTM arasındaki mesafenin ölçülmesi


11

WGS84 enlem / boylamda puanlarım var ve aralarındaki "küçük" (5 km'den az) mesafeleri ölçmek istiyorum.

Http://www.movable-type.co.uk/scripts/latlong.html adresinden haversin formülünü kullanabilirim ve çok iyi çalışıyor.

Yine de Python Shapely kütüphanelerini kullanmak istiyorum, böylece sadece mesafeden daha fazla işlem yapabiliyorum ve çalıştığım ölçekte düz bir dünya yeterince iyi bir yaklaşım. Coğrafi koordinatları güvenilir bir şekilde kartezyen bir koordine yansıtmak için Python'ları kullanıyorum proj4, ancak istediğimden daha büyük hatalar alıyor gibi görünüyor.

Yerel UTM bölgesini kullanırsam, birkaç metrelik haversin arasında farklar elde ederim, ki bu iyi. Ama UTM bölgesini çalışmak zorunda değilim (noktalar dünya çapında olabilir), bu yüzden "küresel Mercator" ile denedim ama şimdi haversin ve öngörülen mesafeler arasındaki farklar% 100'ün üzerinde. Küresel Mercator için bu gerçekten doğru mu? Gerçekten tek istediğim, dünyanın herhangi bir yerinde 5 km'lik iki nokta için uygulanabilir bir Kartezyen projeksiyon.

from shapely.geometry import Point
from pyproj import Proj

proj = Proj(proj='utm',zone=27,ellps='WGS84')
#proj = Proj(init="epsg:3785")  # spherical mercator, should work anywhere...

point1_geo = (-21.9309694, 64.1455718)
point2_geo = (-21.9372481, 64.1478206)
point1 = proj(point1_geo[0], point1_geo[1])
point2 = proj(point2_geo[0], point2_geo[1])

point1_cart = Point(point1)
point2_cart = Point(point2)

print "p1-p2 (haversine)", hdistance(point1_geo, point2_geo)
print "p1-p2 (cartesian)", point1_cart.distance(point2_cart)

Bu noktada, aralarındaki haversin mesafesi 394m ve utm bölgesi 27, 395m'dir. Ancak küresel Mercator kullanırsam, Kartezyen mesafesi 904m'dir, bu da yoldan çıkar.


UTM bölgesinin boylamlarına göre "çalışması" kolaydır. Tipik bir boylam lambda, -180 <= lambda <180 seçin ve bölge numarasını Int ((180 + lambda) / 6) +1 olarak hesaplamak için kullanın. Kuzey ve güney arasında karar vermek için enlem işaretini kullanın. Özel kutup bölgelerini yüksek enlemlerde kullanmanıza gerek yoktur; aslında, bir direğe çok yakın neredeyse her UTM bölgesini kullanabilirsiniz.
whuber

Yanıtlar:


17

Evet, bu tür hataları global bir Mercator projeksiyonu ile alacaksınız: ekvatorda doğrudur ve bozulma ekvatordan enlem ile katlanarak artar. Mesafe bozulması 60 derece enlemde tam olarak 2'dir (% 100). Test enlemlerinizde (64.14 derece), 904/394 = 2.294 oranını tam olarak kabul ederek 2.294'lük bir çarpıtma hesaplıyorum. (Daha önce 2.301'i hesapladım ama bu WGS84 elipsoidine değil, bir küreye dayanıyordu. Fark (% 0.3)) bize küre bazlı Haversine formülüne karşı elipsoid bazlı bir projeksiyon kullanarak elde edebileceğiniz doğruluk hissi veriyor. )

Global projeksiyon diye her yerde son derece hassas mesafeler veren bir şey yoktur. UTM bölge sisteminin kullanılmasının bir nedeni budur!

Bir çözüm, tüm hesaplamalarınız için küresel geometri kullanmaktır, ancak bunu reddettiniz (bu, karmaşık işlemler yapacaksanız mantıklıdır, ancak karar yeniden gözden geçirilmeye değer olabilir).

Başka bir çözüm, projeksiyonu karşılaştırılan noktalara uyarlamaktır . Örneğin, ilgi çekici bölgenin merkezine yakın bir meridyen ile enine Mercator'u (UTM sisteminde olduğu gibi) güvenle kullanabilirsiniz. Meridyeni taşımak basit bir şeydir: meridyenin boylamını tüm boylamlardan çıkarın ve Prime Meridian merkezli tek bir TM projeksiyonu kullanın (UTM sisteminin 0.9996'sı yerine 1 ölçek faktörü ile). İşiniz için bu daha fazla olma eğiliminde olacakUTM kullanmaktan daha doğrudur. Doğru açıları verecektir (TM uyumludur) ve sadece birkaç on kilometre ile ayrılmış noktalar için oldukça doğru olacaktır: altı basamaklı doğruluktan daha iyi bekliyoruz. Aslında, bu uyarlanmış TM mesafeleri ve Haversine mesafeleri arasındaki küçük farklılıkları, elipsoid (TM projeksiyonu için kullanılır) ve küre (Haversine tarafından kullanılan) arasındaki farka atfetmeye eğilimliydim. projeksiyon.


Bu kulağa mükemmel geliyor, sanırım mevcut EPSG dizelerinden herhangi birini kullanmak yerine, proj4 için kendi init dizgimi yapmam gerekiyor mu?
Karl P

1
+1 projeksiyonu noktalara uyarlar. Enine Mercator yerine enine plaka carrée'yi tercih ederim, ancak yeterince küçük alanlarda ("büyük ölçekli"), ilgilenilen bölgeye yakın "ortalanmış" hemen hemen her projeksiyon iyi doğruluk sağlayacaktır.
David Cary

@David İlginç bir fikir. Küre üzerinde enine Plaka Carree (Cassini) gis.stackexchange.com/posts/2964/edit adresinde verdiğim yaklaşık formüle yakın olacaktır (burada kabul edilebilir bir çözüm olabilir). TM ve TPC için formüller kürede benzerdir; elipsoidde, TPC biraz daha basittir. TM muhtemelen daha fazla yazılım tarafından desteklenmektedir.
whuber

@Karl İsterseniz TM bölgelerinden herhangi birini kullanabilirsiniz. İlgilendiğiniz bölgedeki merkezi bir nokta, seçilen bölgenin merkezi meridyeni ile çakışacak şekilde tüm boylamları kaydırın. Tüm mesafeleri 1 / 0.9996 ile çarpın (ve tüm alanları bu faktörün karesiyle çarpın), açıları veya yatakları değiştirmeyin ve - hesaplamalarınız yeni noktalar üretiyorsa - boylamlarını orijinal koordinat sistemine geri kaydırın .
whuber

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.