I går så handlade det om att ladda upp bilder till en server och visa var de var tagna på en karta genom att läsa EXIF informationen i bilderna. Nu hade jag tänkt gå vidare med att även skriva denna information till en PostGIS databas och därmed göra den tillgänglig för exempelvis QGIS.
Med utgångspunkt i förra php dokumentet görs nedanstående tillägg:
// Lägg till en punkt i databasen if ($lat!=0) { // Förklaring 1 $sql = "INSERT INTO foton (geom, namn, longitude, latitude, link) VALUES (ST_GeomFromText('POINT($lon $lat)',4326), '$uppladdad', $lon, $lat, '$newfile')"; // Förklaring 2 $databas = pg_connect("host='192.168.0.25' port='5432' dbname='geodata' user='user' password='password'"); // Förklaring 3 if (!$databas) { // Förklaring 5 die("Fel i databasanslutning: " . pg_last_error()); } $resultat = pg_query($databas, $sql); // Förklaring 4 if (!$resultat) { // Förklaring 5 die("Fel i SQL-frågan: " . pg_last_error()); } pg_free_result($resultat); // Förklaring 6 pg_close($databas); // Förklaring 6 } // Förklaring 1
Det var det hela…
Nåja, det krävs nog både en och annan förklaring.
- Först så testar man om det finns ett värde i $lat. Det är ju onödigt att spara data till databasen som har en felaktig position, det vill säga bilder utan GPS-data.
- SQL raden innehåller kommandot för att lägga till en rad i tabellen ”foton”. I första parentesen listas de kolumner i tabellen man vill skriva till. Lägg märke till kolumnen som heter ”geom”. Denna skapas automatiskt när man skapar en ny PostGIS tabell i QGIS. Kontrollera i PgAdminIII vad den heter i ditt fall. Den andra parentesen, efter VALUES, innehåller de värden som skall skrivas till kolumnerna. Dessa skall komma i samma ordning som i den förra parentesen. För att göra om lat/long värdena till geometri så används funktionen ST_GeomFromText. I denna funktion så anges även att koordinaterna är i WGS84 (EPSG:4326). Tänk även på att kolumner av typen text skall vara omslutna av ’enkelfnuttar’, medan siffervärden inte skall det.
- PG_Connect, försöker koppla upp mot en databas och sparar resultatet i variabeln ”$resultat”. Alla parametrarna i anslutningssträngen måste anpassas till de rådande förutsättningarna. I bland kan det vara problem att ansluta med en del användare, men prova med användaren postgres om du har problem.
- Pg_Query, utför det sqlkommando som skapades tidigare.
- De båda ”if” satserna testar om något gått fel i kommandona och skriver i så fall ut ett felmeddelande.
- Avslutningsvis frigörs resultatet och databaskopplingen stängs.
Nu kan jag ladda upp en bild på en webbsida (ladda.htm):
Om bilden har GPS information i EXIF-data så visas den på kartan:
Men jag kan även öppna PostGIS lagret i QIGS och titta på data där:
I bilden ovan så visar jag hur jag även skapat ett ”kommando” som öppnar webbläsaren och visar den bild som är uppladdad i varje punkt.
Om du lyckats ladda hem och få igång php-sidan från igår så lägger du till koden ovan på rad 141 (efter $popkod raderna men innanför ”else” satsens klammerparentes).
Tänk även på att du måste själv skapa en tabell med lämpliga kolumner i PostGIS, samt att sätta rättigheterna på den användare du vill använda i php-skriptet. Sedan måste du anpassa SQL-kommandot så att det passar din tabell.