Saya bekerja dengan data peta, dan Latitude/Longitude
meluas ke 8 tempat desimal. Sebagai contoh:
Latitude 40.71727401
Longitude -74.00898606
Saya melihat di dokumen Google yang menggunakan:
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
namun, tempat desimalnya hanya menuju 6.
Haruskah saya menggunakan FLOAT(10, 8)
atau apakah ada metode lain yang perlu dipertimbangkan untuk menyimpan data ini sehingga tepat. Ini akan digunakan dengan perhitungan peta. Terima kasih!
mysql
types
floating-point
Edward
sumber
sumber
float
tipe - yang hanya memiliki 7 digit presisi. Anda membutuhkan setidaknya 9. Anda tidak perlu 10 - dokumen untuk beberapa alasan aneh menghitung tanda minus sebagai digit. Apakah:double(9,6)
ataudecimal(9,6)
.FLOAT
membedakan dua item dengan jarak 1,7m (5,6ft). Semua itu terlalu berlebihan untuk aplikasi "peta"!Jawaban:
DECIMAL adalah tipe data MySQL untuk aritmatika yang tepat. Tidak seperti FLOAT, ketepatannya ditetapkan untuk semua ukuran angka, jadi dengan menggunakannya sebagai ganti FLOAT Anda mungkin menghindari kesalahan presisi saat melakukan beberapa perhitungan. Jika Anda hanya menyimpan dan mengambil nomor tanpa perhitungan maka dalam praktiknya FLOAT akan aman, meskipun tidak ada salahnya menggunakan DECIMAL. Dengan perhitungan FLOAT sebagian besar masih ok, tetapi untuk benar-benar yakin 8d.p. Anda harus menggunakan DECIMAL.
Garis lintang berkisar dari -90 hingga +90 (derajat), jadi DECIMAL (10, 8) ok untuk itu, tetapi garis bujur berkisar dari -180 hingga +180 (derajat) sehingga Anda memerlukan DECIMAL (11, 8). Angka pertama adalah jumlah total digit yang disimpan, dan yang kedua adalah angka setelah titik desimal.
Pendeknya:
lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
Ini menjelaskan bagaimana MySQL bekerja dengan tipe data floating-point.
PEMBARUAN: MySQL mendukung tipe data spasial dan
Point
merupakan tipe nilai tunggal yang dapat digunakan. Contoh:sumber
Selain itu, Anda akan melihat bahwa
float
nilai dibulatkan.sumber
double
tipe data, yang membutuhkan ketelitian.di laravel digunakan tipe kolom desimal untuk migrasi
untuk informasi lebih lanjut lihat jenis kolom yang tersedia
sumber
Anda dapat mengatur tipe data Anda sebagai bilangan bulat yang ditandatangani. Saat Anda menyimpan koordinat ke SQL, Anda dapat mengatur sebagai lat * 10000000 dan panjang * 10000000. Dan ketika Anda memilih dengan jarak / jari-jari Anda akan membagi koordinat penyimpanan ke 10000000. Saya mengujinya dengan baris 300K, waktu respons kueri baik. (2 x 2,67GHz CPU, 2 GB RAM, MySQL 5.5.49)
sumber
Jangan gunakan float ... Ini akan mengelilingi koordinat Anda, menghasilkan beberapa kejadian aneh.
Gunakan desimal
sumber
MySQL sekarang memiliki dukungan untuk tipe data spasial sejak pertanyaan ini diajukan. Jadi jawaban yang diterima saat ini tidak salah, tetapi jika Anda mencari fungsionalitas tambahan seperti menemukan semua poin dalam poligon yang diberikan maka gunakan tipe data TITIK.
Periksa Dokumen Mysql tentang tipe data Geospasial dan fungsi analisis spasial
sumber
Saya percaya cara terbaik untuk menyimpan Lat / Lng di MySQL adalah memiliki kolom TITIK (datatype 2D) dengan indeks SPATIAL.
sumber
Menggunakan migrasi ruby di rel
sumber
(20,18)
juga keluar di +/- 99.Kode untuk menggunakan / membuktikan ketepatan jawaban Oğuzhan KURNUÇ .
RINGKASAN:
Presisi luar biasa (~ 1cm) dalam ukuran kecil (4B).
Presisi adalah (sangat dekat dengan) 7 angka desimal untuk nilai pada rentang [-180, 180].
Itu 7 digit ke kanan desimal (~ 1cm) , dengan total 9 digit (atau 10 digit, jika menghitung awal "1" dari "180") dekat + -180.
Bandingkan ini dengan float 4-byte , yang hanya memiliki ~ 7 digit total, jadi ~ 5 digit di sebelah kanan desimal dekat + = 180 (~ 1m) .
Metode untuk menggunakan pendekatan ini:
Tes presisi:
Metode pembantu yang digunakan oleh tes:
sumber