GPS aus EXIF Daten und Konvertierung für Google Maps

  • Hallo zusammen,


    ich schlage mich nun schon seit einigen Tagen mit einem Problem rum, dessen Lösung ich einfach nicht alleine schaffe. Ich habe schon dieses und diverse Foren durchsucht und denke das hier ist das professionellste um meine Frage los zu werden.


    Es geht um die Umrechnung von EXIF-GPS-Daten aus einem Bild für Google Maps. Die GPS-Daten im Bild sind in Grad, Minute und Sekunde hinterlegt und sehen dann etwa so aus:

    Zitat

    6/1 ; 39/1 ; -1664567296/100000000

    Diese rechne ich dann um und erhalte dies hier:

    Zitat

    6 ; 39 ; -16,64567296


    Dann noch umrechnen in Minuten (geteilt durch 60) und Sekunden (geteilt durch 3600):

    Zitat

    6 ; 0.65 ; 0.0046237980444444

    In der Theorie muss ich diese Werte ja nurnoch addieren und sollte (hier in dem Bsp) meinen Längengrad haben.


    Leider tuts das nicht so wie erwartet: 6.645376 kommt nämlich heraus. Aber es sollte 6.657307 heraus kommen. Prüfung mit Aperture für Mac und laut Google-Maps optische Kontrolle.


    Wäre super, wenn hier jmd den entscheidenden Tipp hätte. Ich dreh sonst druch.
    Wo ist mein umrechen Fehler? Muss ich irgendetwas berücksichtigen?


    MfG Martin

  • Dein Fehler ist das Minus-Zeichen, es gibt keine negativen Sekunden.


    Also die Sekunden nicht abziehen, dann dann kommt 6.65462 raus, was korrekt ist.


    Du kannst das auch z.B. in EasyGPS eingeben, Einstellung Grad Minuten Sekunden (6 39 16.6456...) und dann die Einstellung auf Dezimal ändern.

  • Hey Mike,


    danke für den Hinweis. Ich nehme an, dass das dann auch für die Minuten gilt!? Mein Problem war im Grunde also, dass ich den EXIF-Daten blind vertraut habe.


    Leider habe ich noch einen Denkfehler. Wenn die Sekunden (oder Minuten) kleiner Null sind, werden sie nicht addiert. okay. Aber dann kommt doch 6.65 raus. Das ist recht ungenau.


    Link aus Aperture:
    http://maps.google.de/maps?cli…-8&ie=UTF8&hl=de&t=h&z=19
    Link aus meiner Berechnung:
    http://maps.google.de/maps?cli…-8&ie=UTF8&hl=de&t=h&z=19


    Danke.


    Edit: also dieser Y-Sekunden Wert macht mir zu schaffen.

  • Hi,


    leider ist es das nicht... die drei Werte in Summe ergeben 6,65462379804 es mus aber 6.657307 herauskommen.


    6.657307 errechnet Photoshop (und andere tools) und dieser Wert zeigt die gesuchte stelle exakt an.


    Wenn ich meinen Wert nehme, habe ich eine Abweichung von ca 150m.


    Was rechnet also Photoshop (oder andere Tools) anders?

  • Also zum Beispiel Expression Media 2 gibt folgendes aus:
    Breitengrad: N 051° 08' 54.31''
    Längegrad: E 006° 39' 0-16.65''


    Dein Link zum Umrechnen kommt mit dem Breitengrad auch nicht klar (zumidnest nicht so)... ich dreh bald druch


    Das Apple onboard Tool "Vorschau" wirft folgende Daten aus:
    51° 8' 54.31''
    6° 39' 23,3''


    Komisch oder?


    iPhoto sagt auch:
    51° 8' 54.31''
    6° 39' 23,3''


    Aber was rechnen die, was ich nicht rechne? Hier nochmal meine Formel:


    [code:1]$xgrad = explode("/",$exif['GPS']['GPSLatitude'][0]); if ($xgrad[0] < 0) { $xgrad[0] = $xgrad[0]*-1; } $xgrad = $xgrad[0]/$xgrad[1];


    $xminuten = explode("/",$exif['GPS']['GPSLatitude'][1]); if ($xminuten[0] < 0) { $xminuten[0] = $xminuten[0]*-1; } $xminuten = ($xminuten[0]/$xminuten[1])/60;


    $xsekunden = explode("/",$exif['GPS']['GPSLatitude'][2]); if ($xsekunden[0] < 0) { $xsekunden[0] = $xsekunden[0]*-1; } $xsekunden = ($xsekunden[0]/$xsekunden[1])/3600;



    $ygrad = explode("/",$exif['GPS']['GPSLongitude'][0]); if ($ygrad[0] < 0) { $ygrad[0] = $ygrad[0]*-1; }$ygrad = $ygrad[0]/$ygrad[1];


    $yminuten = explode("/",$exif['GPS']['GPSLongitude'][1]); if ($yminuten[0] < 0) { $yminuten[0] = $yminuten[0]*-1; } $yminuten = ($yminuten[0]/$yminuten[1])/60;


    $ysekunden = explode("/",$exif['GPS']['GPSLongitude'][2]); if ($ysekunden[0] < 0) { $ysekunden[0] = $ysekunden[0]*-1; } $ysekunden = ($ysekunden[0]/$ysekunden[1])/3600;


    if ($exif['GPS']['GPSLatitudeRef'] == "N") { $latitude = $xgrad+$xminuten+$xsekunden; } else { $latitude = ($xgrad+$xminuten+$xsekunden)*-1; }
    if ($exif['GPS']['GPSLongitudeRef'] == "E") { $longitude = $ygrad+$yminuten+$ysekunden; } else { $longitude = ($ygrad+$yminuten+$ysekunden)*-1; }[/code:1]


  • Der Fehler muß beim Wert "0-16.65'' liegen, warum auch immer.
    Bei der Darstellung Grad Minuten Sekunden, müsste man ja die 16,65 direkt einsetzen können.


    Die "0-16.65'' muss also eine andere Bedeutung haben als 16,65 Sekunden.
    Aber keine Ahnung wie man von logisch 16,65 auf 23,3 kommen soll.

  • Hallo
    ich kann mich noch erinnern, dass ich bei einer Wehrübung ein ähnliches Problem hatte ( gesuchter Punkt war ca 140 m weiter entfernt.)


    wir hatten schon neue Karten, der "Auftraggeber" hatte eine Ältere benutzt.


    vielleicht liegt es daran.


    Habe bei Wicki das gefunden>>>>

    Lage des 50. Breitengrades nach World Geodetic System 1984 (WGS84) in Oestrich-Winkel im Rheingau. Nach dem für Topografische Karten in Deutschland angenommenen Potsdam-Datum liegt der 50. Breitengrad hier etwa 130 Meter weiter südlich.
    <<<<<<<


    aber ist nur eine Vermutung.

  • Hallo zusammen,


    nach Langem habe ich nun endlich mit Hilfe eines Mathematikers bzw. Informatikers die Lösung gefunden.


    Die negativen Zahlen innerhalb der EXIF Daten entstehen, wenn die Genauigkeit der Koordinate zunimmt. Man kann sich das etwa so vorstellen, dass immer mehr Nachkommastellen hinzugefügt werden, allerdings nicht als Nachkommastellen sondern als ganze Zahl. In der Informatik sind solche große Zahlen allerdings etwas problematisch, weshalb es zu dem Problem kommen kann.


    Die Lösung könnte nun sein nicht zu lange an einem Ort stehen zu bleiben (aber erklär das mal dem Photographen) oder man nimmt die Zahl 4294967296 und addiert die (negative) Zahl hinzu. Hierbei muss natürlich beachtet werden, dass diese Zahl auch sehr groß ist und richtig definiert werden muss (bei den meisten Systemen ist PHP aber schlau genug die Variable richtig zu definieren).


    Voila! Die weiteren Rechnenschritte (teilen durch 3600 etc) waren korrekt. Nun funktioniert auch mein Link zu Google-Map korrekt!


    Danke auch für den Hinweis mit den neuen Kartendefinitionen, aber das war nicht der Grund.

  • es kommt zu diesem "Überlaufen" der Zahlenvariable, weil es sich um eine sog. unsigned long integer handelt.
    In Wikipedia gibts dazu hier ne kleine Erläuterung - allerdings mehr was für Informatiker/Mathematiker.
    Aber man kann sagen, dass es sich ähnlich wie bei Hexadezimal verhält: nach der 256 kommt wieder die 1.


    Um von der "überlaufenen Zahl" also auf einen "Vernünftigen" Wert zu kommen muss man die negative Zahl eben auf der maximalen Zahl addieren (mathematisch a + -b). Ich glaube dadurch kommt es zu einer Elemenierung der letzten Kommastelle... aber für meine Anwendung allemal genug. Ich will ja nicht wissen, ob ich nun auf den cm oder mm genau stehe- 1 Meter reicht mir.

  • Zitat von "Topper23"

    Die Lösung könnte nun sein nicht zu lange an einem Ort stehen zu bleiben (aber erklär das mal dem Photographen) oder man nimmt die Zahl 4294967296 und addiert die (negative) Zahl hinzu. Hierbei muss natürlich beachtet werden, dass diese Zahl auch sehr groß ist und richtig definiert werden muss (bei den meisten Systemen ist PHP aber schlau genug die Variable richtig zu definieren).


    Voila! Die weiteren Rechnenschritte (teilen durch 3600 etc) waren korrekt. Nun funktioniert auch mein Link zu Google-Map korrekt!


    Hallo,


    ich habe das gleiche Problem, meine Koordinaten werden immer versetzt angezeigt. Wo ich jetzt die Zahl 4294967296 addieren muss, ist mir nicht ganz klar. Könntest Du evtl. das komplette Script von Dir posten??? Das wäre echt super!!!


    Vielen Dank,
    Doris

  • [code:1]$constante = "4294967296";
    $exif = exif_read_data($filename, 2, true);


    if ($exif['GPS']['GPSLatitude'][0] != NULL)
    {
    $xgrad = explode("/",$exif['GPS']['GPSLatitude'][0]);
    $xgrad = $xgrad[0]/$xgrad[1];
    $xminuten = explode("/",$exif['GPS']['GPSLatitude'][1]);
    $xminuten = ($xminuten[0]/$xminuten[1])/60;
    $xsekunden = explode("/",$exif['GPS']['GPSLatitude'][2]);

    if ($xsekunden[0] < 0) { $xsekunden[0] = $constante + $xsekunden[0]; }
    $xsekunden = ($xsekunden[0]/$xsekunden[1])/3600;
    $ygrad = explode("/",$exif['GPS']['GPSLongitude'][0]);
    $ygrad = $ygrad[0]/$ygrad[1];
    $yminuten = explode("/",$exif['GPS']['GPSLongitude'][1]);
    $yminuten = ($yminuten[0]/$yminuten[1])/60;
    $ysekunden = explode("/",$exif['GPS']['GPSLongitude'][2]);
    if ($ysekunden[0] < 0) { $ysekunden[0] = $constante + $ysekunden[0]; }
    $ysekunden = ($ysekunden[0]/$ysekunden[1])/3600;

    ($exif['GPS']['GPSLatitudeRef'] == "N") ? $latitude = $xgrad+$xminuten+$xsekunden : $latitude = ($xgrad+$xminuten+$xsekunden)*-1;
    ($exif['GPS']['GPSLongitudeRef'] == "E") ? $longitude = $ygrad+$yminuten+$ysekunden : $longitude = ($ygrad+$yminuten+$ysekunden)*-1;


    echo '<a href="http://maps.google.de/maps?client=safari&q='.$latitude.',%2B'.$longitude.'&oe=UTF-8&ie=UTF8&hl=de&t=h&z=19" target="_blank">Google</a>';
    }[/code:1]