[20.17] Oleh: Raka Yusuf



Ketika bermain dengan (baca: membuat) aplikasi GPS, ada kalanya kita ingin mengukur jarak (dalam km) antara dua titik koordinat bumi. Sebagaimana diketahui, koordinat bumi menggunakan Latitude dan Longitude. Sebagai contoh, Tugu Monas berada di koordinat (-6.175244,106.827117).
Nah, sekarang bila ada dua titik di bumi, bagaimanakah cara mengukur jaraknya? Tentu yang dimaksud jarak di sini ialah panjang garis lurus yang menghubungkan kedua titik tersebut. Dalam koordinat kartesian yang kita pelajari di sekolah menengah, kita dapat menghitung jarak dua titik menggunakan rumus sederhana dua dimensi. Namun menghitung jarak dua titik di permukaan bumi tidak sesederhana itu, karena ternyata jarak yang dimaksud merupakan panjang busur yang menghubungkan kedua titik di mana pusat busur tersebut ialah pusat bola bumi. Ingat, bumi merupakan benda 3 dimensi. Jadi jarak dua titik koordinat bumi tidaklah dapat dianggap panjang garis lurus yang menghubungkannya. Perhitungannya menjadi rumit karena melibatkan perhitungan trigonometri, seperti sinus, cosinus, dan arcus tangens, serta melibatkan panjang jari-jari bola bumi. Itu pun masih harus memperhitungkan kontur atau ketinggian kedua titik tersebut.
Hufff, tentu saja ini merepotkan, terutama bila kita ingin melakukan SELECT di MySQL di mana query-nya mensyaratkan perhitungan jarak antara dua titik koordinat bumi.
Namun ternyata, seorang programmer bernama Sebastian Bauer sudah melakukannya untuk kita :) berikut ini ialah kode perintah SQL untuk maksud di atas. Tentu saja dengan asumsi bahwa kedua titik yang dihitung jaraknya berada pada jarak yang sama dari pusat bola bumi. Dengan kata lain, kontur atau ketinggian (altitude) tidak dihitung di sini.

(Edited 26-Jan-2013: template sdh dimodif sehingga baris yang tadinya tdk terlihat sekarang terlihat)

CREATE FUNCTION `get_distance_between_geo_locations`(`lat1` FLOAT, `long1` FLOAT, `lat2` FLOAT, `long2` FLOAT)
  RETURNS FLOAT
  LANGUAGE SQL
  DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY DEFINER
  COMMENT ''
BEGIN
DECLARE distance FLOAT DEFAULT -1;
DECLARE earthRadius FLOAT DEFAULT 6371.009;
-- 3958.761 --miles
-- 6371.009 --km
DECLARE axis FLOAT;

IF ((lat1 IS NOT NULL) AND (long1 IS NOT NULL) AND (lat2 IS NOT NULL) AND (long2 IS NOT NULL)) THEN -- bit of protection against bad data

  SET axis = (SIN(RADIANS(lat2-lat1)/2) * SIN(RADIANS(lat2-lat1)/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(RADIANS(long2-long1)/2) * SIN(RADIANS(long2-long1)/2));
  SET distance = earthRadius * (2 * ATAN2(SQRT(axis), SQRT(1-axis)));

END IF;

RETURN distance;
END;

Silakan copas kode ini ke phpMyAdmin, atau langsung pelajari dari situsnya Pak Sebastian.
Oya, bila ada masalah eksekusi perintah SQL di atas, kemungkinan besar karena masalah delimiter. Silakan tambahkan di atas baris paling atas:
    DELIMITER $$
dan baris yang paling bawah diganti dengan:
    END $$

Semoga bermanfaat!

(Catatan: template yg digunakan di sini agak menyembunyikan beberapa baris yang agak panjang ke kanan. Tapi copy saja dari atas sampai bawah, kemudian paste di text editor -- misalnya Notepad -- maka semua baris akan terlihat)
Labels: , , edit post
4 Responses
  1. Menarik pak untuk dicoba, penghitungan jarak berdasarkan jalur belum pernah ada yang buat ya pak?? umumnya penghitungan berdasarkan garis lurus..,

    saya sudah coba yang di php , sumber : http://www.movable-type.co.uk/scripts/latlong.html

    Terima kasih.


  2. Raka Yusuf Says:

    Thanx, Dit. Wuah mantap, ada temen buat blogwalking nih..
    Kalo mo bikin sendiri secara manual, perhitungan jarak berdasarkan jalur tempuh di darat harus menggunakan algoritma penelurusan, btree, shortest path, dll, dan membutuhkan informasi jalur/jalan pada suatu daerah. Tapi kalo mo gampang, bisa gunakan Direction API dari Google Maps. Tinggal masukin latitude dan longitude. Bisa juga sih masukin nama jalan, tapi kadang-kadang kan ada lebih dari satu jalan yang menggunakan nama sama. Link yang kamu kasih juga oke tuh. Coba cek yang ini:
    http://code.google.com/apis/maps/documentation/directions/


  3. mylive Says:

    tanya penggunaannya mas, maaf newbee
    kebutuhan saya adalah menghitung jarak antara dua titik antara titik yg ada dalam database dengan titik yg diinputkan manual. apakah syntax tersebut dapat memenuhi kebutuhan saya itu.
    mohon masukannya.
    terimakasih


  4. Raka Yusuf Says:

    Maaf ya Mba MyLive, atas keterlambatan respon saya. Function dalam artikel ini tentu saja dapat digunakan untuk menghitung jarak antara titik yang dimasukkan secara manual dengan titk yang berada di database. Baris pertama function di artikel ini memang terpotong karena template blognya rada sempit. Tapi parameter fungsi tersebut sebenarnya ada 4 yakni lat1, long1, lat2, dan long2 (Lihat situsnya Sebastian Bauer). Anda dapat mengisi lat1 dan long1 dari inputan manual, serta lat2 dan long2 diambil dari database.
    Situs www.jafaik.com menggunakan fungsi ini untuk menghitung jarak dari koordinat input (diambil dari quey string script PHP-nya) dengan koordinat teater (yg diambil dari database).
    Insya Allah di posting lain saya akan beri contoh lebih detil kolaborasi antara script PHP dengan function ini.
    Terima kasih atas pertanyaannya.


Posting Komentar