Saya punya poin di WGS84 lat / panjang dan saya ingin mengukur jarak "kecil" (kurang dari 5km) di antara mereka.
Saya dapat menggunakan rumus haversine dari http://www.movable-type.co.uk/scripts/latlong.html dan itu berfungsi dengan sangat baik.
Saya ingin menggunakan Python Shapely libraries, sehingga saya bisa melakukan lebih banyak operasi daripada hanya jarak, dan karena pada skala yang saya kerjakan, bumi yang rata adalah perkiraan yang cukup baik. Untuk memproyeksikan koordinat geografis dengan andal ke coes kartesius, saya menggunakan Python proj4
, tetapi tampaknya mendapatkan kesalahan yang lebih besar daripada yang saya inginkan.
Jika saya menggunakan zona UTM lokal, saya mendapatkan perbedaan antara haversine beberapa meter, yang baik-baik saja. Tapi saya tidak ingin harus bekerja di zona UTM (poin bisa di seluruh dunia), jadi saya mencoba dengan "Mercator bola" tetapi sekarang perbedaan antara jarak haversine dan proyeksi lebih dari 100%. Apakah ini benar untuk Mercator bola? Yang saya inginkan adalah proyeksi Cartesian yang bisa diterapkan untuk dua titik dalam jarak 5 km satu sama lain di mana pun di dunia.
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)
Pada titik ini, jarak haversine di antara mereka adalah 394m, dan menggunakan zona utm 27, 395m. Tetapi jika saya menggunakan Mercator bola, jarak Cartesian adalah 904m, yang jauh.
sumber
Jawaban:
Ya, Anda akan mendapatkan kesalahan semacam ini dengan proyeksi Mercator global: akurat di ekuator dan distorsi meningkat secara eksponensial dengan garis lintang menjauh dari khatulistiwa. Distorsi jarak persis 2 (100%) pada garis lintang 60 derajat. Di lintang pengujian Anda (64,14 derajat) saya menghitung distorsi 2,294, persis setuju dengan rasio 904/394 = 2,294. (Sebelumnya saya menghitung 2,301 tapi itu didasarkan pada bola, bukan ellipsoid WGS84. Perbedaannya (0,3%) memberi kita rasa keakuratan yang mungkin Anda peroleh dengan menggunakan proyeksi berbasis ellipsoid versus rumus Haversine berbasis-bola. )
Tidak ada yang namanya proyeksi global yang menghasilkan jarak yang sangat akurat di mana-mana. Itulah salah satu alasan digunakannya sistem zona UTM!
Salah satu solusinya adalah menggunakan geometri bola untuk semua perhitungan Anda, tetapi Anda telah menolaknya (yang masuk akal jika Anda akan melakukan operasi yang rumit, tetapi keputusan itu mungkin perlu ditinjau kembali).
Solusi lain adalah menyesuaikan proyeksi dengan poin yang dibandingkan . Misalnya, Anda dapat menggunakan Mercator transversal dengan aman (seperti pada sistem UTM) dengan meridian yang terletak di dekat pusat wilayah yang diminati. Memindahkan meridian adalah hal yang mudah dilakukan: kurangi garis bujur meridian dari semua bujur dan gunakan proyeksi TM tunggal yang berpusat di Prime Meridian (dengan faktor skala 1, daripada 0,9996 dari sistem UTM). Untuk pekerjaan Anda, ini cenderung lebihakurat daripada menggunakan UTM itu sendiri. Ini akan memberikan sudut yang benar (TM adalah konformal) dan akan sangat akurat untuk titik yang dipisahkan oleh hanya beberapa puluh kilometer: berharap lebih baik daripada akurasi enam digit. Bahkan, saya akan cenderung untuk atribut perbedaan kecil antara jarak TM-yang disesuaikan dan jarak Haversine dengan perbedaan antara ellipsoid (digunakan untuk proyeksi TM) dan bola (digunakan oleh Haversine), daripada distorsi dalam proyeksi.
sumber
Saya belum mencoba ini tetapi dari dokumentasi sepertinya Anda dapat menggunakan http://search.cpan.org/ ~ grahamc/Geo-Coordinates-UTM-0.08/UTM.pm#latlon_to_utm untuk mendapatkan dari pasangan lat / lon (plus ellipsoid) ke UTM Zone dan daftar koordinat. Kemudian Anda dapat melanjutkan perhitungan Anda seperti sebelumnya.
sumber