Saya mencoba mengembangkan "formula" untuk memperbaiki nilai lat-lng.
Saya menggunakan selebaran tetapi ketika Anda menjelajah di luar dunia "pertama" Anda mendapatkan angka besar. Lebih dari +180 atau di bawah -180.
Sebagai contoh: ketika saya menggeser Amerika ke kanan (arah timur), saya mendapatkan 215. Dalam pikiran saya, saya hanya akan memperbaikinya dengan 215-360=-145
Hal yang sama adalah ketika saya menggeser rusia timur ke kiri (arah barat) dan saya dapatkan misalnya -222. Sekarang saya perlu menghitung-222+360=138
Namun, karena dunia tidak terbatas, pengguna dapat beralih ke dunia ke-8 dan saya harus menyesuaikan nilainya.
Apakah mungkin menghitung garis bujur yang benar? (dan persyaratan lain adalah ketika pengguna berada di dunia pertama, 24 lng masih harus 24 lng.
sumber
while (Math.abs(lon) > 180) { lon -= Math.sign(lon) * 360 }
Saya tidak memberikannya sebagai jawaban karena versi Anda benar-benar cocok dengan penjelasan, sementara versi saya hanya optimasi yang kemungkinan tidak membuat perbedaan. Saya menyimpannya sebagai komentar hanya sebagai pengingat bahwa hal-hal dapat dilakukan dalam berbagai cara, beberapa lebih dioptimalkan daripada yang lain.lon %= 180
?Jawaban yang menghindari panggilan kondisional dan fungsi:
Saya menulis microbenchmark cepat di https://jsperf.com/longitude-normalisation dan kode kondisional tampaknya lebih cepat (di Chrome di mesin saya) untuk rentang nilai input yang 'masuk akal'. Secara umum Anda mungkin tidak perlu khawatir sebelumnya tentang kinerja dalam perhitungan kecil seperti ini, memberikan bobot lebih untuk keterbacaan dan konsistensi dengan sisa basis kode Anda.
Mungkin yang lebih penting dalam hal ini adalah pertanyaan apakah kode Anda dapat menemukan nilai input ekstrem (1e10, Infinity, dll.). Jika demikian, implementasi pengulangan dapat berjalan sangat lambat atau diam-diam menggantung program Anda. Ini mungkin terjadi dengan perhitungan yang dilakukan di dekat kutub, misalnya mencoba menjelajah timur atau barat dengan jarak tertentu (bukan sudut) dari kutub dapat dengan mudah menghasilkan bujur yang tak terbatas.
sumber
Satu-liner:
Penjelasan: Anda ingin tahu apa yang tersisa setelah Anda mengabaikan rotasi penuh (360 °).
Proses ini disebut normalisasi.
Contoh (cpp.sh)
sumber
remainder
sebagaimodulus
. Modulus dalam JS akan menghasilkan [0, 360).-1 % 3
Adalah -1, bukan 2 sebagaimana diperlukan agar dapat bekerja di sini.remainder
adalah solusi C ++ yang bagus, tapi sayangnya tidak ada fungsi / operator di JS yang cukup mirip untuk berguna.Pilihan lain: bujur = atan2 (cos (panjang), sin (panjang))
sumber
Jika bahasa pemrograman yang Anda gunakan mendukung operator% (mod) pada angka floating point (seperti Python dan Ruby), saya sarankan menggunakan itu. Jika tidak, beberapa bahasa lain (seperti C dan C ++) memungkinkan Anda untuk menggunakan fmod ().
(Operator mod mana pun yang Anda gunakan, pastikan sebelumnya bahwa ia akan melakukan operasi mod pada angka floating-point, dan itu akan selalu memberi Anda jawaban yang tidak negatif. Kalau tidak, Anda akan mendapatkan kejutan yang tidak menyenangkan nantinya ketika banyak dari Anda poin lat / lon tidak benar.)
Gunakan seperti ini:
Jika Anda lebih suka melakukan semuanya dalam satu baris:
Pendekatan-pendekatan ini tidak memiliki loop, sehingga mereka akan menormalkan nilai-nilai bujur tanpa perlu berulang kali menambah atau mengurangi, tidak peduli berapa kali pengamatan Anda telah berputar di sekitar bumi.
Edit:
Hmmm ... Saya baru saja memperhatikan bahwa Javascript sepertinya tidak menangani
%
dengan nilai negatif seperti yang saya kira.Jika demikian, coba satu-baris ini:
Yang
36180
kami tambahkan adalah 36.000 + 180. 36.000 adalah untuk memindahkan nilai negatif ke domain positif, dan 180 adalah untuk menggesernya sehingga ketika dimodekan oleh360
, itu akan berada di kisaran [0,360) . Bagian- 180
itu menggesernya kembali ke kisaran [-180.180).Ini satu kalimat lagi, yang tidak bergantung pada 36.000 cukup besar:
Bagian
longitude % 360 + 360
akan memastikan nilai tetap di domain positif ketika nanti diubah oleh360
. Bagian+ 180
itu menggesernya sehingga ketika nanti dikurangi menjadi 180 (dengan- 180
), itu akan berada dalam kisaran yang diinginkan [-180.180).sumber
fmod(longitude, 360)
-> (-360.0 ... +360.0) danilongitude % 360
-> [-359 ... +359].