PHP och PostGIS

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.

  1. 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.
  2. 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.
  3. 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.
  4. Pg_Query, utför det sqlkommando som skapades tidigare.
  5. De båda ”if” satserna testar om något gått fel i kommandona och skriver i så fall ut ett felmeddelande.
  6. Avslutningsvis frigörs resultatet och databaskopplingen stängs.

Nu kan jag ladda upp en bild på en webbsida (ladda.htm):

Skärmbild från 2014-02-02 14:57:25

Om bilden har GPS information i EXIF-data så visas den på kartan:

Skärmbild från 2014-02-02 14:59:07

Men jag kan även öppna PostGIS lagret i QIGS och titta på data där:

Skärmbild från 2014-02-02 15:03:47

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.

Annonser

Taggar:, ,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: