Copyright © Michal Sitko
Posty i artykuły na tym blogu są objęte prawem autorskim. Ich kopiowanie / używanie bez pisemnej zgody autora jest zabronione.
(Ustawa z dnia 4 lutego 1994 r. o prawie autorskim i prawach pokrewnych, Dz.U. z 1994 r. Nr 24, poz. 83)

Posts and articles on this blog are copyrighted. Their copying / use without written permission of the author is prohibited. Copyright is protected by Polish and international law.

poniedziałek, 20 czerwca 2011

GPS: Obliczanie odległości pomiędzy punktami

Dysponując odczytami z odbiornika GPS, czasami przydatna jest umiejętność obliczenia odległości pomiędzy dwoma punktami. Ponieważ  Ziemia jest kulą, nie można obliczyć tej odległości tak jak oblicza się odległość miedzy punktami na płaszczyźnie.

Implementacja obliczenia odległości pomiędzy dwoma punktami w języku Objective C mogłaby wyglądać tak jak poniżej:


static inline double radians (double degrees) {return degrees * M_PI/180;}

//...


- (double) distanceBetweenPointsLat1: (double) lat1 long1: (double) long1 lat2: (double) lat2 long2: (double) long2{
    double a, c, d, R;
    double dLat, dLong;
    R = 6371;
    
    dLat = radians(lat2-lat1);
    dLong = radians(long2 - long1);
    
    a = sin(dLat/2)*sin(dLat/2)+
    cos(radians(lat1))*cos(radians(lat2))*
    sin(dLong/2)*sin(dLong/2);
    
    c = 2 * atan2(sqrt(a), sqrt(1-a));
    
    d = R * c;
    
    return d * 1000;
}


Chcąc sprawdzić np. jak długi (w metrach) jest pas startowy na lotnisku w Katowicach Pyrzowicach mając współrzędne geograficzne punktów na obu jego końcach, możemy to zrobić tak:


    double dist;
    dist = [self  distanceBetweenPointsLat1:50.4743 long1:19.0549 lat2:50.4743 long2:19.0944];
    
Podstawy matematyczne dotyczące powyższych obliczeń można znaleźć tutaj:

1 komentarz:

  1. Można krócej $c = 2 * asin(sqrt($a)); Cały skrypt na wolnej licencji pod adresem http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

    OdpowiedzUsuń