10 Haziran 2017 Cumartesi

Konum Hesaplama Formülleri - İki Nokta Arasında En Kısa Mesafeyi Hesaplama

İki enlem arası mesafe
İki enlem arasındaki mesafe yaklaşık 111 km uzunluğundadır.

İki boylam arasındaki mesafe
WGS-84 ekvatorun uzunluğunu 40,075.016686 kilometre olarak sabitlemiş durumda. Ekvatorda iki boylam arasındaki mesafe 40,000 / 360 = yaklaşık 110 km uzunluğunda.

1.  Law of Cosines
Formül şöylee
Distance = acos(SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(lon2-lon1))*6371
2. Yaklaşık Hesaplama - Haversine Formülü
Yaklaşık hesaplama formülleri daha az hassasiyet sahiptir ancak hata payı göz ardı da edilebilir.
GPS ile bulunan iki nokta arasındaki en kısa mesafeyi hesaplamak için Haversine formülü kullanılabilir. 

Haversine aslında Law of Cosines formülünün özelleştirilmiş hali. 

Bu formül dünyayı küre kabul ettiği için biraz yanılma payı olabilir ancak özellikle çok uzun olmayan mesafelerde yanılma payı göz ardı edilebilecek kadar küçük olabiliyor. Hata payı %0.5 kadar olabilir

Bu formülde iki nokta arasındaki Great Circle (Büyük Daire) mesafesi bulunuyor. Great Circle iki nokta arasındaki en kısa mesafe için takip edilen çizgiye verilen isim. Aşağıdaki great circle yay uzunluğunu göstere örneği buradan aldım.



Bu formülde ana hedef iki nokta arasındaki açıyı hesaplamak. Açıklaması şöyle. R dünyanın yarıçapı, theta ise iki nokta arasındaki açı.
İki nokta arasındaki açı hesaplanabilirse dairenin özelliğinden dolayı R*theta ifadesi ile mesafeyi de hesaplayabiliriz.
Kilometre cinsinden formül şöyle.
public static double distFrom(double lat1, double lng1, double lat2, double lng2){
    double earthRadius = 6371.0;//kilometer
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double sindLat = Math.sin(dLat / 2);
    double sindLng = Math.sin(dLng / 2);
    double a = Math.pow(sindLat, 2) + Math.pow(sindLng, 2)
            * Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2));
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double dist = earthRadius * c;

    return dist;
}
Metre cinsinden formül şöyle.
double distance(double fromLat, double fromLon, double toLat, double toLon) {
  double radius = 6378137;   // approximate Earth radius, *in meters*
  double deltaLat = toLat - fromLat;
  double deltaLon = toLon - fromLon;
  double angle = 2 * Math.asin( Math.sqrt(
        Math.pow(Math.sin(deltaLat/2), 2) + 
        Math.cos(fromLat) * Math.cos(toLat) * 
        Math.pow(Math.sin(deltaLon/2), 2) ) );
  return radius * angle;
}
Dünyanın yarıçapını 6371.0 kilometre kabul ediyor. Metre cinsinden hesaplamak için 6371,000 metre, mil cinsinden hesaplamak için 3958.75 mil kabul etmemiz gerekirdi. Formülü Spherical Law of Cosines ile açıklayan bir yazı burada.

Sanırım android.location.Location sınıfı bu formülü kullanıyor. 

2. Tam Olarak Hesaplama - Vincenty's Formülü
Daha yüksek hassasiyetle hesaplama için Geographical Distance sayfasında bahsedilen Vincenty's Formula kullanılabilir.


Hiç yorum yok:

Yorum Gönder