Lagen laden

Laten we enkele lagen met gegevens openen. QGIS herkent vector- en rasterlagen. Aanvullend zijn anagepaste typen lagen beschikbaar, maar die zullen we hier niet bespreken.

Vectorlagen

Specificeer de identificatie van de gegevensbron van de laag, de naam voor de laag en de naam van de provider om een vectorlaag te laden:

layer = QgsVectorLayer(data_source, layer_name, provider_name)
if not layer.isValid():
  print "Layer failed to load!"

De identificatie van de gegevensbron van de laag is een string en is specifiek voor elke vector gegevensprovider. De naam van de laag wordt gebruikt in de widget Lagenlijst. Het is belangrijk om te controleren of de laag met succes is geladen. Als dat niet zo was wordt een ongeldige instance van de laag teruggegeven.

De snelste manier om een vectorlaag te openen en weer te geven in QGIS is de functie addVectorLayer van QgisInterface:

layer = iface.addVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
if not layer:
  print "Layer failed to load!"

Dit maakt een nieuwe laag en voegt die in één stap toe aan het register van de kaartlagen (waardoor het verschijnt in de lagenlijst). De functie geeft de instance van de laag terug of None als de laag niet kon worden geladen.

De volgende lijst geeft weer hoe toegang wordt verkregen tot verscheidene gegevensbronnen met behulp van vector gegevensproviders:

  • bibliotheek OGR (shapefiles en vele andere bestandsindelingen) — gegevensbron is het pad naar het bestand

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
    
  • database PostGIS — gegevensbron is een string met alle informatie die nodig is om ene verbinding te maken naar de database van PostgreSQL. De klasse QgsDataSourceURI kan deze string voor u genereren. Onthoud dat QGIS moet worden gecompileerd met ondersteuning voor Postgres, anders is deze provider niet beschikbaar.

    uri = QgsDataSourceURI()
    # set host name, port, database name, username and password
    uri.setConnection("localhost", "5432", "dbname", "johny", "xxx")
    # set database schema, table name, geometry column and optionally
    # subset (WHERE clause)
    uri.setDataSource("public", "roads", "the_geom", "cityid = 2643")
    
    vlayer = QgsVectorLayer(uri.uri(), "layer_name_you_like", "postgres")
    
  • CSV of andere gescheiden tekstbestanden — om een bestand te openen met als scheidingsteken een puntkomma, met een veld “x” voor de X-coördinaat en veld “y” met de Y-coördinaat zou u iets zoals dit moeten gebruiken

    uri = "/some/path/file.csv?delimiter=%s&xField=%s&yField=%s" % (";", "x", "y")
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "delimitedtext")
    

    Opmerking: vanaf QGIS versie 1.7 is de string voor de provider gestructureerd als een URL, dus moet het pad worden voorafgegaan door file://. Ook staat het als WKT (well known text) opgemaakte geometrieën toe als een alternatief voor “X”- en “Y”-velden, en staat toe dat het coördinaten referentiesysteem wordt gespecificeerd. Bijvoorbeeld

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" % (";", "shape")
    
  • GPX-bestanden — de “gpx”-gegevensprovider leest tracks, routes en waypoints uit GPX-bestanden. Het type (track/route/waypoint) moet worden gespecificeerd als deel van de url om een bestand te openen

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • database SpatiaLite — ondersteund vanaf QGIS v1.1. Soortgelijk aan databases van PostGIS, QgsDataSourceURI kan worden gebruikt voor het genereren van de identificatie van de gegevensbron

    uri = QgsDataSourceURI()
    uri.setDatabase('/home/martin/test-2.3.sqlite')
    schema = ''
    table = 'Towns'
    geom_column = 'Geometry'
    uri.setDataSource(schema, table, geom_column)
    
    display_name = 'Towns'
    vlayer = QgsVectorLayer(uri.uri(), display_name, 'spatialite')
    
  • MySQL op WKB gebaseerde geometrieën, via OGR — gegevensbron is de string voor de verbinding naar de tabel

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • WFS-verbinding:. de verbinding wordt gedefinieerd met een URI en het gebruiken van de provider WFS

    uri = "http://localhost:8080/geoserver/wfs?srsname=EPSG:23030&typename=union&version=1.0.0&request=GetFeature&service=WFS",
    vlayer = QgsVectorLayer("my_wfs_layer", "WFS")
    

    De uri kan worden gemaakt met behulp van de standaard bibliotheek urllib.

    params = {
        'service': 'WFS',
        'version': '1.0.0',
        'request': 'GetFeature',
        'typename': 'union',
        'srsname': "EPSG:23030"
    }
    uri = 'http://localhost:8080/geoserver/wfs?' + urllib.unquote(urllib.urlencode(params))
    

Rasterlagen

Voor toegang tot rasterbestanden wordt de bibliotheek GDAL gebruikt. Het ondersteunt een breed scala aan bestandsindelingen. In het geval u problemen hebt met et openen van enkele bestanden, controleer dan of uw GDAL ondersteuning heeft voor die bepaalde indeling (niet alle indelingen zijn standaard beschikbaar). Specificeer zijn bestandsnaam en basisnaam om een raster uit een bestand te laden

fileName = "/path/to/raster/file.tif"
fileInfo = QFileInfo(fileName)
baseName = fileInfo.baseName()
rlayer = QgsRasterLayer(fileName, baseName)
if not rlayer.isValid():
  print "Layer failed to load!"

Soortgelijk aan vectorlagen kunnen rasterlagen worden geladen met behulp van de functie addRasterLayer van QgisInterface:

iface.addRasterLayer("/path/to/raster/file.tif", "layer_name_you_like")

Dit maakt een nieuwe laag en voegt die in één stap toe aan het register van de kaartlagen (waardoor het verschijnt in de lagenlijst).

Rasterlagen kunnen ook worden gemaakt vanuit een service voor WCS.

layer_name = 'modis'
uri = QgsDataSourceURI()
uri.setParam('url', 'http://demo.mapserver.org/cgi-bin/wcs')
uri.setParam("identifier", layer_name)
rlayer = QgsRasterLayer(str(uri.encodedUri()), 'my_wcs_layer', 'wcs')

gedetailleerde instellingen voor de URI kunnen worden gevonden in provider documentation

Als alternatief kunt u een rasterlaag laden vanaf een server voor WMS. Momenteel is het echter niet mogelijk om toegang te krijgen tot het antwoord van GetCapabilities van de API — u moet weten welke lagen u wilt

urlWithParams = 'url=http://wms.jpl.nasa.gov/wms.cgi&layers=global_mosaic&styles=pseudo&format=image/jpeg&crs=EPSG:4326'
rlayer = QgsRasterLayer(urlWithParams, 'some layer name', 'wms')
if not rlayer.isValid():
  print "Layer failed to load!"

Register van kaartlagen

Als u de geopende lagen wilt gebruiken voor renderen, vergeet dan niet om ze toe te voegen aan het register van kaartlagen. Het register van kaartlagen wordt eigenaar van de lagen en er kan later toegang toe worden verkregen vanuit elk deel van de toepassing door middel van hun unieke ID. Als de laag wordt verwijderd uit het register van de kaartlagen, wordt hij ook verwijderd.

Een kaartlaag aan het register toevoegen

QgsMapLayerRegistry.instance().addMapLayer(layer)

Lagen worden bij het afsluiten automatisch vernietigd, als u echter de laag expliciet wilt verwijderen, gebruik dan

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)

Voor een lijst van geladen lagen en laag-ID’s, gebruik

QgsMapLayerRegistry.instance().mapLayers()
TODO:

Meer over het register van kaartlagen?