Reklama FAQ Szukaj Użytkownicy Grupy     Zaloguj się, by sprawdzić wiadomości Profil Rejestracja Zaloguj  
Forum GPS24 :: Nawigacja GPS :: Monitorowanie Pojazdów Strona Główna
Poprzedni temat «» Następny temat
Autor Wiadomość
pavulon

Dołączył: 25 Cze 2008
Posty: 2
Wysłany: 2008-06-25, 23:46   Nietypowy problem matematyczny

Witam serdecznie. Na wstępie chciałbym zaznaczyć, że nie jestem znawcą tematu GPS i tym podobnych, więc proszę o wyrozymiałość w pewnych kwestiach.

Podczas tworzenia pewnego skryptu, który ma za zadanie obsłużyć dane zawarte w pliku który jest tworzony przez urządzenie GPS, napotkałem pewien problem. Otóż urządzenie to zwraca współrzędne w postaci:
53.585637,20.551317
Jakimś cudem udało mi się to zamienić po pewnym czasie szukania w internecie na postać:
N 53° 35' 8.29'' E 20° 33' 4.74''

Niby nic trudnego, jak się okazało. Jednak problem pojawia się przy chęci ustalenia odległośći w metrach pomiędzy dwoma takimi punktami. W zasadzie nie ma to znaczenia czy będzie to wyliczone za pomocą pierwszych czy drugich współrzędnych. Po kolejnych poszukiwaniach odnalazłem pewną metodę na obliczanie tejże odległości:
http://www.movable-type.c...g-vincenty.html

Jednak metoda ta jest dla mnie całkowicie nie zrozumiała. Co prawda jest na tej stronie skrypt wyliczający taką odległość, jednak nie w języku który jest mi dobrze znany. Moja prośba i zarówno problem polega na znalezieniu kogoś życzliwego, kto mógłby poświęcić chwilę i wytłumaczyć mi jak należy taką odległość wyliczyć. Rewelacyjnie by już było, gdyby można uwzględnić także różnicę wysokości pomiędzy punktami. Z tego co się doczytałem w/w wzór/metoda jej nie uwzględnia. Czy znajdzie się ktoś z taką wiedzą?
 
 
rubin 
szara mysz


Dołączył: 22 Gru 2007
Posty: 41
Wysłany: 2008-06-26, 01:31   

pavulon napisał/a:
Niby nic trudnego, jak się okazało. Jednak problem pojawia się przy chęci ustalenia odległośći w metrach pomiędzy dwoma takimi punktami.
mój dobry znajomy pisał jakiśczas temu soft w którym napotkał podobny problem i z tego co pamiętam udało mu się go rozwiązać. kołaczą mi się po głowie "koła wielkie" o których wspominał mi przy okazji.. możesz spróbować pogooglać za tym..
pavulon napisał/a:
Co prawda jest na tej stronie skrypt wyliczający taką odległość, jednak nie w języku który jest mi dobrze znany.
jak patrzę na ten kod to coś mi świta, że problem polega na tym, że przecinające się równoleżniki i południki tworzą figury przypominające "trapezy" o podstawach z równoleżników i ramionach z południków (które są lekko zakrzywione). w tym fragmencie
Kod:
  var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
    B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
wygląda jak rozwinięcie w szereg fouriera jakiejś funkcji trygonometrycznej. pewnie chodzi o poprawkę na niedokładność spowodowaną tym, że liczymy odległosć po łuku a nie po prostej...
Cytat:
. Rewelacyjnie by już było, gdyby można uwzględnić także różnicę wysokości pomiędzy punktami. Z tego co się doczytałem w/w wzór/metoda jej nie uwzględnia.
jeśli chodzi o wyznaczanie stosunkowo niewielkich odległości to poprawka na wysokość nad poziomem moża sprowadza się do zabawy w twierdzenie pitagorasa o 3kącie prostokątnym gdzie odległość wyliczona przed chwilą jest jedną przyprostokątną a różnica wysokośći pkt pomiarowych drugą... urządzenia zgodne z protokołem NMEA sekwencja $GPGGA zwraca wysokość n.p.m.
Cytat:
Moja prośba i zarówno problem polega na znalezieniu kogoś życzliwego, kto mógłby poświęcić chwilę i wytłumaczyć mi jak należy taką odległość wyliczyć.
mogę spróbować wydębić od znajomego jakieś materiały na ten temat, ale raczej nie szybciej niż na poniedziałek 30.06 (urlop)...
_________________
a702+AM5.0.5+MioMap3.3+iGo8... c720... moov 330
 
 
 
pavulon

Dołączył: 25 Cze 2008
Posty: 2
Wysłany: 2008-06-26, 09:33   

Oczywiście postaram się coś tutaj wydedukować, jadnak jeżeli byłoby to możliwe byłbym bardzo wdzięczny za wszelką pomoc. Także dziękuję za tę wypowiedź.

Z tweirdzeniem pitagorasa wpadłem wczoraj późnym wieczorem, więc nie jest ze mną tak źle :)

[ Dodano: 2008-07-02, 09:13 ]
Jednak dałem jakoś radę :) Efekt pracy poniżej, czyli funkcja PHP odpowiadająca za wyliczanie odległości pomiędzy dwoma punktami z uwzględnieniem wysokosci (współrzędne podawane w radianach):

Kod:
function distVincenty($lat1, $lon1, $lat2, $lon2, $ele1, $ele2) {
    $a = 6378137; $b = 6356752.3142;  $f = 1/298.257223563;  // WGS-84 ellipsiod
    $L = deg2rad($lon2-$lon1);
    $U1 = atan((1-$f) * tan(deg2rad($lat1)));
    $U2 = atan((1-$f) * tan(deg2rad($lat2)));
    $sinU1 = sin($U1); $cosU1 = cos($U1);
    $sinU2 = sin($U2); $cosU2 = cos($U2);
      $lambda = $L;
    $lambdaP = 2*pi();
    $iterLimit = 20;
    while (abs($lambda-$lambdaP) > 1e-12 && $iterLimit-- > 0) {
    $sinLambda = sin($lambda); $cosLambda = cos($lambda);
    $sinSigma = sqrt(($cosU2*$sinLambda) * ($cosU2*$sinLambda) + ($cosU1*$sinU2-$sinU1*$cosU2*$cosLambda) * ($cosU1*$sinU2-$sinU1*$cosU2*$cosLambda));
    if ($sinSigma==0) return 0;  // co-incident points
    $cosSigma = $sinU1*$sinU2 + $cosU1*$cosU2*$cosLambda;
    $sigma = atan2($sinSigma, $cosSigma);
    $sinAlpha = $cosU1 * $cosU2 * $sinLambda / $sinSigma;
    $cosSqAlpha = 1 - $sinAlpha*$sinAlpha;
    $cos2SigmaM = $cosSigma - 2*$sinU1*$sinU2/$cosSqAlpha;
    if (!$cos2SigmaM) { $cos2SigmaM = 0; } // equatorial line: cosSqAlpha=0 (§6)
    $C = $f/16*$cosSqAlpha*(4+$f*(4-3*$cosSqAlpha));
        $lambdaP = $lambda;
     $lambda = $L + (1-$C) * $f * $sinAlpha * ($sigma + $C*$sinSigma*($cos2SigmaM+$C*$cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM)));
     }
     if ($iterLimit==0) return null;  // formula failed to converge
    $uSq = $cosSqAlpha * ($a*$a - $b*$b) / ($b*$b);
    $A = 1 + $uSq/16384*(4096+$uSq*(-768+$uSq*(320-175*$uSq)));
    $B = $uSq/1024 * (256+$uSq*(-128+$uSq*(74-47*$uSq)));
    $deltaSigma = $B*$sinSigma*($cos2SigmaM+$B/4*($cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM)-$B/6*$cos2SigmaM*(-3+4*$sinSigma*$sinSigma)*(-3+4*$cos2SigmaM*$cos2SigmaM)));
    $s = $b*$A*($sigma-$deltaSigma);
    $s = round($s, 3); // round to 1mm precision
    $odleglosc = sqrt($s*$s + (abs($ele1 - $ele2)*abs($ele1-$ele2)));
    return round($odleglosc, 3);
    }

Wszystko działa, śmiga, elegancko :)
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xand created by spleen & Soft.

Dentysta Wroclaw
Nowe rozwiazania GPS oraz aplikacje i urzadzenia GPS wybrane przez specjalistow dla fanow nowych technologii.