Jenis Data Desimal atau Poin untuk menyimpan data lokasi Geo di MySQL

8

Saya ingin menyimpan lokasi Geo untuk setiap Alamat di tabel "tblAddress" MySQL saya (Innodb) dan saya pikir saya memiliki 2 Opsi:

1) 2 columns for Each Address:
Latitude DECIMAL(10, 8), 
Longitude DECIMAL(11, 8)

2) One Column for Each Address:
GeoLocation POINT

Program saya perlu menemukan semua Alamat yang berada di bawah Radius 1 Kilometer dari Lokasi saat ini (Klien Seluler).

Perintah di bawah juga tidak berfungsi untuk saya, tidak yakin apa yang harus saya miliki untuk ini.

CREATE SPATIAL INDEX GeoLocation ON tblAddress (GeoLocation);

Jadi apa pendekatan yang disarankan untuk menyimpan data untuk perhitungan dan pengambilan yang lebih cepat di sini. Mohon saran.

Prabhat
sumber

Jawaban:

6

Anda dapat menggunakan ekstensi spasial MySQL dengan GIS.

Dalam contoh kode dari Google yang menampilkan titik pada peta, mereka menyatakan:

Saat Anda membuat tabel MySQL, Anda ingin memberi perhatian khusus pada atribut lat dan lng. Dengan kemampuan zoom Google Maps saat ini, Anda seharusnya hanya membutuhkan 6 digit presisi setelah desimal.

Untuk menjaga ruang penyimpanan yang diperlukan untuk tabel kami minimal, Anda dapat menentukan bahwa atribut lat dan lng adalah ukuran float (10,6). Itu akan membiarkan bidang menyimpan 6 digit setelah desimal, ditambah hingga 4 digit sebelum desimal, misalnya -123,456789 derajat saya tidak akan khawatir tentang perbedaan kinerja antara tipe numerik. Indeks yang layak akan memiliki efek yang jauh lebih besar.

Anda juga dapat mencoba DECIMALsesuai saran @ gandaliter .

DECIMALadalah tipe data MySQL untuk aritmatika yang tepat. Berbeda FLOATdengan itu, ketepatannya diperbaiki untuk ukuran angka berapa pun, jadi dengan menggunakannya, FLOATAnda 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 digunakan DECIMAL. Dengan perhitungan FLOATsebagian besar masih ok, tetapi untuk benar-benar yakin 8d.p. presisi yang harus Anda gunakan 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 perlu DECIMAL(11,8). Angka pertama adalah jumlah total digit yang disimpan, dan yang kedua adalah angka setelah titik desimal. Singkatnya: lat DECIMAL(10,8) NOT NULL, lng DECIMAL(11,8) NOT NULL Ini menjelaskan bagaimana MySQL bekerja dengan tipe data floating-point.

Informasi terkait:

oNare
sumber
Terima kasih @oNare untuk penjelasan detail dan referensi Anda. Saya memang melihat saran oleh gandaliter dalam pertanyaan ( stackoverflow.com/questions/12504208/… ). Saya juga melihat saran dari ypercube di sini ( stackoverflow.com/questions/9560147/… ).
Prabhat