Nu är det dags att göra ett nytt försök med PHP och geotaggade bilder.
I ett tidigare inlägg skapade jag en hemsida där man fyller i bildpositioner och sökväg till bilder som redan är uppladdade för att sedan lagra dessa i en geodatabas, och sedan kunna visa dessa direkt via geoserver.
Nu har jag tänkt att lägga till uppladdning till den egna servern via PHP, men även att läsa information från EXIF data i bilderna. Om det är en kamera med GPS så får man då förhoppningsvis all information på köpet.
Jag är inget proffs på PHP så den mesta koden har jag hämtat från olika källor på Internet.
Först och främst så behöver du en webserver med PHP och där skapas en PHP fil (exempelvis foton.php) och en katalog som skriptet har skrivrättigheter i (exempelvis foton/). Hur detta går till kan du läsa i mina tidigare inlägg.
Innehållet i PHP filen går vi nu igenom stegvis. Du kan själv lägga till stilmallar, bilder, färg etc så jag fokuserar här enbart på funktionen.
<?php //Funktioner för att beräkna GPS data function getGps($exifCoord, $hemi) { $degrees = count($exifCoord) > 0 ? dela($exifCoord[0]) : 0; $minutes = count($exifCoord) > 1 ? dela($exifCoord[1]) : 0; $seconds = count($exifCoord) > 2 ? dela($exifCoord[2]) : 0; $flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1; return $flip * ($degrees + $minutes / 60 + $seconds / 3600); } //Dela EXIF data med "bråk" värde function dela($coordPart) { $parts = explode('/', $coordPart); if (count($parts) <= 0) return 0; if (count($parts) == 1) return $parts[0]; return floatval($parts[0]) / floatval($parts[1]); } //Hur stor får bilden vara i Kb define ("MAX_SIZE","1024"); //Här kontrolleras filändelsen på bilden. function getExtension($str) { $i = strrpos($str,"."); if (!$i) { return ""; } $l = strlen($str) - $i; $ext = substr($str,$i+1,$l); return $ext; } //Sätt en flagga till 0, om fel uppstår sätt flaggan till 1. Då kommer filen inte att laddas upp. $errors=0;
Den första delen ovan består av några funktioner och variabler som anropas senare i skriptet. Läs koden så tror jag att du i allafall förstår principen av vad de olika funktionerna gör. Observera att filer inte kan vara större än 2 Mb med PHP, utan att göra andra förändringar i serverns inställningar.
//Kontrollera om man tryckt på "ladda upp" if(isset($_POST['Submit'])) {
Det som skrivs i denna if sats körs bara om någon tryckt på knappen ”ladda upp”. Nedan så läser man filnamnet på den uppladdade filen och testar om variabeln har innehåll.
//Läs filnamnet på den uppladdade filen. $image=$_FILES['image']['name']; //Testa om variabeln har innehåll... if ($image) {
Om så är fallet så körs det som finns i if satsen. Innan filen sparas så görs lite tester.
//Hämta filens originalnamn $filename = stripslashes($_FILES['image']['name']); //Hämta filändelsen med små bokstäver $extension = getExtension($filename); $extension = strtolower($extension); //Om ändelsen inte är känd så antas att något fel inträffat. if (($extension != "jpg") && ($extension != "jpeg") ) { //Skriv felmeddelande echo '<h1>Okänt filformat!</h1>'; $errors=1; } else {
Ovanstående testar om filformatet är jpg eller jpeg. Om inte så skrivs ett felmeddelande. Om det däremot är rätt filformat så körs nedanstående kod.
//Filstorlek i bytes //$_FILES['image']['tmp_name'] är det tillfälliga filnamnet som använts på servern $size=filesize($_FILES['image']['tmp_name']); //Testa hur stor filen är och avbryt om filen är större än vad som är tillåtet if ($size > MAX_SIZE*1024) { echo '<h1>Tillåten filstorlek har överskridits!</h1>'; $errors=1; }
Testa filstorleken på bilden, och om den överstiger det som är angivet i variabeln i skriptets början så skrivs ett felmeddelande ut.
//ett nytt unikt filnamn, exempelvis ett UNIX tidsnummer. $image_name=time().'.'.$extension; //det nya namnet innehåller även sökvägen (redigera för ny sökväg) $newname="foton/".$image_name; //överför filen till den nya platsen med det nya namnet, visa felmeddelande om det inte gick. $copied = copy($_FILES['image']['tmp_name'], $newname); if (!$copied) { echo '<h1>Kopiering misslyckades!</h1>'; $errors=1; }}}}
Ovanstående tilldelar filen ett nytt unikt filnamn och lagrar bilden på sökvägen som anges i variabeln $newname. Om något misslyckas så skrivs ett felmeddelande ut. De avslutande klammerparanteserna avslutar alla ovanstående if-satser.
Nedan följer vad som görs om allt gått bra.
//Om allt gick bra så görs nedanstående if(isset($_POST['Submit']) && !$errors) { //Skriv meddelande om att allt gick bra. echo "<h1>Filen uppladdad!</h1>"; //hämta EXIF informationen från filen $exif = read_exif_data($newname); //skriv ut resultatet $emake =$exif['Make']; $emodel = $exif['Model']; $eexposuretime = $exif['ExposureTime']; $efnumber = dela($exif['FNumber']); $eiso = $exif['ISOSpeedRatings']; $edate = $exif['DateTime']; $dir = dela($exif['GPSImgDirection']); $alt = dela($exif['GPSAltitude']); $lon = getGps($exif['GPSLongitude'], $exif['GPSLongitudeRef']); $lat = getGps($exif['GPSLatitude'], $exif['GPSLatitudeRef']); echo "<br />\n"; echo "Bildfil: <a href='$newname'>Visa bild</a><br />\n"; echo "Longitud: $lon<br />\n"; echo "Latitud: $lat<br />\n"; echo "Höjd: $alt<br />\n"; echo "Riktning: $dir<br /><br />\n"; echo "Kamera tillverkare: $emake<br />\n"; echo "Modell: $emodel<br />\n"; echo "Exponering: $eexposuretime s<br />\n"; echo "F-numer: $efnumber<br />\n"; echo "ISO: $eiso<br />\n"; echo "Tidpunkt: $edate<br />\n"; } ?>
Variablerna ovan kan relativt enkelt användas för att fylla i värden i ett nytt formulär av den typ som jag visade i den tidigare artikeln (länk ovan). Raderna med ”echo” skriver ut saker på skärmen, och ett exempel på detta kan du se i bilden nedan.
<!--formuläret, enctype måste vara "multipart/frm-data" och vara av typen "file" --> <form name="newad" method="post" enctype="multipart/form-data" action=""> <table> <tr><td><input type="file" name="image"><i>Max 1 Mb</i></td></tr> <tr><td><input name="Submit" type="submit" value="Ladda upp bild"></td></tr> </table> </form>
Formuläret ovan används för att välja och ladda upp bilderna.
Vill du testa skriptet ovan så finns det på min Ubuntu server. Klicka här.
Nästa steg för mig blir att försöka kombinera ihop det som beskrivs ovan med det jag gjort tidigare så att det blir smidigt att ladda upp bilder och samtidigt skapa geodata som kan presenteras via geoserver. Jag skall dessutom se om jag kan få tag i bilder från lite fler typer av kameror, men för tillfället så kan jag i alla fall konstatera att det fungerar med Iphone.