PHP Guru

PHP Entwickler - Kevin Quiatkowski

[ Startseite ] : : [ PHP Themen ] [ HTML/CSS Themen ] [ Testberichte ] [ Sonstige Themen ] : : [ Impressum ]

PHP: Geotags aus Bildern auslesen und in Google Maps anzeigen

Geschrieben von am 4. Apr 2010 um 15:47 Uhr

Auf meiner Bilderseite (http://wishpictures.net) werden nun auch Geotags ausgelesen, und eine entsprechende Karte angezeigt. Vorrausgesetzt im Bild sind überhaupt Geotags gespeichert.
Falls du dich jetzt fragst was Geotags sind, es handelt sich dabei um GPS Koordinaten die in Bildern Gespeichert werden. die geschieht entweder mit Kameras die ein GPS Modul eingebaut haben, oder hinterher per Software. Da ich bereits anfragen erhalten habe wie das auslesen denn Funktioniert habe ich 4 kleine Funktionen geschrieben die ihr nutzen könnt.

  • GPSLongitude(exif_array) Ausgabe der Longitude in Grad, Minuten und Sekunden, fertig Formatiert. Im Fehlerfall == False
  • GPSLatitude(exif_array) Ausgabe der Latiude in Grad, Minuten und Sekunden, fertig Formatiert. Im Fehlerfall == False
  • GPSLongitudeDezi(exif_array) Ausgabe der Longitude als Dezimalzahl. Im Fehlerfall == False
  • GPSLatitudeDezi(exif_array) Ausgabe der Latiude als Dezimalzahl. Im Fehlerfall == False

Wer nicht nur die Zahlen auf seiner Seite ausgeben möchte sondern auch eine Karte von Google Maps benötigt noch etwas JavaScript und ein API Key. Den API Key bekommt ihr Kostenlos auf http://code.google.com/intl/de-DE/apis/maps/signup.html

Der Javascript Code muss in den Head Bereich, in den Body Tag. außerdem wird ein wenig HTML im Body Bereich benötigt.

Head:
Es muss eine Datei vom Google Server geladen werden. hier mus der API Key mit angegeben werden.
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=DEIN_API_KEY&amp;sensor=false" type="text/javascript"></script>
zudem noch nachfolgendes, bei den die Latidude und die Longitude angegeben werden müssen
<script type="text/javascript">
//<![CDATA[
function initialize() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById('map'));
map.setCenter(new GLatLng(LATIDUDE_DEZ,LONGITUDE_DEZ), 18, G_HYBRID_MAP);
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.addControl(new GScaleControl());
map.addControl(new GOverviewMapControl());
//var infoTabs = [
//new GInfoWindowTab('Info', '<font color=\'#000000\'>Die Aufnahme wurde an dieser Position aufgenommen</font>'),
//new GInfoWindowTab('Koordinaten','<font color=\'#000000\'>Breitengrad: LATIDUDE_DEZ<br>Längengrad: LONGITUDE_DEZ</font>')
//];
var marker = new GMarker(map.getCenter());
GEvent.addListener(marker, 'click', function() {
marker.openInfoWindowTabsHtml(infoTabs);
});
map.addOverlay(marker);
marker.openInfoWindowTabsHtml(infoTabs);
}
}
//]]>
</script>

in den Body Tag muss folgendes:
onload="initialize()" onunload="GUnload()"
An der Stelle an der dann die Karte erscheinen soll muss ein DIV belibiger größe mit der ID "map"
<div id='map' style='width: 100%; height: 400px'></div>

Nachfolgende der Code für die PHP Funktionen. Ihr dürft ihn uneingeschränkt nutzen, allerdings würde ich mich über ein Danke Freuen :)
$file ist der Pfad zu eurem Bild $exif_data = exif_read_data($file, 0 , true);
function GPSLongitude($exif_data)
{
if (isset($exif_data["GPS"]["GPSLongitudeRef"]))
{
$GPSLongitudeRef = $exif_data["GPS"]["GPSLongitudeRef"];
if($GPSLongitudeRef == "E")
{
$GPSLongfaktor = 1;
}
else
{
$GPSLongfaktor = -1;
}
}
else
{
return False;
}
if (isset($exif_data["GPS"]["GPSLongitude"]))
{
$GPSLongitude = $exif_data["GPS"]["GPSLongitude"];
$GPSLongitude_h = explode("/", $GPSLongitude[0]);
$GPSLongitude_m = explode("/", $GPSLongitude[1]);
$GPSLongitude_s = explode("/", $GPSLongitude[2]);
$GPSLong_h = $GPSLongitude_h[0] / $GPSLongitude_h[1];
$GPSLong_m = $GPSLongitude_m[0] / $GPSLongitude_m[1];
$GPSLong_s = $GPSLongitude_s[0] / $GPSLongitude_s[1];
$GPSLongitude = $GPSLongitudeRef . " " . $GPSLong_h . "° ". $GPSLong_m . "' " . $GPSLong_s;
return $GPSLongitude;
}
else
{
return False;
}
}
function GPSLatitude($exif_data)
{
if (isset($exif_data["GPS"]["GPSLatitudeRef"]))
{
$GPSLatitudeRef = $exif_data["GPS"]["GPSLatitudeRef"];
if($GPSLatitudeRef == "N")
{
$GPSLatfaktor = 1;
}
else
{
$GPSLatfaktor = -1;
}
}
else
{
return False;
}
if (isset($exif_data["GPS"]["GPSLongitude"]))
{
$GPSLatitude = $exif_data["GPS"]["GPSLatitude"];
$GPSLatitude_h = explode("/", $GPSLatitude[0]);
$GPSLatitude_m = explode("/", $GPSLatitude[1]);
$GPSLatitude_s = explode("/", $GPSLatitude[2]);
$GPSLat_h = $GPSLatitude_h[0] / $GPSLatitude_h[1];
$GPSLat_m = $GPSLatitude_m[0] / $GPSLatitude_m[1];
$GPSLat_s = $GPSLatitude_s[0] / $GPSLatitude_s[1];
$GPSLatitude = $GPSLatitudeRef . " " .$GPSLat_h . "° ". $GPSLat_m . "' " . $GPSLat_s;
return $GPSLatitude;
}
else
{
return False;
}
}
function GPSLongitudeDezi($exif_data)
{
if (isset($exif_data["GPS"]["GPSLongitudeRef"]))
{
$GPSLongitudeRef = $exif_data["GPS"]["GPSLongitudeRef"];
if($GPSLongitudeRef == "E")
{
$GPSLongfaktor = 1;
}
else
{
$GPSLongfaktor = -1;
}
}
else
{
return False;
}
if (isset($exif_data["GPS"]["GPSLongitude"]))
{
$GPSLongitude = $exif_data["GPS"]["GPSLongitude"];
$GPSLongitude_h = explode("/", $GPSLongitude[0]);
$GPSLongitude_m = explode("/", $GPSLongitude[1]);
$GPSLongitude_s = explode("/", $GPSLongitude[2]);
$GPSLong_h = $GPSLongitude_h[0] / $GPSLongitude_h[1];
$GPSLong_m = $GPSLongitude_m[0] / $GPSLongitude_m[1];
$GPSLong_s = $GPSLongitude_s[0] / $GPSLongitude_s[1];
$GPSLongGrad = $GPSLongfaktor * ($GPSLong_h + ($GPSLong_m + ($GPSLong_s / 60))/60);
return $GPSLongGrad;
}
else
{
return False;
}
}
function GPSLatitudeDezi($exif_data)
{
if (isset($exif_data["GPS"]["GPSLatitudeRef"]))
{
$GPSLatitudeRef = $exif_data["GPS"]["GPSLatitudeRef"];
if($GPSLatitudeRef == "N")
{
$GPSLatfaktor = 1;
}
else
{
$GPSLatfaktor = -1;
}
}
else
{
return False;
}
if (isset($exif_data["GPS"]["GPSLongitude"]))
{
$GPSLatitude = $exif_data["GPS"]["GPSLatitude"];
$GPSLatitude_h = explode("/", $GPSLatitude[0]);
$GPSLatitude_m = explode("/", $GPSLatitude[1]);
$GPSLatitude_s = explode("/", $GPSLatitude[2]);
$GPSLat_h = $GPSLatitude_h[0] / $GPSLatitude_h[1];
$GPSLat_m = $GPSLatitude_m[0] / $GPSLatitude_m[1];
$GPSLat_s = $GPSLatitude_s[0] / $GPSLatitude_s[1];
$GPSLatGrad = $GPSLatfaktor * ($GPSLat_h + ($GPSLat_m + ($GPSLat_s / 60))/60);
return $GPSLatGrad;
}
else
{
return False;
}
}


Teile diesen Artikel


Kommentare

Kevin Quiatkowski am 4.4.2010 um 17:25 Uhr

Nach schätzungsweise 50 Edits sollte der Code weitgehnds lesbar sein. Dies Wordpress will mir bei jedem Speichern immer den Code klauen. Bei der Benutzung bitte Kopf einschalten, kann sein das an der einen oder anderen Stelle Zeichen Falsch dargestellt sind.

Martin am 15.5.2010 um 19:47 Uhr

Hallo Kevin!
Vielen Dank für die tolle Funktionen, das it genau was ich machen möchte, und dein Code wird mir viel Arbeit sparen. Das mit google habe ich noch nicht ausprobiert, aber die php-Funktionen laufen gut. Zwei kleine Copy-Paste Fehler haben sich oben eingeschlichen:
1) Bei der GPSLongitudeDezi ist in der Formel der LatitudeFaktor hineingerutscht
2) Bei der GPSLatitudeDezi ist bei der Referenz ein E statt einem N drin.

Nochmals herzlichen Dank und Grüsse
Martin

Ansgar am 11.10.2010 um 4:42 Uhr

Das sind sehr nützliche Funktionen. Funktioniert tadellos wenn man die von Martin erwähnten Fehler korrigiert.
Hat mir einige Arbeit gespart.
Ich entwickle gerade eine Galerie wo diese Funktionen Verwendung finden werden (Vorausgesetzt der jeweilige Galeriebesitzer lässt es zu.)

Kevin Quiatkowski am 3.7.2011 um 11:59 Uhr

Mit der Portierung in meinen neuen Blog sollten die Fehler im Code behoben sein.

Kommentar hinzufügen

Name: (Pflichtfeld)
E-Mail: (Pflichtfeld, wird nicht angezeigt)
Homepage: (Optional, da du nicht eingeloggt bist nofollow)
Da du nicht eingeloggt bist muss erscheint dein Kommentar nicht sofort nach dem absenden sondern muss erst vom Admin freigeschaltet werden.
Kommentar: