iPhonebilder på Google Maps via GPS-tag

Det var ett tag sedan jag skrev en guide inom PHP nu, därför tänkte jag skriva lite Google Maps och PHP:s funktion exif_read_data.

Jag kommer i detta exemplet visa hur du plockar ut GPS-information från bilder tagna med en iPhone för att sedan visa vart bilden är tagen på Google Maps. Som nämnt tidigare kommer jag använda funktionen exif_read_data som hämtar ut exif-information från jpg bilder.

Beroende på vilken kamera bilden är tagen med kan man få ut information om bilden, till exempel GPS position, när bilden är tagen, vilken bländarinställning som användes med mera, men nu ska vi fokusera på att hämta ut GPS position.



Se demo eller ladda ner källkoden här.

Hämta bildens GPS position

Vi börjar med att hämta all information om bilden.

$metaData = exif_read_data('bild.jpg', 'ANY_TAG', 0);
print_r($metaData);

Detta resulterar i att vi får ut all meta information om bilden. Men det vi är ute efter är GPS informationen, här hittar vi GPSLongitud och GPSLatitud.

Ändra GPS format

Nackdelen är vi inte får ut GPS informationen i samma format som Google Maps använder, utan vi måste konvertera information till formatet DD (Decimal Degress).
Jag är ingen expert på GPS format med formeln ser ut enligt följande:
DD = Grader + (Minuter / 60).
Om vi tar exemplet från bilden så blir det: 56 + (39,92 / 60) = 56.6653333333

Jag har två funktioner för att returnera positionen.

public function convertToDecimalDegress($values)
{
	return $this->divide($values[0]) +  ($this->divide($values[1]) / 60) ;
}
		
public function divide($value)
{
	$values = explode("/", $value);
	return $values[0] / $values[1];
}

Som vi ser på bilden har vi värden i arrayen som till exempel, 3992/100, denna uträkning måste göras innan vi kan konvertera till DD formatet. Funktionen divide gör detta.
Funktionen convertToDecimalDegress gör uträkningen till formatet DD.

Resten av klassen

Vi har två klasser som tar hand om uträkningen. Nu är det dags att fylla på klassen med mer funktioner.

class MetaReader
{
	private $metaData = array();
	public function __construct($imageName)
	{
		$this->metaData = exif_read_data($imageName, 'ANY_TAG', 0);
	}
	public function getLatitude()
	{
		if(!isset($this->metaData['GPSLatitude'])) {
			return false;
		} else {
			return $this->convertToDecimalDegress($this->metaData['GPSLatitude']);
		}
	}
	public function getLongitude()
	{
		if(!isset($this->metaData['GPSLatitude'])) {
			return false;
		} else {
			return $this->convertToDecimalDegress($this->metaData['GPSLongitude']);
		}
	}
	public function convertToDecimalDegress($values)
	{
		return $this->divide($values[0]) +  ($this->divide($values[1]) / 60) ;
	}
	public function divide($value)
	{
		$values = explode("/", $value);
		return $values[0] / $values[1];
	}
}

Det vi har lagt till är en konstruktor som tar emot filnamnet som parameter, sen har vi två funktioner för att returnera latitud och longitud, getLatitude(), getLongitude().

Visa bilderna på Google Maps

Det första du måste göra för att använda Google Maps är att hämta en API-nyckel, detta kan du göra hos Google.

När du väl har fått din nyckel från Google är det dags att hämta GPS informationen från en bild.

$metaObj = new MetaReader('bild.jpg');
$latitude = $metaObj->getLatitude();
$longitude = $metaObj->getLongitude();

Nu får vi ut GPS-information från bilden i samma format som krävs för Google Maps. Nu är det bara att skicka in värdena till Google Maps javascript.



Här är javascript-koden för att placera ut en markering samt en textruta på kartan. För att köra denna javascriptfunktion kallar vi på den: <body onload="initialize();" onunload="GUnload();">

Ladda gärna ner källkoden för att studera koden närmare.
Jag hoppas du får lite nytta av detta exemplet.

Demo och källkod

Se demo eller ladda ner källkoden här.

Din kommentar eller åsikt