Mengukur jarak dalam Mercator bulat vs UTM yang dikategorikan

11

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.

Karl P.
sumber
Zona UTM mudah untuk "diselesaikan" berdasarkan garis bujur. Pilih lambda bujur yang khas, -180 <= lambda <180, dan gunakan untuk menghitung nomor zona sebagai Int ((180 + lambda) / 6) +1. Gunakan tanda garis lintang untuk memutuskan antara utara dan selatan. Anda tidak perlu menggunakan zona kutub khusus di lintang tinggi; pada kenyataannya, sangat dekat dengan tiang Anda dapat menggunakan hampir semua zona UTM.
whuber

Jawaban:

17

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.

whuber
sumber
Kedengarannya cukup sempurna, saya kira saya perlu membuat init string saya sendiri untuk proj4, daripada menggunakan string EPSG yang ada?
Karl P
1
+1 menyesuaikan proyeksi ke titik. Saya lebih suka pelat transversal transversal daripada Mercator transversal, tetapi di atas area yang cukup kecil ("skala besar"), hampir semua proyeksi "terpusat" di dekat wilayah yang diminati akan memberikan akurasi yang baik.
David Cary
@ David ide yang menarik. Di bidang itu, pelat Carree melintang (Cassini) akan mendekati formula perkiraan yang saya berikan di gis.stackexchange.com/posts/2964/edit (yang mungkin merupakan solusi yang dapat diterima di sini). Rumus untuk TM dan TPC serupa di bola; pada ellipsoid, TPC sedikit lebih sederhana. TM mungkin didukung oleh lebih banyak perangkat lunak.
whuber
@Karl Anda bisa menggunakan zona TM mana pun jika diinginkan. Geser semua garis bujur sehingga titik pusat di wilayah yang Anda minati bertepatan dengan meridian pusat zona yang dipilih. Lipat gandakan semua jarak dengan 1 / 0.9996 (dan gandakan semua area dengan kuadrat dari faktor ini), jangan ubah sudut atau bantalan, dan - jika perhitungan Anda menghasilkan titik baru - geser saja garis bujurnya kembali ke sistem koordinat asli .
whuber
0

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.

Ian Turton
sumber