Bagaimana cara menghitung jarak antara dua titik yang ditentukan oleh lintang dan bujur?
Untuk klarifikasi, saya ingin jarak dalam kilometer; poin menggunakan sistem WGS84 dan saya ingin memahami akurasi relatif dari pendekatan yang tersedia.
Bagaimana cara menghitung jarak antara dua titik yang ditentukan oleh lintang dan bujur?
Untuk klarifikasi, saya ingin jarak dalam kilometer; poin menggunakan sistem WGS84 dan saya ingin memahami akurasi relatif dari pendekatan yang tersedia.
Jawaban:
Tautan ini mungkin bermanfaat bagi Anda, karena merinci penggunaan rumus Haversine untuk menghitung jarak.
Kutipan:
sumber
Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
bukanMath.asin(Math.sqrt(h))
, yang akan menjadi implementasi langsung dari formula yang digunakan artikel Wikipedia? Apakah lebih efisien dan / atau lebih stabil secara numerik?(sin(x))²
sederajat(sin(-x))²
Saya perlu menghitung banyak jarak antara titik-titik untuk proyek saya, jadi saya melanjutkan dan mencoba mengoptimalkan kode, saya temukan di sini. Rata-rata di berbagai browser implementasi saya yang baru berjalan 2 kali lebih cepat daripada jawaban yang paling banyak dipilih.
Anda dapat bermain dengan jsPerf saya dan lihat hasilnya di sini .
Baru-baru ini saya perlu melakukan hal yang sama di python, jadi di sini adalah implementasi python :
Dan demi kelengkapan: Haversine on wiki.
sumber
// 2 * R; R = 6371 km
? dan metode saat ini memberikan jawaban dalam km atau mil? membutuhkan dokumentasi yang lebih baik. Terima kasihBerikut ini adalah Implementasi C #:
sumber
double dlon = Radians(lon2 - lon1);
dandouble dlat = Radians(lat2 - lat1);
RADIUS
nilainya harus 6371 seperti pada jawaban lainnya?Berikut ini adalah implementasi java dari formula Haversine.
Perhatikan bahwa di sini kita membulatkan jawaban ke km terdekat.
sumber
6371000
sebagai jari-jari bumi? (rata-rata jari-jari bumi adalah 6371000 meter) atau mengkonversi kilometer ke meter dari fungsi Anda?0.621371
Terima kasih banyak untuk semua ini. Saya menggunakan kode berikut dalam aplikasi iPhone Objective-C saya:
Lintang dan Bujur berada dalam desimal. Saya tidak menggunakan panggilan min () untuk asin () karena jarak yang saya gunakan sangat kecil sehingga mereka tidak memerlukannya.
Itu memberikan jawaban yang salah sampai saya memberikan nilai dalam radian - sekarang ini hampir sama dengan nilai yang diperoleh dari aplikasi Peta Apple :-)
Pembaruan ekstra:
Jika Anda menggunakan iOS4 atau lebih baru maka Apple memberikan beberapa metode untuk melakukan ini sehingga fungsionalitas yang sama akan tercapai dengan:
sumber
pow(sin(dlat / 2), 2) + cos(convertToRadians(place1.latitude))
tidak benar. Hapus itu, dan hasilnya cocok dengan yang saya dapatkan ketika saya menggunakan implementasi lain pada halaman ini, atau menerapkan formula Haversine dari Wikipedia dari awal.()
sekitar itu, saya mendapatkan 3869.75. Tanpa mereka, saya mendapatkan 3935,75, yang merupakan hasil pencarian web.Ini adalah fungsi PHP sederhana yang akan memberikan perkiraan yang sangat masuk akal (di bawah +/- 1% margin error).
Seperti dikatakan di atas; bumi BUKAN bola. Ini seperti bola bisbol tua yang Mark McGwire putuskan untuk praktikkan - penuh penyok dan gundukan. Perhitungan yang lebih sederhana (seperti ini) memperlakukannya seperti bola.
Metode yang berbeda mungkin lebih atau kurang tepat sesuai dengan posisi Anda pada ovoid tidak teratur ini DAN seberapa jauh jarak poin Anda (semakin dekat semakin kecil margin kesalahan absolutnya). Semakin tepat harapan Anda, semakin kompleks matematika.
Untuk info lebih lanjut: jarak geografis wikipedia
sumber
Saya memposting di sini contoh kerja saya.
Daftar semua titik dalam tabel yang memiliki jarak antara titik yang ditunjuk (kami menggunakan titik acak - lat: 45.20327, panjang: 23.7806) kurang dari 50 KM, dengan lintang & bujur, di MySQL (bidang tabel adalah coord_lat dan coord_long):
Daftar semua yang memiliki JARAK <50, dalam Kilometer (dianggap radius Bumi 6371 KM):
Contoh di atas diuji dalam MySQL 5.0.95 dan 5.5.16 (Linux).
sumber
Di jawaban lain implementasi di r hilang.
Menghitung jarak antara dua titik cukup mudah dengan
distm
fungsi darigeosphere
paket:dimana:
Karena bumi tidak bulat sempurna, rumus Vincenty untuk ellipsoid mungkin merupakan cara terbaik untuk menghitung jarak. Jadi dalam
geosphere
paket yang Anda gunakan kemudian:Tentunya Anda tidak harus menggunakan
geosphere
paket, Anda juga dapat menghitung jarak di dasarR
dengan fungsi:sumber
The haversine jelas merupakan formula yang baik untuk sebagian besar kasus, jawaban lain sudah termasuk jadi saya tidak akan mengambil ruang. Tetapi penting untuk dicatat bahwa apa pun formula yang digunakan (ya, bukan hanya satu). Karena rentang akurasi yang sangat besar serta waktu komputasi yang diperlukan. Pilihan formula membutuhkan sedikit lebih banyak pemikiran daripada jawaban sederhana tanpa otak.
Posting ini dari seseorang di nasa, adalah yang terbaik yang saya temukan ketika membahas opsi
http://www.cs.nyu.edu/visual/home/proj/tiger/gisfaq.html
Misalnya, jika Anda hanya menyortir baris berdasarkan jarak dalam radius 100 mil. Formula bumi datar akan jauh lebih cepat daripada haversine.
Perhatikan hanya ada satu cosinus dan satu akar kuadrat. Vs 9 dari mereka menggunakan formula Haversine.
sumber
Anda bisa menggunakan build di CLLocationDistance untuk menghitung ini:
Dalam kasus Anda jika Anda ingin kilometer, bagilah dengan 1000.
sumber
Saya tidak suka menambahkan jawaban lain, tetapi Google maps API v.3 memiliki geometri bola (dan banyak lagi). Setelah mengonversi WGS84 Anda ke derajat desimal, Anda dapat melakukan ini:
Tidak ada kata tentang seberapa akurat perhitungan Google atau bahkan model apa yang digunakan (meskipun ia mengatakan "bola" daripada "geoid". Ngomong-ngomong, jarak "garis lurus" jelas akan berbeda dari jarak jika seseorang melakukan perjalanan di permukaan bumi yang dianggap oleh semua orang.
sumber
Asal-usul Python Asal adalah pusat dari Amerika Serikat yang berdekatan.
Untuk mendapatkan jawaban dalam kilometer cukup atur miles = false.
sumber
Mungkin ada solusi yang lebih sederhana, dan lebih tepat: Garis keliling bumi adalah 40.000 km di garis khatulistiwa, sekitar 37.000 pada siklus Greenwich (atau bujur). Jadi:
Saya setuju bahwa itu harus disetel dengan baik, saya sendiri mengatakan bahwa itu adalah ellipsoid, jadi jari-jari yang akan dikalikan dengan cosinus bervariasi. Tapi ini sedikit lebih akurat. Dibandingkan dengan Google Maps dan itu mengurangi kesalahan secara signifikan.
sumber
Semua jawaban di atas menganggap bumi adalah bola. Namun, perkiraan yang lebih akurat adalah spheroid oblate.
sumber
Berikut ini adalah Implementasi SQL untuk menghitung jarak dalam km,
Untuk perincian lebih lanjut dalam implementasi dengan pemrograman bahasa, Anda bisa langsung melalui skrip php yang diberikan di sini
sumber
Berikut ini adalah implementasi naskah formula Haversine
sumber
Sebagaimana ditunjukkan, perhitungan yang akurat harus memperhitungkan bahwa bumi bukanlah bola yang sempurna. Berikut adalah beberapa perbandingan dari berbagai algoritma yang ditawarkan di sini:
Pada jarak kecil, algoritma Keerthana tampaknya bertepatan dengan Google Maps. Google Maps tampaknya tidak mengikuti algoritma sederhana apa pun, menunjukkan bahwa itu mungkin metode yang paling akurat di sini.
Bagaimanapun, ini adalah implementasi Javascript dari algoritma Keerthana:
sumber
Skrip ini [dalam PHP] menghitung jarak antara dua titik.
sumber
sumber
Untuk menghitung jarak antara dua titik pada bola Anda perlu melakukan perhitungan Lingkaran Besar .
Ada sejumlah pustaka C / C ++ untuk membantu proyeksi peta di MapTools jika Anda perlu memproyeksikan ulang jarak Anda ke permukaan datar. Untuk melakukan ini, Anda akan memerlukan string proyeksi dari berbagai sistem koordinat.
Anda juga dapat menemukan MapWindow alat yang berguna untuk memvisualisasikan poin. Juga sebagai open source-nya panduan yang berguna untuk bagaimana menggunakan perpustakaan proj.dll, yang tampaknya menjadi perpustakaan proyeksi open source inti.
sumber
Inilah jawaban yang diterima implementasi yang diporting ke Jawa jika ada yang membutuhkannya.
sumber
Berikut ini adalah implementasi VB.NET, implementasi ini akan memberi Anda hasil dalam KM atau Miles berdasarkan nilai Enum yang Anda berikan.
sumber
Saya menyingkat perhitungan dengan menyederhanakan rumus.
Ini dia di Ruby:
sumber
Solusi Chuck, berlaku untuk miles juga.
sumber
Berikut ini adalah implementasi java saya untuk jarak perhitungan melalui derajat desimal setelah beberapa pencarian. Saya menggunakan radius rata-rata dunia (dari wikipedia) dalam km. Jika Anda ingin hasil mil kemudian gunakan radius dunia dalam mil.
sumber
Dalam Mysql gunakan fungsi berikut lulus parameter menggunakan
POINT(LONG,LAT)
sumber
sumber
di sini adalah contoh dalam postgres sql (dalam km, untuk versi miles, ganti 1.609344 dengan versi 0.8684)
sumber
Berikut ini dikonversi menjadi kode Ruby :
sumber
ada contoh yang bagus di sini untuk menghitung jarak dengan PHP http://www.geodatasource.com/developers/php :
sumber