Menu
  • Hem
  • Dokument
  • Om Mig
Geosupportsystem

Webbformulär för PostGIS

Posted on 2017-10-27

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.
Skärmbild från 2017-10-21 15-30-18.png
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.
Skärmbild från 2017-10-21 15-34-15.png
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.
 

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Translate with Google

GBR In English
GER Auf Deutch
FRA En Français
ESP En Español
Swedish is a hard language for a machine to translate. Nuance and detail will likely be lost.
     

Bok om QGIS på Svenska

Bok

Beställ Boken/E-bok genom att klicka på bilden (även förhandsgranskning).

Senaste kommentarer

  • klakar om Laga hål i höjddata
  • Per Ekström om Laga hål i höjddata
  • Sur om Mera verktyg i QGIS
  • Anton om ”Mobile *.Geodatabase”
  • Fredrik Ekberg om Ingen är oskyldig

Arkiv

Prenumerera på Geosupportsystem

Skriv in namn och epost för att prenumerera på meddelanden från denna blogg.
Loading

geosupport

TrueNAS bygge. @fractaldesignna Define R5 är rikt TrueNAS bygge. @fractaldesignna Define R5 är riktigt trevlig att bygga i, och den sväljer väldigt mycket disk. Här skall virtualiseras både PostGis, WebODM och Geonode så småningom.
Då har jag lite att bläddra i ett tag framöver. Då har jag lite att bläddra i ett tag framöver.
YouTube video to frames. Processed in OpenDroneMap YouTube video to frames. Processed in OpenDroneMap and visualized in QGIS 3.17.
Ladda mer...

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • WordPress.org
©2021 Geosupportsystem | WordPress Theme by Superbthemes.com