Minggu, 15 Januari 2017

Menghitung Jarak Dua Koordinat

Teori Haversine Formula
Teorema Haversine Formula adalah sebuah persamaan yang penting dalam bidang navigasi, untuk mencari jarak busur antara dua titik pada bola dari longitude dan latitude. Ini merupakan bentuk persamaan khusus dari trigonometri bola, law of haversines, mencari hubungan sisi dan sudut pada segitiga dalam bidang bola.

Spherical law of cosines
Dimana a,b,c ialah jarak yang bersatuan radian/sudut karena berada dalam bidang bola, yang bisa kita korelasikan dengan persamaan busur dibawah ini :
Rumus Busur
Kemudian kita implementasikan persamaan harvesin dibawah ini :

Sehingga dari Formula diatas kita dapat implementasi menjadi :



Teori Euclidean Distance
Euclidean distance adalah perhitungan jarak dari 2 buah titik dalamEuclidean space. Euclidean space diperkenalkan oleh Euclid, seorang matematikawan dari Yunani sekitar tahun 300 B.C.E. untuk mempelajari hubungan antara sudut dan jarak. Euclidean ini berkaitan dengan Teorema Phytagoras dan biasanya diterapkan pada 1, 2 dan 3 dimensi. Tapi juga sederhana jika diterapkan pada dimensi yang lebih tinggi.

Pada 1 dimensi
Semisal ingin menghitung jarak Euclidean 1 dimensi. Titip pertama adalah 4, titik kedua adalah -10. Caranya adalah kurankan -10 dengan 4. sehingga menghasilkan -14. Cari nilai absolut dari nilai -14 dengan cara mempangkatkannya sehingga mendapat nilai 196. Kemudian diakarkan sehingga mendapatkan nilai 14. Sehingga jarak euclidean dari 2 titik tersebut adalah 14.
 Pada 2 dimensi

Koordinat jarak
Caranya hampir sama. Misalkan titik pertama mempunyai kordinat (1,2). Titik kedua ada di kordinat (5,5). Caranya adalah kurangkan setiap kordinat titik kedua dengan titik yang pertama. Yaitu, (5-1,5-2) sehingga menjadi (4,3). Kemudian pangkatkan masing-masing sehingga memperoleh (16,9). Kemudian tambahkan semuanya sehingga memperoleh nilai 16+9 = 25. Hasil ini kemudian diakarkan menjadi 5. Sehingga jarak euclideannya adalah 5.
Rumus Euclid
Sehingga dari Formula diatas kita dapat implementasi menjadi :

Rumus Jarak Euclide
Hasil perhitungan (Jarak) diatas masih dalam satuan decimal degree(sesuai dengan format longlat yang dipakai) sehingga untuk menyesuaikannya perlu dikalikan dengan 111.319 km (1 derajat bumi = 111.319 km)



Penggunaan Teorema Euclid dan Teorema Harvesine
Pertama kita siapkan bahan uji sebagai berikut :
1. Titik Pertama : Gedung Sate (Bandung)
Long : 107.618633
Lat : -6.901361
2. Titik Kedua: Mesjid Raya Lembang (KBB)
Long : 107.618279
Lat : -6.811771
Jarak aktual yang diperoleh dari Gmap ialah 10.05 Km.
Dengan Teorema Euclid :

Rumus Jarak Euclide
=((SQRT((B6-B7)^2+(C6-C7)^2)*111.319))
Hasilnya diperoleh Jarak = 9.97 Km
Dengan Teorema Harvesine:

Rumus Jarak Harvesin
=(6371.1*((2*ASIN(SQRT((SIN((RADIANS(B7)-RADIANS(B6))/2)^2)+COS(RADIANS(B7))*COS(RADIANS(B6))*(SIN((RADIANS(C7)-RADIANS(C6))/2)^2))))))
Hasilnya diperoleh Jarak = 9.96 Km
JIka menggunakan excel:


public static double getJarak(double lat1, double lon1, double lat2, double lon2) { 
final int R = 6371; // Radious of the earth
        Double latDistance = toRad(lat2-lat1);
        Double lonDistance = toRad(lon2-lon1);
        Double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2) +
                   Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) *
                   Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
        Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        Double distance = R * c;
         
        System.out.println("The distance between two lat and long is::" + distance);
 
    }
     
    private static Double toRad(Double value) {
        return value * Math.PI / 180;
    }

public static double getJarak(double lat1, double lng1, double lat2, double lng2) {
           double earthRadius = 3958.75;
           double dLat = Math.toRadians(lat2-lat1);
           double dLng = Math.toRadians(lng2-lng1);
           double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                      Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
                      Math.sin(dLng/2) * Math.sin(dLng/2);
           double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
           double dist = earthRadius * c;

           int meterConversion = 1609;
           double myjr=dist * meterConversion;
           return Math.floor(myjr/1000);

           }  

Tidak ada komentar:

Posting Komentar