Etikettarkiv | qGIS Server

Geosupportsystem IT-plattform – Installationsguide del 4

I denna avslutande återblick på hur man kan använda öppen källkod för att bygga en IT-lösning för geosupport så tänkte jag komplettera OpenGeo Suite installationen med QGIS Server.

Planen var att på samma server som tidigare lägga till nödvändiga komponenter för att enkelt (-ish) skapa snyggare kartor än vad som är möjligt med Boundless lösningar. Detta är dock lite problematiskt eftersom OpenGeo Suite använder en version av GDAL, skapad av Boundless, som inte är kompatibel med den vanliga GDAL som används av QGIS. Lösningen är att installera QGIS Server på en egen server i stället. Däremot så skall man kunna använda GeoServer, GeoExplorer, QGIS plug-in med mera för att hantera och skapa webbtjänster via den tidigare servern.

Läs mer…

Python i QGIS Server

Strax före jul bakades stöd för Python in i utvecklingsversionen av QGIS Server och finns sedan 2.8 med även i den stabila versionen (har inte testat själv).

Det börjar nu märkas att funktionen används och vi kommer nog att få se mer utveckling av plug-in för QGIS Server i framtiden.

Vad är då QGIS Server Python Plug-In?

Jag tittar igenom lite filmer och presentationsunderlag och gör så gott jag kan en kort sammanställning:

Skärmbild från 2015-05-23 11:07:15Med funktionen skulle man kunna tänka sig att man skapar skräddarsydda autentiseringsfunktioner, eller att man modifierar OGC svar, eller helt enkelt skapar nya.

Man kan lyssna på ”requests” och om dessa inte är standard (”404”) så kan man låta ett insticksprogram analysera frågan och ge ett passande svar. Detta gör det möjligt att ta hand om sådant som inte är standardiserade ”requests”.

För att modifiera standardiserade ”requests” så krävs det mera kod, men i princip allt är möjligt att ändra.

Skärmbild från 2015-05-23 11:20:26Ett enkelt exempel (hämtat från http://www.itopen.it/qgis-server-getfeatureinfo-with-style/) visar hur ett ”filter” skapats i Python.

Filtret lyssnar efterom det är en ”Request” för WMS/GETFEATUREINFO i HTML-format.

Om så är fallet så byts ”BODY” taggen ut och en ”STYLE” tagg läggs till med instruktionern för hur svaret skall formateras. Snyggt och väldigt enkelt! Inte så svårt att anpassa och kanske lägga till en logotyp eller kontaktuppgifter…

Skärmbild från 2015-05-23 11:33:01

Plug-In skripten bygger i princip på tre ”hooks” (bilden ovan). Ett som görs när förfrågan är mottagen, en när svaret är klart för sändning och ett när svaret skall sändas (det finns en skillnad mellan de två senare, men jag utvecklar inte det här).

Vilken kod du väljer att inkludera i ditt skript är helt upp till dig, så länge du använder minst en av dessa ”hooks”. Det går att använda vilken Python-kod som helst och det går att använda alla QGIS Python bindningar om man så vill.

Vi får väl se när/om jag får tid att testa detta vidare, men om du vill gå vidare själv så finns en instruktion för hur du sätter upp en QGIS Server med Python Plug-In på http://www.itopen.it/qgis-server-python-plugins-ubuntu-setup/

Egen Server för Geodatatjänster

Skärmbild från 2014-01-26 12:48:47

Då så, nu är boken baserad på den tidigare serien av inlägg klar och finns för nedladdning här:

Egen Server för Geodatatjänster

Jämfört med serien med inlägg så innehåller boken lite djupare information och en hel del som det inte fanns plats för på bloggen. Förhoppningen är att den som skall sätta upp en geodatatjänst, om än det är för eget nöjes skull eller i arbetet, kan använda boken för att steg för steg få fram en tjänst som är användbar för användare på alla nivåer från proffs till ”slentriansurfare”.

Jag har även haft som ambition att få till en ePub-version, som egentligen bara strulat och inte ser särskilt bra ut, men här är den också (via en fildelningssida):

Egen Server för Geodatatjänster (ePub)

Det blir säkert fler böcker så småningom, men för ett tag framöver så får ni hålla till godo med vanliga någorlunda regelbundna inlägg på bloggen.

Egen server för geodatatjänster – Del 4

I detta inlägg så kommer det att handla om grundläggande metoder för hur man kan skapa nya data och tjänster. Se detta som exempel och utarbeta en egen metod som passar dig och din verksamhet.

Metoder för publicering

Principen för geodatahanteringen blir att ”kärnanvändare” kopplar upp sig antingen direkt till PostGis, eller för den delen via GeoServer och WMS/WFS.

Kartor, eller lager som skall publiceras som tjänst, hanteras i ett eller flera QGIS-projekt som sparas på servern. Men dessa URL-er används inte utåt, utan i sin tur av GeoServer.

Lagerna, eller WMS-tjänsterna, från QGIS Server läggs till som egna ”store” i GeoServer och kan sedan användas i GeoExplorer för att enkelt skapa webbkartor.

PostGIS

I QGIS använder man OpenGeo Explorer för att koppla upp sig mot databasen på servern.

bok9

Markera ”public” i trädet under serveranslutningen och välj att skapa en ny tabell. Det går att göra i fönstret undertill, via knappen över trädstrukturen eller genom att högerklicka på ”public”.

bok10

I formuläret anger man ett namn för tabellen, ett antal attribut med namn och typ, samt information om geometrin. Om man inte lägger till en geometrikolumn så blir det en vanlig tabell utan geometri. Det går att välja flera typer av geometrier, inte minst punkter, linjer och polygoner. Man kan bestämma om positionerna skall vara i 2, 3 eller 4 (?) dimensioner. Det är bra att välja ett SRID så att man slipper gissa hela tiden, och exempelvis 4326 (WGS84) passar bra globalt, medan 3006 (SWEREF99TM) passar bra i Sverige. Något att tänka på vid valet är att en del analyser där avstånd ingår, utgår från lagrets referenssytem. Välj därför ett projicerat system, som SWEREF99TM, om beräkningar i meter skall göras. Skall dessutom kartorna publiceras i SWEREF99TM så bör man använda detta även för att lagra data.

QGIS

Lägg till de nya tabellerna genom att helt enkelt dra och släppa dessa i QGIS kartfönster. Skapa några punkter och använd ”stil” och ”etikett” för att skapa något lämpligt. Upprepa med en annan typ av geometri så att det finns minst två olika lager att experimentera med.

bok11

Spara projektet på servern i qgis-katalogen. Det kan hända att du behöver köra QGIS som ”root” för att det skall gå att spara på servern. Detta går att uppnå genom att starta QGIS ifrån terminalen med kommandot sudo qgis.

Starta ett nytt tomt projekt i QGIS och koppla upp mot QGIS Server.

bok12

URL:en http://192.168.1.42/cgi-bin/qgis_mapserv.fcgi?VERSION=1.3.0&map=/qgis/filnamn.qgs, där IP och filnamn anpassas till lokala förutsättningar, används för att peka ut OGC-tjänster från QGIS Server.

Prova att lägga till hela tjänsten (qgistest) för sig och lagerna var för sig (testdata, testdata_yta) och jämför skillnaderna. Vill du ha lager med transparent bakgrund så får du välja PNG som format.

bok13

Lägg märke till att symboler och texter för punktlager blir klippta där dessa annars skulle ritats ut utanför den geografiska ”box” som omsluter alla data exakt.

Öppna qgis-projektet från servern igen, zooma ut så att alla data syns och har en ordentlig marginal till kanterna. Gå sedan in i projektegenskaperna.

bok14

Under OWS så markeras ”Utannonsera utsträckning” och därefter kan man klicka på knappen för att använda den utsträckning som finns i QGIS. Det går även att ange manuellt i fälten.

Att tänka på är att om man skapar nya data utanför denna box, så kommer dessa inte att publiceras via QGIS Server om man inte går in och redigerar om här.

Ett alternativ som i många fall är bättre, är att lägga till två fiktiva geografiska objekt i exempelvis nedre vänstra och övre högra maximala utsträckningen. Då kan man strunta i att ange utsträckningen.

Spara projektet igen. Skapa ett nytt tomt projekt och lägg åter igen till WMS lagerna på samma sätt som ovan.

bok15

På det sätt som beskrivits ovan så går det att laborera lite med inställningar och liknande för att få till det utseende på lagren man önskar.

Nu går det att nöja sig här, då man har en fungerande WMS tjänst via QGIS Server, men i nästa inlägg tar vi det ett steg längre…

Egen server för geodatatjänster – Del 3

I detta inlägg så börjar vi med ett klientprogram, nämligen QGIS. QGIS används för att testa anslutningar och för att redigera data i tabeller i databasen. Med rätt insticksprogram så går det enkelt att skapa nya tabeller i PostGIS också. Dessutom så är QGIS klienten en viktig komponent för att skapa OGC-tjänster via QGIS Server, som kommer i slutet på inägget.

QGIS

Jag går inte så djupt in på QGIS i denna guide, men jag rekommenderar att OpenGeo Explorer installeras som insticksprogram.

bok8

För att det skall gå att installera så måste en ny källa läggas till i inställningarna.

http://qgis.boundlessgeo.com/plugins.xml

I tillägget går det att direkt ansluta till PostGIS databasen och skapa nya tabeller för alla typer av vektordata. Detta är ett bättre sätt än att importera shapefiler, även om det också fungerar bra. Fördelen är att det går att skapa tydligare fältnamn och det går att ha fler fälttyper i tabellerna.

För att publicera data till GeoServer, så går det också att göra via insticksprogrammet, men det blir inte riktigt bra om man vill få med symboliken från QGIS.

Då är det bättre att sätta upp en OGC server till på servern. Nämligen QGIS-Server.

QGIS Server

QGIS Server bygger på funktionaliteten i QGIS och gör det möjligt att publicera OGC-tjänster som WMS med samma utseende som i QGIS. Man slipper då att strula med SLD-filer och konfigurering i GeoServer.

Det går att installera QGIS Server på en klient där QGIS finns, men det går även att installera nödvändiga program på en server utan klientprogrammet.

gpg --keyserver keyserver.ubuntu.com --recv 47765B75
gpg --export --armor 47765B75 | apt-key add -
echo ”deb http://qgis.org/debian precise main” > /etc/apt/sources.list.d/qgis.list
echo ”deb-src http://qgis.org/debian precise main” >> /etc/apt/sources.list.d/qgis.list
apt-get install grass python-software-properties
add-apt-repository ppa:ubuntugis/ubuntugis-unstable
apt-get update
apt-get install apache2 qgis-mapserver libapache2-mod-fcgid
service apache2 restart

Kommandona ovan installerar även Grass, som ger lite extra funktionalitet. För att testa installationen så kan man skriva in nedanstående adress i en webbläsare på nätverket:

http://192.168.1.42/cgi-bin/qgis_mapserv.fcgi?VERSION=1.3.0&REQUEST=GetCapabilities

Byt ut IP adressen mot serverns.

För att enklare utnyttja QGIS Server så behövs ett smidigt sätt att publicera tjänster. Det enklaste jag kommit på är via en delad katalog på servern.

För detta krävs Samba och ytterligare lite inställninar.

apt-get install samba samba-common python-glade2 system-config-samba
mkdir /qgis
chmod 777 /qgis/
mkdir /geodata
chmod 777 /geodata/

Katalogerna ovan skapas med alla rättigheter för att göra plats för QGIS-projektfiler och för data som inte skall lagras i PostGIS.

För att få igång utdelningen så måste filen /etc/samba/smb.conf redigeras.

#============= Globala Inställningar =========== 
[global] 
workgroup = WORKGROUP 
server string = Samba Server %v 
netbios name = geoserver 
security = user 
unix password sync = yes 
map to guest = bad user 
dns proxy = no 
#============ Delade Kataloger =========== 
[qgis] 
path = /qgis 
browsable = yes 
writable = yes 
guest ok = yes 
read only = no 
[geodata] 
path = /geodata 
browsable = yes 
writable = yes 
guest ok = yes 
read only = no

Starta om Samba servern för att läsa in de nya inställningarna.

service smbd restart

Nu går det att ladda upp filer till servern, som kan användas direkt i GeoServer, eller via GeoServer till QGIS, och sedan till GeoServer igen… mer om det i kommande inlägg.

I QGIS katalogen kan man ladda upp qgs-filer och anropa dessa via QGIS Server. Adressen till QGIS Servers OGC tjänster är:

http://192.168.1.42/cgi-bin/qgis_mapserv.fcgi?VERSION=1.3.0&map=/qgis/filnamn.qgs

Byt ut IP adressen ovan till den aktuella och redigera filnamnet till önskad projektfil. Så länge sökvägarna till data är tillgängliga även från servern så kommer allt att fungera perfekt.

Prova att skapa lite nya PostGIS data och lägg till dessa i ett QGIS projekt, som sparas i den utdelade qgis-katalogen på servern.

För att testa WMS tjänsten så lägg till en WMS server i ett nytt QGIS-projekt där URL till tjänsten är den adress som står angiven ovan. Efter anslutning så kommer dels hela projektet att finnas som tjänst, men även varje individuellt lager. Lägg till och prova.

Ett system för geografisk information

Detta är en uppdatering av ett tidigare inlägg där jag försökte skapa ett ”komplett” system för att hantera geografisk information och kartor för GIS och webb.

Den här gången så går jag inte in på detaljer när det gäller installationen utan använder mitt skript för installation på Ubuntu Server 12.04 LTS, så vill du testa så är det där du skall börja. Jag installerar en virtuell server med Oracle VM VirtualBox på en Windows 7 klient (64-bit), men det går precis lika bra att installera på en fysisk dator om så önskas.

Jag har valt Windows på klienten för att det blir lite enklare att hantera filer i nätverk med QGIS för användarna, och det är ju klart vanligast med Windows som klient i de flesta nätverk.

När servern är grundinstallerad (defaultinställningar för det mesta och eget val för datornamn och användare) så kör jag mitt skript:

sudo su
wget http://geosupport.kvarnarp.eksjo.com/files/geosupport.sh
sh opengeo.sh

När skriptet kör så väljer jag defaultvärden för OpenGeo Suite samt att installera PostGIS. Jag lägger även till Drupal (CMS) och QGIS-Server, men inte Nuxeo (DMS).

Skriv ner information om datornamn, IP-adress, extra instruktioner och liknande medan skriptet kör. När det står viktig information på skärmen så pausar skriptet och väntar på att du skall göra något så var inte orolig för att texten rullar på för fort. Det som måste fixas är lösenord för postgres-användaren och din användare för Samba fildelning i nätverket. Instruktioner för hur detta går till får man i skriptet. Det sista som jag gör efter installationen är att starta om servern (för säkerhets skull):

reboot

Konfigurera Drupal

Använd en webbläsare och skriv in IP-adressen till servern. Då skall du få upp ett webbgränssnitt för att konfigurera klart din webbserver.

blogg2

Det är nu du skall använda det lösenord som du skapat för postgres användaren i PostgreSQL (databas: drupal, användare: postgres, lösenord: *******). När detta är klart så skall du bara ändra tillbaka rättigheterna till konfigurationsfilerna på servern:

chmod a-w /var/www/sites/default/
chmod a-w /var/www/sites/default/settings.php

Skapa karta (Steg 1)

I QGIS på klienten så skapar jag min karta som jag vill att den skall se ut. Data måste vara tillgängligt från servern så i mitt exempel använder jag PostGis data från Medford exemplet som följer med GeoServer. Projektfilen från QGIS sparar jag på den delade resursen ”QGIS” på servern.

Nu går det att komma åt kartan via WMS på adressen: http://Server-IP/cgi-bin/qgis_mapserv.fcgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities. Om du skriver in adressen i en webbläsare så skall du få upp dit QGIS-projekt som ett lager i XML-texten. Om detta fungerar så är nu ”tjänsten” publicerad.

In i systemet (Steg 2)

Det går redan nu att använda den skapade tjänsten med OpenLayers, men då blir det till att skriva lite kod själv. Jag går i stället igenom det ”lata” alternativet.

I Geoserver (http://Server-IP:8080/geoserver) så skapas ett nytt workspace, jag döper mitt till ”Geosupport”. Därefter läggs en ny ”Store” till som pekar på QGIS-Server (WMS adressen från steg 1). Det finns flera lager i tjänsten (ett för varje lager i QGIS och ett för hela projektet), men jag väljer det för hela projektet att publisera. På så sätt så kan jag faktiskt lägga till mer data i fler lager och få dessa publiserade i tjänsten utan att behöva upprepa detta och nästa steg. Det räcker att projektfilen från steg 1 ovan redigeras.

Skapa webbkartan (Steg 3)

I GeoExplorer (http://Server-IP:8080/geoexplorer) så skapar jag en karta med de bakgrundskartor jag vill ha med, samt lägger till den i steg 2 skapade ”Geosupport” tjänsten från den lokala Geoservern. Sedan är det bara att Exportera kartan och kopiera den rad med HTML kod som visas.

blogg3

Koden klistras sedan in i en ny sida i Drupal och sim-sala-bim så har man sin karta på hemsidan.

blogg4

Problem på vägen

Det är många tjänster som körs samtidigt så det är mycket som kan gå fel. En dedikerad server är nog bättre än en virtuell.

WMS tjänsten på Geoserver cachar lagerna, vilket i sig kan ta lite tid, men som även kan göra att uppdateringar i QGIS projektet kan ta lite tid innan de slår igenom, men det är inga större problem.

Projekt skapade med QGIS-1.8 fungerar inte… Men om man använder 1.9 (utvecklingsversionen) så fungerar det bra.

Enkel Webbklient till enkel WMS

I förra inlägget så visade jag hur du kan skapa en lättadministrerad WMS tjänst baserad på QGIS och QGIS-Server, installerad på Xubuntu.

Skärmbild från 2013-04-07 18:47:01

Data skapad i QGIS och sparad som test.qgs i katalogen /usr/lib/cgi-bin/qgis/

I detta inlägg lägger jag till en webbklient som gör WMS tjänsten direkt tillgänglig via en webbläsare på nätverket.

Börja med att ladda hem Leaflet till webbserverns rootkatalog genom att öppna ett terminalfönster och skriva in följande:

wget https://github.com/Leaflet/Leaflet/zipball/v0.5.1
unzip v0.5.1
sudo cp -r Leaflet-Leaflet-0deed73/dist/ /var/www/leaflet

Som i förra inlägget så ändrar jag rättigheter och skapar en symbolisk länk i hemkatalogen till webbserverns root-katalog:

sudo chmod 777 /var/www
sudo ln -s /var/www

Sedan går det att använda vilken textredigerare som helst (eller motsvarande), och skapa websidan som skall visa kartan i webbroten. Jag skapar en fil jag döper till test.htm som bland annat innehåller denna text:

<html>
<head>
<link rel=”stylesheet” type=”text/css” href=”leaflet/leaflet.css” />
<script type=”text/javascript” src=”leaflet/leaflet.js”></script>
</head>
<body>
<H1>QGIS Server WMS</H1>
<div id=”map” style=”width:1200px; height:800px;”></div>
<script type=”text/javascript”>
var map;
var qgis=new L.TileLayer.WMS(”http://IP-adress/cgi-bin/qgis/qgis_mapserv.fcgi&#8221;, {
layers: ‘test’,
format: ‘image/png’
});
map=new L.Map(‘map’, {
center: new L.LatLng(0,0),
zoom: 7,
layers: [qgis],
zoomControl: true
});
</script>
</body>
</html>

WMS lagret som används är det som skapades i förra inlägget även det kallat ”test” och IP-adressen är serverns IP adress och den tar du reda på med terminalkommandot ifconfig.

OBS: Om du använder ”copy” ”paste” med texten ovan så måste du nog manuellt ersätta alla ‘ och ” tecken, då dessa har en annan teckenkod än vad de borde ha i html-kod.

När du skapar dina egna data så får du ändra siffrorna i LatLng(0, 0), som anger centrumkoordinaten för webbkartan.

Sedan är det bara att öppna sidan i valfri webbläsare, antingen lokalt eller via nätverket.

Skärmbild från 2013-04-07 18:48:52

Den nyss skapade hemsidan med karta från QGIS-Server WMS.

Det enda du behöver göra för att ändra kartan är att redigera QGIS projektet och spara det på nytt.

Bygg på HTML koden med mer text och annat innehåll precis som du vill. Läs även på lite om vad som går att göra med Leaflet för att styra exempelvis olika lager och extra symboler, pop-up fönster med mera.

Lycka till!

I nästa inlägg så visar jag hur du skapar en VNC server på datorn så att det går att fjärransluta till den från en annan dator på nätverket och därmed sköta administrationen från en annan plats än serverrummet.