Apakah menggunakan vincenty atau haversine atau hukum kosinus bulat, ada kebijaksanaan untuk mengetahui setiap masalah potensial dengan kode yang Anda rencanakan untuk digunakan, hal-hal yang harus diperhatikan dan dikurangi, dan bagaimana seseorang berurusan dengan vincenty vs haversine vs masalah sloc akan berbeda ketika seseorang menyadari masalah / edgecases masing-masing, yang mungkin atau mungkin tidak dikenal. Pemrogram berpengalaman tahu ini. Pemula mungkin tidak. Saya berharap dapat menghindarkan sebagian dari mereka frustrasi ketika cuplikan dari forum melakukan sesuatu yang tidak terduga, dalam kasus tertentu. Jika seseorang benar-benar akan menggunakan beberapa versi dari semua ini, vincenty, haversine, sloc, maka SE, SO, Reddit, Quora, dll, mungkin telah memberikan bantuan terbatas dalam beberapa pengkodean awal dari suatu solusi, tetapi itu tidak berarti bahwa solusi mereka atau 'jawaban' yang diterima bebas dari masalah. Jika suatu proyek cukup penting, maka layak untuk dilakukan sejumlah penelitian yang wajar. Baca manual, baca dokumen, dan jika ada tinjauan kode dari kode itu, baca itu. Menyalin dan menempelkan potongan atau intisari yang telah di-upgrade seratus kali atau lebih tidak berarti keamanannya komprehensif dan terjamin.
Jawaban yang menarik yang diposting oleh cffk meningkatkan kesadaran akan edgecases, dalam solusi paket, yang dapat menghasilkan pengecualian atau kesulitan lain . Klaim khusus yang dibuat dalam pos itu berada di luar anggaran waktu saya untuk mengejar saat ini, tetapi saya mengambil darinya bahwa memang ada masalah yang mengintai dalam paket tertentu, termasuk setidaknya satu implementasi vincenty, mengenai yang setidaknya satu orang telah mengusulkan untuk meningkatkan dengan satu atau lain cara, untuk meminimalkan atau menghilangkan risiko menghadapi kesulitan-kesulitan itu. Saya tidak akan menambahkan lebih jauh ke topik itu mengenai vincenty (terlalu bodoh tentang hal itu), tetapi sebaliknya akan beralih ke haversine, setidaknya sebagian pada topik dengan OP.
Rumus haversine yang diterbitkan secara populer, baik dengan python atau bahasa lain, karena itu kemungkinan besar akan menggunakan spesifikasi floating point IEEE 754 pada sebagian besar semua sistem seperti intel dan intel saat ini, dan prosesor ARM, powerPC, dll. juga rentan terhadap kesalahan pengecualian yang jarang tetapi nyata dan berulang yang sangat dekat atau pada jarak busur 180 derajat, titik-titik antipodal, karena pendekatan dan pembulatan titik apung. Beberapa pemula mungkin belum tergigit oleh situasi ini. Karena spesifikasi fp ini mendekati dan bulat, ini tidak berarti bahwa kode apa pun yang memanggil fp64 dapat menyebabkan kesalahan pengecualian, tidak. Tetapi beberapa kode, beberapa rumus mungkin tidak memiliki edgecases yang sangat jelas di mana perkiraan dan pembulatan IEEE 754 fp64 dapat menyebabkan nilai menyimpang sedikit dari domain metode matematika yang diharapkan dengan sempurna mengevaluasi nilai tersebut. Contoh ... sqrt (). Jika nilai negatif menemukan jalannya menjadi sqrt (), seperti sqrt (-0.00000000000000000000122739), akan ada kesalahan pengecualian. Dalam rumus haversine, cara pengembangannya menuju solusi, ada dua metode sqrt () di atan2 (). Itua yang dihitung dan kemudian digunakan dalam sqrt (), dapat, pada titik-titik antipodal di dunia, sedikit tersesat di bawah 0,0 atau di atas 1,0, sangat sedikit karena pendekatan fp64 dan pembulatan, jarang, tetapi berulang. Pengulangan yang konsisten dan dapat diandalkan, dalam konteks ini, menjadikan ini sebagai risiko pengecualian, suatu dasar untuk melindungi, memitigasi, dan bukan kebetulan acak yang terisolasi. Berikut adalah contoh potongan python3 pendek haversine, tanpa perlindungan yang diperlukan:
import math as m
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
Sangat dekat atau pada titik-titik antipodal, sebuah dihitung di baris pertama dari rumus mungkin nyasar negatif, jarang, tapi repeatably dengan koordinat tersebut lon lat yang sama. Untuk melindungi / memperbaiki mereka kejadian langka, satu hanya dapat menambahkan, setelah sebuah perhitungan, seperti yang terlihat di bawah ini:
import math as m
note = ''
a = m.sin(dlat / 2)**2 + m.cos(lat1) * m.cos(lat2) * m.sin(dlon / 2)**2
if a < 0.0: a = 0.0 ; note = '*'
if a > 1.0: a = 1.0 ; note = '**'
c = 2 * m.atan2(m.sqrt(a), m.sqrt(1 - a))
distance = Radius * c
# note = '*' # a went below 0.0 and was normalized back to 0.0
# note = '**' # a went above 1.0 and was normalized back to max of 1.0
Tentu saja saya tidak menunjukkan seluruh fungsi di sini, tetapi potongan pendek seperti yang sering diposting. Tapi ini menunjukkan perlindungan untuk sqrt (), dengan menguji a , dan menormalkannya jika perlu, juga menghemat kebutuhan untuk mencoba semuanya kecuali. Note = '' di bagian atas adalah untuk mencegah tahap bytecode dari memprotes note yang sedang digunakan sebelum diberi nilai, jika dikembalikan dengan hasil fungsi.
Dengan perubahan sederhana ini, menambahkan dua sebuah tes, sqrt () fungsi akan senang, dan kode sekarang memiliki tambahan catatan yang dapat dikembalikan ke memanggil kode, untuk peringatan bahwa hasilnya telah sedikit dinormalisasi, dan mengapa. Beberapa mungkin peduli, beberapa mungkin tidak, tetapi ada di sana, mencegah kesalahan pengecualian, yang 'dapat' terjadi. Coba kecuali blok dapat menangkap pengecualian, tetapi tidak memperbaikinya, kecuali secara tertulis ditulis untuk melakukannya. Tampaknya lebih mudah untuk kode garis koreksi (s) segera setelah sebuah garis perhitungan. Masukan yang telah digosok harus tidak perlu dicoba kecuali memblokir di sini sama sekali.
Singkatnya, jika menggunakan haversine, kode eksplisit daripada menggunakan paket atau perpustakaan, tidak peduli bahasa pilihan Anda, itu akan menjadi ide yang baik untuk menguji dan untuk menormalkan sebuah kembali ke kisaran yg diperlukan dari 0,0 <= a <= 1,0 dalam rangka untuk melindungi baris berikutnya dengan perhitungan c . Tetapi sebagian besar cuplikan kode haversine tidak menunjukkannya, dan tidak menyebutkan risikonya.
Pengalaman: selama pengujian menyeluruh di seluruh dunia, dengan kenaikan 0,001 derajat, saya telah mengisi hard drive dengan kombinasi lat yang menyebabkan pengecualian, pengecualian berulang yang dapat diandalkan dan konsisten, selama sebulan juga menguji secara reliabilitas keandalan pendinginan CPU penggemar, dan kesabaran saya. Ya, saya sejak itu menghapus sebagian besar log itu, karena tujuan mereka sebagian besar adalah untuk membuktikan maksudnya (jika pun kata diizinkan). Tapi saya punya beberapa log pendek 'nilai masalah lat lon', disimpan untuk tujuan pengujian.
Akurasi: Akankah suatu dan seluruh hasil haversine kehilangan beberapa akurasi dengan menormalkan bahwa sedikit kembali kecil ke domain? Tidak banyak, mungkin tidak lebih dari perkiraan fp64 dan pembulatan sudah diperkenalkan, yang menyebabkan sedikit keluar dari domain. Jika Anda telah menemukan haversine dapat diterima lebih dari vincenty - lebih sederhana, lebih cepat, lebih mudah untuk menyesuaikan, memecahkan masalah dan memelihara, maka haversine mungkin merupakan solusi yang baik untuk proyek Anda.
Saya telah menggunakan haversine pada skysphere yang diproyeksikan overhead untuk mengukur jarak sudut antara objek di langit, seperti yang dilihat dari posisi di bumi, pemetaan azimuth dan alt ke skysphere lat lon seperti koordinat, tidak ada elipsoid untuk dipertimbangkan sama sekali, karena proyeksi langit skysphere adalah bola sempurna, ketika datang untuk mengukur jarak sudut melihat sudut antara dua objek dari posisi di permukaan bumi. Ini sesuai dengan kebutuhan saya dengan sempurna. Jadi, haversine masih sangat berguna, dan sangat akurat, dalam aplikasi tertentu (baik untuk keperluan saya) ... tetapi jika Anda menggunakannya, apakah di bumi untuk GIS atau navigasi, atau dalam pengamatan dan pengukuran objek langit, lakukan perlindungan dalam hal titik antipodal atau titik antipodal yang sangat dekat, dengan menguji adan mendorongnya kembali ke domain yang diperlukan saat dibutuhkan.
Haversine yang tidak terlindungi ada di internet, dan saya hanya melihat satu pos usenet lama yang menunjukkan perlindungan, saya pikir dari seseorang di JPL, dan itu mungkin pra-1985, pra-IEEE 754 floating point spec. Dua halaman lain menyebutkan kemungkinan masalah di dekat poin antipodal, tetapi tidak menjelaskan masalah itu, atau bagaimana orang dapat mengatasinya. Jadi ada kekhawatiran bagi para pemula (seperti saya) yang mungkin tidak selalu memahami praktik yang baik dengan cukup baik untuk penelitian lebih lanjut, dan menguji edgecases, dari beberapa kode yang telah mereka salin dan tempelkan ke dalam proyek dengan kepercayaan. Posting menarik cffk menyegarkan karena bersifat publik dengan jenis masalah ini, yang tidak sering disebutkan, jarang dikodekan secara publik untuk perlindungan dalam cuplikan, dan jarang dibahas dengan cara ini, dibandingkan dengan jumlah versi yang tidak dilindungi dan tidak didiskusikan yang diposting.
Pada 20190923, halaman wiki untuk formula haversine memang menyebutkan masalah yang mungkin terjadi di titik-titik antipodal, karena masalah titik mengambang di perangkat komputasi ... mendorong ...
https://en.wikipedia.org/wiki/Haversine_formula
(karena halaman wiki itu, pada saat ini, tidak memiliki jangkar html untuk bagian yang akan saya tautkan secara langsung, oleh karena itu, setelah halaman dimuat, lakukan pencarian pada halaman browser itu untuk 'Ketika menggunakan formula ini' dan Anda akan lihat masalah haversine dengan poin antipodal yang disebutkan, lebih resmi.)
Dan situs lain ini juga memiliki penyebutan yang sangat singkat:
https://www.movable-type.co.uk/scripts/latlong.html
Jika seseorang menemukan di halaman itu untuk 'termasuk perlindungan terhadap kesalahan pembulatan', ada ini ...
Jika atan2 tidak tersedia, c dapat dihitung dari 2 ⋅ asin (min (1, √a)) (termasuk perlindungan terhadap kesalahan pembulatan).
Sekarang ada contoh langka di mana kesalahan pembulatan disebutkan, dan perlindungan ditampilkan untuk versi asin (), namun tidak disebutkan atau ditampilkan untuk versi atan2 (). Tetapi setidaknya risiko kesalahan pembulatan disebutkan.
imho, aplikasi 24/7/365 apa pun yang menggunakan haversine, memerlukan perlindungan ini di dekat titik antipodal sebagai detail penting dan sederhana.
Saya tidak tahu paket haversine mana yang termasuk atau tidak termasuk perlindungan ini, tetapi jika Anda masih baru dalam hal ini, dan Anda akan menggunakan versi 'snippet' yang dipublikasikan secara populer, sekarang Anda tahu itu membutuhkan perlindungan, dan perlindungan itu sangat sederhana untuk diterapkan, yaitu, jika Anda tidak menggunakan vincenty, dan tidak menggunakan haversine paket tanpa akses mudah untuk mengubah kode paket.
TKI, apakah menggunakan vincenty atau haversine atau sloc, orang harus menyadari masalah apa pun dengan kode, hal-hal yang harus diperhatikan dan dimitigasi, dan bagaimana seseorang berurusan dengan vincenty vs haversine vs sloc akan berbeda ketika seseorang mengetahui masing-masing masalah tersembunyi / edgecases, yang mungkin atau mungkin tidak dikenal secara luas.