De meeste GIS software kan met veel verschillende bestandsformaten omgaan, echter het ene bestandsformaat is beter geschikt voor een specifieke taak dan een andere. Zo is GML niet echt geschikt als formaat om (ruimtelijke) queries op te doen, aangezien de performance te wensen overlaat. Echter niet in alle gevallen hoeft performance een probleem te zijn. Mocht dit wel zo zijn dan kan je het GeoPackage bestandsformaat gebruiken. De GML kan eenvoudig omgezet worden met de ogr2ogr
commandline tool (wordt mee geinstalleerd met QGIS):
ogr2ogr -f GPKG data/TOP10NL_45W.gpkg data/TOP10NL_45W.gml
Voor het automatiseren zou ik zelf geen Python gebruiken, aangezien je hetzelfde resultaat kan bereiken met een ogrinfo
oneliner.
Met GeoPackage:
ogrinfo -q "data/TOP10NL_45W.gpkg" -sql "select typeLandgebruik from Terrein where Intersects(GeomFromGPB(geom), MakePoint(155357,405815))"
Met GML:
ogrinfo -dialect sqlite -q "data/TOP10NL_45W.gml" -sql "SELECT typeLandgebruik FROM Terrein WHERE Intersects(GEOMETRY, MakePoint(155357,405815))"
Zie hier het verschil in performance tussen GML en GPKG:
# GeoPackage
ogrinfo -q "data/TOP10NL_45W.gpkg" -sql 0.09s user 0.00s system 99% cpu 0.087 total
# GML
ogrinfo -q -dialect sqlite "data/TOP10NL_45W.gml" -sql 9.37s user 0.10s system 99% cpu 9.472 tota
De oneliner kan je in een Bash functie wrappen, voor wat gebruiksgemak:
function locate_gpkg(){
gpkg_path=$1
layer=$2
point_coord=$3
attribute=$4
ogrinfo -q "$gpkg_path" -sql "select ${attribute} from ${layer} where Intersects(GeomFromGPB(geom), MakePoint(${point_coord}))"
}
# aanroepen met:
locate_gpkg data/TOP10NL_45W.gpkg Terrein 155357,405815 typeLandgebruik
Mocht je wel Python willen gebruiken, dan zou ik aanraden om naar de GeoPandas library te kijken. Hier is een handige tutorial die laat zien hoe hier mee te werken.