Mengambil Data Berdasarkan Latitude dan Longitude dengan Radius Tertentu di MySQL

Di kasus yang saya buat ini, kita mempunyai beberapa data hotel di masing-masing daerah, dan kita sedang berada di Yogyakarta ingin mengambil data yang hanya ada di sekitar kita dengan radius katakanlah 10 km.

Buat database baru

CREATE DATABASE coba-maps;

Di dalam table tersebut, saya akan isi table hotels dengan atribut id, name, address, latitude, longitude. Atribut id dijadikan primary key, dan atribut latitude, longitude menggunakan tipe float dengan ukuran (10, 6).

CREATE TABLE `coba-maps`.hotels (
id INT NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
address varchar(100) NOT NULL,
latitude float(10,6) NOT NULL,
longitude float(10,6) NOT NULL,
PRIMARY KEY (id)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci;

Kemudian masukkan beberapa data hotel dengan lokasi yang berbeda-beda, disini saya mengambil latitude dan longitude dengan bantuan google maps, caranya

  • klik tempat yang kita inginkan di maps
  • akan muncul kotak dialog informasi mengenai daerah yang kita klik, disana juga tertera latitude dan longitudenya.

Disini saya akan membuat data-data hotel yang memiliki latitude dan longitude berdasarkan lokasinya, dan data yang saya buat saya kasih beberapa data yang tidak berada di Yogyakarta.

INSERT INTO `hotels` (`name`, `address`, `latitude`, `longitude`) VALUES 
('Hotel Santika', 'Depok, Sleman Regency, Special Region of Yogyakarta', '-7.775286','110.379903'),
('Hotel Maradona', 'Depok, Sleman Regency, Special Region of Yogyakarta', '-7.782064','110.403704'),
('Hotel Tukijan', 'Banguntapan, Bantul Regency, Special Region of Yogyakarta', '-7.790874', '110.411508'),
('Hotel Misno', 'Kasihan, Bantul Regency, Special Region of Yogyakarta', '-7.810804', '110.321915'),
('Hotel Wardi', 'Banyuraden, Gamping, Sleman Regency, Special Region of Yogyakarta', '-7.797522', '110.331762'),
('Hotel Paijo', 'Trihanggo, Gamping, Sleman Regency, Special Region of Yogyakarta', '-7.751725', '110.350105'),
('Hotel Tukinem', 'Kutu Patran, Sinduadi, Mlati, Sleman Regency, Special Region of Yogyakarta', '-7.762451', '110.357422'),
('Hotel Waluyo', 'Depok, Sleman Regency, Special Region of Yogyakarta', '-7.753658', '110.406563'),
('Hotel Sucipto', 'Sewon, Bantul Regency, Special Region of Yogyakarta', '-7.851724', '110.368116'),
('Hotel Mizwar', 'Banguntapan, Bantul Regency, Special Region of Yogyakarta', '-7.818128', '110.407422'),
('Hotel Puntodewo', 'Godean, Sleman Regency, Special Region of Yogyakarta', '-7.741261', '110.342661'),
('Hotel Mekarsari', 'Wonogiri, Wonogiri Regency, Central Java', '-7.833136', '110.916985'),
('Hotel Dewi Ayu', 'Baturetno, Patuk Kidul, Baturetno, Wonogiri Regency, Central Java', '-7.984154', '110.930823'),
('Hotel Poinem', 'Sesek, Sidorejo, Blitar, East Java', '-7.985665', '112.176245');

Setelah kita memiliki data di table hotels untuk mengambil hotel dengan radius tertentu bisa menggunakan query sebagai berikut

SELECT
  id, (
    6371 * acos (
      cos ( radians(latitude_kita) )
      * cos( radians( latitude ) )
      * cos( radians( longitude ) - radians(longitude_kita) )
      + sin ( radians(latitude_kita) )
      * sin( radians( latitude ) )
    )
  ) AS distance
FROM hotels
HAVING distance <= radius

Penjelasan dari query diatas:

  • Angka 6371 tersebut adalah radius yang diukur dengan satuan kilometer, jika ingin menggunakan radius dengan satuan mil bisa diganti dengan 3959.
  • Tulisan latitude_kita dan longitude_kita tersebut adalah latitude dan longitude dari lokasi yang ingin kita cari.
  • Radius menunjukkan berapa radius yang akan kita cari.

Dari query di atas, akan membuat sebuah lingkaran menggunakan latitude dan longitude kita, kemudian lingkaran tersebut akan memiliki jari-jari berdasarkan nilai radius yang kita masukkan, dan dari situ akan mencari data hotel dari latitude dan longitude yang dimilikinya yang berada dalam jangkauan.

Dari data yang kita miliki di table hotels misal saya berada di lokasi berikut

Dan ingin mendapatkan data hotel yang beradius 5 km, sehingga query yang digunakan akan seperti ini

SELECT
  id, (
    6371 * acos (
      cos ( radians(-7.785973) )
      * cos( radians( latitude ) )
      * cos( radians( longitude ) - radians(110.399957) )
      + sin ( radians(-7.785973) )
      * sin( radians( latitude ) )
    )
  ) AS distance
FROM hotels
HAVING distance <= 5

Data yang akan didapatkan dari query tersebut

Dari data tersebut, kita bisa mengolah lagi data hotel berdasarkan id yang kita dapatkan atau jarak lokasi hotel dari tempat kita.

Sekian, terima kasih sudah menyempatkan membaca !

nulis saat kelas PTI
Rabu, 28 November 2018
di STMIK Akakom Yogyakarta