Saya membaca pertanyaan ini di sini:
Jenis data apa yang digunakan saat menyimpan data lintang dan bujur dalam database SQL?
Dan tampaknya konsensus umum adalah bahwa menggunakan Desimal (9,6) adalah cara yang tepat. Pertanyaan bagi saya adalah, seberapa akurat saya membutuhkan ini?
Misalnya, API Google mengembalikan hasil seperti:
"lat": 37.4219720,
"lng": -122.0841430
Dari -122.0841430, berapa digit yang saya butuhkan? Saya telah membaca beberapa panduan tetapi saya tidak cukup memahami mereka untuk mencari tahu.
Lebih tepatnya dalam pertanyaan saya: Jika saya ingin akurat dalam jarak 50 kaki dari lokasi yang tepat, berapa banyak titik desimal yang perlu saya simpan?
Mungkin pertanyaan yang lebih baik sebenarnya adalah pertanyaan non-pemrograman, tetapi itu adalah: seberapa akurat setiap titik desimal yang diberikan?
Apakah sesederhana ini?
- Daftar barang
- x00 = 6000 mil
- xx0 = 600 mil
- xxx = 60 mil
- xxx.x = 6 mil
- xxx.xx = 0,6 mil
- dll?
sumber
Jawaban:
Akurasi versus tempat desimal di ekuator
ref: https://en.wikipedia.org/wiki/Decimal_degrees#Precision
sumber
Jika Anda ingin presisi 50 kaki (15 m), gunakan 4 digit. Begitu
decimal(9,6)
sumber
(8,6)
(atau(6,4)
untuk menyimpan satu byte (di MySQL).Saya merancang database dan telah mempelajari pertanyaan ini selama beberapa waktu. Kami menggunakan aplikasi di luar rak dengan backend Oracle di mana bidang data ditentukan untuk memungkinkan 17 tempat desimal. Konyol! Itu dalam seperseribu inci. Tidak ada instrumen GPS di dunia yang seakurat itu. Jadi mari kita sisihkan 17 tempat desimal dan berurusan dengan praktik. Pemerintah menjamin sistem mereka baik untuk akurasi "kasus terburuk" pseudorange 7,8 meter pada tingkat kepercayaan 95% "tetapi kemudian melanjutkan dengan mengatakan FAA aktual (menggunakan instrumen berkualitas tinggi) telah menunjukkan pembacaan GPS biasanya baik untuk dalam satu meter.
Jadi, Anda harus bertanya pada diri sendiri dua pertanyaan: 1) Apa sumber dari nilai-nilai Anda? 2) Untuk apa data tersebut akan digunakan?
Ponsel tidak terlalu akurat, dan pembacaan Google / MapQuest mungkin hanya cocok untuk 4 atau 5 desimal. Instrumen GPS berkualitas tinggi mungkin memberi Anda 6 (di Amerika Serikat). Tapi menangkap lebih dari itu hanya membuang-buang ruang pengetikan dan penyimpanan. Selain itu, jika ada pencarian yang dilakukan pada nilai-nilai tersebut, akan menyenangkan bagi pengguna untuk mengetahui bahwa 6 adalah yang paling harus dia cari (jelas semua nilai pencarian yang dimasukkan pertama-tama harus dibulatkan ke akurasi yang sama dengan nilai data yang dicari ).
Selain itu, jika Anda hanya ingin melihat lokasi di Google Maps atau memasukkannya ke GPS untuk sampai ke sana, empat atau lima sudah cukup.
Saya harus menertawakan orang-orang di sekitar sini yang memasukkan semua angka itu. Dan di mana tepatnya mereka melakukan pengukuran itu? Kenop pintu depan? Kotak surat di depan? Pusat bangunan? Puncak menara seluler? DAN ... apakah setiap orang secara konsisten mengambilnya di tempat yang sama?
Sebagai desain database yang baik, saya akan menerima nilai dari pengguna mungkin beberapa lebih dari lima digit desimal, kemudian membulatkan dan menangkap hanya lima untuk konsistensi [mungkin enam jika instrumen Anda bagus dan penggunaan akhir Anda menjaminnya].
sumber
DECIMAL(18,15)
membutuhkan 9 byte.Jarak antara setiap derajat garis lintang bervariasi karena bentuk bumi dan jarak antara setiap derajat garis bujur semakin kecil jika semakin dekat dengan kutub. Jadi mari kita bicara tentang ekuator, di mana jarak antara setiap derajat adalah 110.574 km untuk lintang dan 111.320 km untuk bujur.
50ft adalah 0,01524km, jadi:
Anda memerlukan empat digit skala, cukup untuk turun ke sepuluh per seribu derajat, dengan total ketepatan tujuh digit.
DECIMAL(7,4)
harus cukup untuk kebutuhan Anda.sumber
Dengan mempertimbangkan berbagai bagian bola dan jarak diagonal, berikut adalah tabel presisi yang tersedia:
- http://mysql.rjweb.org/doc.php/latlng#representation_choices
sumber
Jangan simpan nilai floating point. Meskipun Anda mungkin menganggapnya akurat, sebenarnya tidak. Mereka adalah perkiraan. Dan ternyata bahasa yang berbeda memiliki metode yang berbeda untuk "mengurai" informasi floating point. Dan database yang berbeda memiliki metode yang berbeda untuk menerapkan perkiraan nilai.
Sebagai gantinya, gunakan Geohash . Video ini memperkenalkan dan menjelaskan Geohash secara visual dalam waktu kurang dari 5 menit. Geohash JAUH merupakan cara terbaik untuk menyandikan / mendekode informasi bujur / lintang dengan cara yang konsisten. Dengan tidak pernah "membuat serial" perkiraan nilai floating point dari bujur / lintang ke dalam kolom database dan sebaliknya, menggunakan Geohash, Anda akan mendapatkan jaminan konsistensi perjalanan pulang pergi yang sama seperti yang Anda dapatkan dengan nilai String. Situs web ini bagus untuk membantu Anda bermain dengan Geohash.
sumber
FLOAT
danDOUBLE
, dalam konteks ini , tidak mengalami beberapa masalah yang Anda gambarkan.FLOAT
nilai dan nilai 'berikutnya' sangat dekat satu sama lain sehingga Anda tidak dapat membedakan satu kota (atau kendaraan atau orang atau loak) dari yang lain, kesalahan pembulatan dan representasi tidak menjadi masalah. Sementara itu, membandingkan duaFLOATs
(atauDOUBLEs
atau perkiraanDECIMALs
) dengan '=' hampir selalu merupakan hal yang bodoh .[mysql]
, bukan SQL Server.Jika Anda mengklik lokasi di Google Maps, Anda mendapatkan lintang dan bujur dengan 7 tempat desimal
sumber