Det var ett tag sedan jag testade lite servertjänster, men nu är det dags igen. Inte minst då releasen av Postgres 10 på sikt kommer att innebära att jag behöver uppgradera min databas, och då kan det vara bra att ha något att testa med innan.
I detta inlägg blir det dock lite annat…
Jag kommer att kika lite i mitt gamla dokument om att ”skapa en egen server för geodatatjänster” som finns under rubriken ”Testa själv” ovan. Ett dokument som i många stycken fortfarande är aktuellt.
Jag börjar med en Ubuntu server (16.04.2) där jag installerar PostGIS från UbuntuGIS, vilket innebär 2.3.3, så inte Postgres 10.
sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable sudo apt update sudo apt install postgis
Ändra i filerna /etc/postgresql/9.5/main/postgresql.conf och /etc/postgresql/9.5/main/pg_hba.conf:
(postgresql.conf) listen_addresses = '*' (pg_hba.conf lägg till) host all all 192.168.0.1/24 md5
Sedan är det bara att starta om tjänsten med sudo service postgresql restart och ändra lite lösenord.
sudo passwd postgres sudo -u postgres psql \password postgres \q
Nu kan man fortsätta i pgAdminIII om man vill det, men det går lika bra att köra skript i terminalen. Skall man bara klippa och klistra så går det faktiskt snabbare, men att sätta upp lite användare, grupper och rättigheter är nog smidigare i pgAdminIII.
sudo -u postgres createdb geodata sudo -u postgres psql -d geodata -f postgis.sql sudo -u postgres psql -d geodata -f postgis_comments.sql sudo -u postgres psql -d geodata -f spatial_ref_sys.sql sudo -u postgres psql -d geodata -f topology.sql sudo -u postgres psql -d geodata -f topology_comments.sql sudo -u postgres psql -d geodata -f rtpostgis.sql sudo -u postgres psql -d geodata -f raster_comments.sql
Alla kommandon ovan körs från katalogen /usr/share/postgresql/9.5/contrib/postgis-2.3/, där det finns en mängd sql-skript man kan använda.
Genom att lägga till användare och eventuellt grupper i pgAdminIII och ändra ”ägare” av den skapade databasen, kan jag sedan skapa en anslutning till databasen från en QGIS klient.
Väl ansluten till databasen kan ett nytt ”schema” skapas med DB Manager, och i detta schema kan man sedan ladda upp tabellstrukturer som man skapar i QGIS med exempelvis ett minneslager.
Detta PostGIS lager kan sedan hanteras i QGIS som vilket lager som helst!
Men det var inte det här jag egentligen ville testa. Att sätta upp en geodatabas i PostGIS är kanske inte en barnlek, men det är banne mig inte speciellt svårt!
Webbserver
Det jag ville testa (igen) var att skapa en koppling till PostGIS från ett webbformulär, och då behöver jag en webbserver.
sudo apt install apache2 sudo apt install php7.0 php7.0-pgsql libapache2-mod-php7.0 sudo service apache2 restart
Webbserverns ”root” katalog finns på sökvägen /var/www/html/ där man också kan skapa nya filer för lite experiment. För mer allvGeoportal (grund)arliga produktionsmiljöer så bör man göra på andra sätt, men för mina experiment så duger det.
Ett enkelt test att det fungerar är att inkludera nedanstående i ett htmldokument på sökvägen.
<?php phpinfo(); ?>
Tänk på att filen skall ha filändelsen *.php och inte *.htm. Detta ger en lång lista med information om php på servern.
För att koppla upp mot databasen tidigare så används följande php kod (byt ut IP, user och password):
<?php $databas = pg_connect("host=192.168.0.61 port=5432 dbname=geodata user=klakar password=password"); if (!$databas) {die("Fel i databasanslutningen: " . pg_last_error());}?>
Då händer i och för sig inte så mycket, så länge man inte får upp felmeddelandet, vilket i sig betyder att något är fel.
För att påverka databasen så skickar man SQL-kommandon. Dessa kan man skapa som textsträngar och sedan skicka som pg_query().
$sql = "INSERT INTO geoportal.testpunkter (geom, namn, typ, antal, datum) VALUES (st_geomfromtext('POINT(498235 6391634)', 3006),'test3','test',6,'2017-10-26')" $resultat = pg_query($databas, $sql); if (!$resultat) { die("Fel i SQL" . pg_last_error()); } pg_free_result($resultat); pg_close($databas);
Koden ovan placeras i php blocket från koden tidigare och skriver en punkt till den tabellen i PostGIS databasen.
Om man har skapat en tabell i ett annat koordinatsystem så får man anpassa koden till detta, och självklart måste man även anpassa fältnamn och innehåll till det som gäller lokalt. Notera även hur namngivning av ”schema.tabell” ser ut i sql-satsen.
Vill man läsa från tabellen så skickar man ett SELECT kommando med sql i stället och ”loopar” igenom $resultat med pg_fetch_array().
$sql = "SELECT * from geoportal.testpunkter"; ... while ($row = pg_fetch_array($resultat)) { echo "Namn: " . $row[2] . " | "; echo "Typ: " . $row[3] . " | "; echo "Antal: " . $row[4] . " | "; echo "Datum: " . $row[5] . "<br />"; };
Med detta som startläge blir det inte så svårt att skapa ett formulär på en webbsida som skapar ett anpassat sql-kommando och vid uppdatering skriver resultatet till databasen. Med HTML5 och geolocation kan man använda sig av en telefons inbyggda positionering, så länge användaren godkänner detta.
Varför inte bygga en skräddarsydd inventeringsapp helt med webbskript? Eller kanske en ”felanmälan” i kommunen?
Med lite javascript och exempelvis LeafletJS eller OpenLayers, så kan man även baka in en webbkarta där de insamlade punkterna omedelbart presenteras. Men då behöver man även någon form av WMS tjänst, eller…
Man kanske kan använda sql-kommandot st_AsGeoJSON() och få resultatet i ett format som kan hanteras direkt av javascript och LeafletJS/OpenLayers? Men det får det bli en annan gång.