Skip to content

Mengambil Data Berdasarkan Latitude dan Longitude dengan Radius Tertentu di MySQL

Posted on:November 28, 2018 at 04:55 PM

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

latitude dan longitude yang terdapat di google maps

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:

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 sama seperti yang ada di gambar di atas

Dengan latitude -7.782207 dan longitude 110.388730 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, semoga bermanfaat