Kopiëren van WFS-gegevens naar PostGIS met behulp van ogr2ogr (DEEL 2): ogr2ogr gebruiken in een batchbestand

Soms laat een webservice die je gebruikt in je GIS-toepassing het afweten en dat zorgt er dan voor dat je GIS-toepassing niet goed werkt of bepaalde info niet kan worden weergeven. Om dat op te vangen, kan het handig zijn om een lokale kopie te hebben van de data van die webservice. Voor een WFS webservice kan die data opgeslagen worden in een PostGIS databank. Hiervoor kan er gebruik gemaakt worden van het command-line commando ogr2ogr. Dit is niet zo moeilijk, maar een command-line commando schrikt sommige mensen misschien af. Daarom schreef ik een handleiding hoe je dat aanpakt van installatie tot en met het automatiseren van de importprocedure. Omdat dit zeer uitgebreid is geworden, is deze handleiding opgedeeld in 3 delen. In deel 1 komt de installatie van GDAL en ogr2ogr aan bod. In deel 2 komt het gebruik van ogr2ogr in een Windows batchbestand aan bod en in deel 3 het automatiseren van de importprocedure.

DEEL 2: ogr2ogr gebruiken in een batchbestand

Wat zijn batchbestanden?

Om batchbestanden te verduidelijken, maak ik gebruik van de definitie op Wikipedia: “Een batchbestand is een script: een computerbestand waarin een aantal computercommando’s zijn geplaatst die na elkaar uitgevoerd worden.” We gaan dus verschillende commando’s in het batchbestand zetten die dan door Windows één voor één uitgevoerd worden als we het batchbestand uitvoeren. Die commando’s samen zijn dan de volledige importprocedure van WFS naar PostGIS. In Windows heeft een batchbestand altijd de extensie .bat.

Batchbestanden maken

Een batchbestand is niet meer dan een tekstbestand met daarin één of meerdere commando’s, daarom gebruiken we een texteditor om het batchbestand te maken of te bewerken. Heel goede texteditors zijn Notepad++ en Brackets, maar je kan evengoed Windows Kladblok gebruiken. Belangrijk!! Gebruik zeker nooit Microsoft Word om batchbestanden te maken.

Batchbestanden uitvoeren

Je kan in Windows batchbestanden op verschillende manieren uitvoeren:

  • De eenvoudigste manier is door er in Windows Verkenner op te dubbelklikken. Dit gaat snel en eenvoudig, maar als er iets misloopt bij de uitvoering van het Batchbestand heb je meestal de oorzaak niet gezien, omdat na het uitvoeren de Windows Opdrachtprompt onmiddellijk verdwijnt.
  • Een betere manier is door de Windows Opdrachtprompt eerst te openen, dan naar de map te navigeren waar het Batchbestand staat en dan de naam van het Batchbestand te typen en op enter te duwen. Op deze manier zal het Batchbestand uitgevoerd worden, maar op het einde blijft de Windows Opdrachtprompt openstaan. Hierdoor kan je eventuele foutmeldingen lezen.
  • Bij de derde methode maken we gebruik van Windows Taakplanner (Task Scheduler), maar hierover volgt meer bij het deel “Het automatiseren van de importprocedure“.

Hoe gebruik ik ogr2ogr om gegevens in mijn PostGIS databank te krijgen?

De importprocedure

Dit is waarschijnlijk het belangrijkste deel van deze handleiding, want nu gaan we effectief data overbrengen van een WFS-service naar de PostGIS-databank.

Voor we beginnen, moeten we een aantal vragen beantwoorden:

1. Welke WFS-service en welke kaartlaag we daaruit willen we gaan importeren? Een actuele lijst met WFS-services met data voor België kan je vinden op wfs.michelstuyts.be. Op die website kan je per WFS-service zien welke kaartlagen er beschikbaar zijn. In het voorbeeld hieronder gaan we de haltes van De Lijn importeren.

2. Wat zijn de inloggegevens van je PostGIS-databank? Als je deze niet zelf kent, kan je best eens informeren bij diegene die de PostgreSQL databank geïnstalleerd heeft of beheerd.

– Server: Dit kan een url (bv. www.mijndatabank.be), een ip-adres (bv. 127.0.0.1) of een naam (bv. localhost of mijndatabank) zijn. In het voorbeeld hieronder zullen we localhost gebruiken.

– Gebruikersnaam: Dit moet de naam zijn van een gebruiker die editeerrechten heeft op de PostGIS-databank. Dit is in veel gevallen niet hetzelfde als je gebruikersnaam om aan te melden in Windows. In het voorbeeld hieronder gebruiken we mijngebruikersnaam als gebruikersnaam.

– Wachtwoord: In het voorbeeld hieronder gebruiken we mijnwachtwoord als wachtwoord.

– Database: Elke PostGIS-server kan verschillende databases bevatten. Je moet dus weten welke database we gaan gebruiken. In het voorbeeld hieronder zullen we gisdatabase gebruiken.

3. Dan zijn er nog een aantal instellingen die we moeten vastleggen. Deze kan je meestal zelf kiezen, maar voor deze handleiding gaan we uit van de volgende gegevens:

– Tabelnaam die we in PostGIS gaan aanmaken: postgistabel

– De naam van het schema in PostGIS waar we onze tabel willen opslaan: public

Als je een andere schema wil gebruiken, zorg er dan zeker voor dat je dat op voorhand aanmaakt in PostGIS. Het schema public wordt standaard aangemaakt in PostGIS en bestaat dus zeker al.

– Projectie van de gegevens die we willen overbrengen van WFS naar PostGIS: EPSG:31370 (Lambert72-projectie)

4. We moeten weten waar het ogr2ogr commando staat, dat we willen gebruiken. Zorg ervoor dat minstens GDAL versie 2.0 gebruikt wordt (zie deel 1 bij de info over de installatie). In dit voorbeeld maken we gebruik van ogr2ogr in de map van de 64bit versie van OSGeo4W. Dit is dan meestal C:\OSGeo4W64\bin\ogr2ogr.exe.

Ons Batchbestand zal verschillende commando’s bevatten. Voor de leesbaarheid wordt er hieronder tussen elk commando een witregel gelaten, maar dit is eigenlijk niet nodig. Elk commando staat gewoon op een nieuwe regel. Je kan dus onderstaande tekst in een tekstbestand kopiëren en plakken. Houd er wel rekening mee dat je een aantal waardes die specifiek zijn voor jou PostGIS-server en WFS-server moet aanpassen, maar die gegevens worden hieronder besproken. Eerst krijg je een overzicht van het volledige Batchbestand en daarna wordt elk individueel commando uit het bestand uitgelegd, zodat je goed begrijpt wat er gebeurt.

Het volledige Batchbestand met de naam importeermijngegevens.bat:
@echo off
setlocal ENABLEDELAYEDEXPANSION
set PGPASSWORD=mijnwachtwoord
set schema=public
set table=postgistabel
set schematable=!schema!.!table!
set dllocation="http://geoservices.informatievlaanderen.be/overdrachtdiensten/Haltes/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=Haltes:Halte&srsName=EPSG:31370&bbox=151743,203580,156874,207300"
"C:\OSGeo4W64\bin\ogr2ogr.exe" -lco GEOMETRY_NAME=geom  -overwrite -f "PostgreSQL" -a_srs EPSG:31370  PG:"dbname=gisdatabase user=mijngebruikersnaam host=localhost" -nln !schematable!  "WFS:!dllocation!"
if %ERRORLEVEL%==0 (  
    "C:\OSGeo4W64\bin\psql.exe" -h localhost -U mijngebruikersnaam -p 5432 -d gisdatabase -c "COMMENT ON TABLE !schematable! IS 'Laatste update: %date% %time% (download van !dllocation!)';"  
)
ENDLOCAL
Elk commando uit het Batchbestand verklaard:

@echo off
Dit commando zorgt ervoor dat bij het uitvoeren van het Batchbestand de commando’s niet weergegeven zullen worden in de Opdrachtprompt. Alleen de resultaten van de commando’s worden weergegeven. Dit is een optioneel commando en als je alles goed wil zien gebeuren laat je deze regel beter weg.

setlocal ENABLEDELAYEDEXPANSION
Hiermee zetten we het gebruik van parameters aan in de vorm !mijnparameter!, zodat deze in verdere commando’s gebruikt kunnen worden. In het verdere verloop van de commando’s krijgt bijvoorbeeld de parameter schema eerst de waarde public en daarna kunnen we !schema! gebruiken als we die parameter nodig hebben.

set PGPASSWORD=mijnwachtwoord
We stellen mijnwachtwoord in als wachtwoord dat gebruikt moet worden om in te loggen in de PostGIS-databank.

set schema=public
We stellen public in als het schema in PostGIS dat we willen gebruiken.

set table=postgistabel
Hiermee geven we aan in welke PostGIS-tabel we de gegevens willen opslaan.

set schematable=!schema!.!table!
In PostGIS wordt een tabel aangeduid door de schemanaam en de tabelnaam met daartussen een puntje. Deze PostGIS-tabelnaam wordt hier samengesteld. Het resultaat is dat !schematable! de waarde public.postgistabel bevat.

set
dllocation="http://geoservices.informatievlaanderen.be/overdrachtdiensten/Haltes/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=Haltes:Halte&srsName=EPSG:31370&bbox=151743,203580,156874,207300"

We stellen in welke url er gebruikt moet worden om de gegevens uit de WFS-service te downloaden. De URL bestaat uit verschillende onderdelen.

  • http://geoservices.informatievlaanderen.be/overdrachtdiensten/Haltes/wfs: Dit is de basisurl van de WFS-service. Voor sommige services durft ogr2ogr een probleem te maken van de https-versie van de wfs-service. Dan kan het oplossing zijn om de http-versie aan te spreken. Bij bijvoorbeeld de services van waterinfo.be kan dit voorvallen.
  • service=WFS: Hiermee geven we aan dat het om een WFS-service gaat.
  • version=1.1.0: We geven aan dat we WFS versie 1.1.0 willen downloaden.  Soms moet je versie 1.0.0, 1.1.0 of 1.2.0 ingeven en in veel gevallen kan je dit zelfs weglaten. Wat er nodig is, is volledig afhankelijk van de WFS-server. In het GetCapabilities-document van de WFS-server kan je opzoeken, welke versie je moet opgeven. bv. https://geoservices.informatievlaanderen.be/overdrachtdiensten/Haltes/wfs?REQUEST=GetCapabilities&SERVICE=WFS
  • request=GetFeature: Hiermee zeggen we aan de WFS-service dat we gegevens (features) willen downloaden.
  • typeName=Haltes:Halte: Hiermee geven we aan dat we de kaartlaag Haltes:Halte uit de WFS-service willen downloaden. De naam van een WFS-kaartlaag bestaat altijd uit twee woorden met daartussen een dubbelpunt.
  • srsName=EPSG:31370: Hiermee geven we aan dat we de gegevens in Lambert72-projectie willen downloaden.
  • bbox=151743,203580,156874,207300: Dit is een optionele parameter, want hiermee geven we aan binnen welke rechthoek op onze kaart we de gegevens willen downloaden. De meeste WFS-services hebben een maximumlimiet van hoeveel kaartelementen er tegelijk kunnen gedownload worden (bij Informatie Vlaanderen is dat meestal 10.000 kaartelementen). Als bbox niet opgegeven wordt, zal de WFS de eerste 10.000 gegevens uit de databank aanleveren. Met behulp van bbox beperken we het gebied dat we willen downloaden, zodat we niet tegen die limiet aanlopen en juist die gegevens krijgen die we nodig hebben. Als het een kaartlaag is met weinig gegevens, kan deze parameter weggelaten worden. De coördinaten in deze parameter maken gebruik van de eerder opgegeven projectie (in dit geval Lambert72) en bestaan uit de maximale en minimale X- en Y-waarden van de bbox (boundig box).

"C:\OSGeo4W64\bin\ogr2ogr.exe" -lco GEOMETRY_NAME=geom
-overwrite -f "PostgreSQL" -a_srs EPSG:31370 PG:"dbname=gisdatabase
user=mijngebruikersnaam" -nln !schematable! "WFS:!dllocation!"

Hiermee voeren we effectief het commando ogr2ogr uit met de benodigde parameters. Het commando bestaat uit verschillende onderdelen:

  • “C:\OSGeo4W64\bin\ogr2ogr.exe”: Zoals bij de installatie al gezegd, kunnen er verschillende versies van ogr2ogr geïnstalleerd zijn en hebben we minstens versie 2.0 nodig. Daarom is het belangrijk om aan te geven waar de ogr2ogr versie staat die we willen gebruiken. Dit deel van het commando staat tussen aanhalingstekens, omdat het spaties kan bevatten.
  • -lco GEOMETRY_NAME=geom: Bij de aanmaak van de PostGIS tabel wordt er aan die tabel ook een veld toegevoegd waarin zich de geometrie van de gegevens zich bevinden. Met dit deel van het comando bepaal je de naam van dat geometrieveld. Dit is een optionele instelling, want als dit wordt weggelaten, zal standaard geometry als veldnaam gebruikt worden.
  • -overwrite: Als er in PostGIS al een tabel bestaat met dezelfde naam, zal met deze optie die tabel overschreven worden. Als deze optie wordt weggelaten en de tabelnaam bestaat toch al, zal ogr2ogr een foutmelding geven en niets importeren.
  • -f “PostgreSQL”: We geven aan dat het doel een PostGreSQL databank is.
  • -a_srs EPSG:31370: De projectie van de tabel in PostGreSQL die we gaan maken zal in Lambert 72 projectie staan (EPSG:31370)
  • PG:”dbname=gisdatabase user=mijngebruikersnaam host=localhost”: Hiermee stellen we de databank naam in als gisdatabase, de gebruikersnaam in PostGreSQL als mijngebruikersnaam en de server waarop PostGreSQL draait is localhost.
  • -nln !schematable!: Hiermee stellen we de naam in van de tabel in PostGreSQL die we gaan maken in met behulp met de variabele die we eerder in !schematable! hebben gezet.
  • “WFS:!dllocation!”: Hiermee stellen we de url van de WFS in op basis van de variabele die we eerder in !dllocation! hebben gezet. Deze locatie wordt vooraf gegaan door WFS: en staat tussen aanhalingstekens, omdat er spaties in kunnen voorkomen.

if %ERRORLEVEL%==0 (

"C:\OSGeo4W64\bin\psql.exe" -h localhost -U
mijngebruikersnaam -p 5432 -d gisdatabase -c "COMMENT ON TABLE
!schematable! IS 'Laatste update: %date% %time% (download van
!dllocation!)';"

)

Deze commando’s zijn optioneel, maar wel heel nuttig. Hiermee plaatsen we in de Commentaar van de PostGIS tabel die we maken de datum en de bron van de data die er in zit. Als dan de importprocedure geautomatiseerd wordt en er loopt iets mis bij die import, kan je opvolgen wanneer de laatste keer de import wel gelukt is.

  • if %ERRORLEVEL%==0 ( ): Dit commando controleert of het vorige commando succesvol is afgerond. Als dat zo is zal het commando tussen de haakjes uitgevoerd worden.
  • psql -h localhost -U mijngebruikersnaam -p 5432 -d gisdatabase -c “COMMENT ON TABLE !schematable! IS ‘Laatste update: %date% %time% (download van !dllocation!): Dit commando plaatst een tekst met de datum, tijd en bron van de meest recente update in de commentaar van de tabel. Die commentaar kan bijvoorbeeld via pgAdmin of via QGIS bekeken worden.

ENDLOCAL
Hiermee sluiten we het eerdere commando ENABLEDELAYEDEXPANSION af.

Deze handleiding gaat verder in DEEL 3: het automatiseren van de importprocedure.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.