Chargement de couches

Ouvrons donc quelques couches de données. QGIS reconnaît les couches vectorielles et raster. En plus, des types de couches personnalisés sont disponibles mais nous ne les aborderons pas ici.

Couches vectorielles

Pour charger une couche vectorielle, spécifiez l’identifiant de la source de données de la couche, un nom pour la couche et le nom du fournisseur:

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

L’identifiant de source de données est une chaîne de texte, spécifique à chaque type de fournisseur de données vectorielles. Le nom de la couche est utilisée dans le widget liste de couches. Il est important de vérifier si la couche a été chargée ou pas. Si ce n’était pas le cas, une instance de couche non valide est retournée.

La liste suivante montre comment accéder à différentes sources de données provenant de différents fournisseurs de données vectorielles:

  • La bibliothèque OGR (shapefiles et beaucoup d’autres formats) — la source de données est le chemin du fichier:

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", \
      "layer_name_you_like", "ogr")
    
  • PostGIS database — la source de donnée est une chaîne de texte contenant toutes les informations nécessaires à la création d’une connection à la base de données PostgreSQL. La classe QgsDataSourceURI peut générer ce texte pour vous. Notez que QGIS doit être compilé avec le support Postgres afin que ce fournisseur soit disponible.:

    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 optionaly
    # subset (WHERE clause)
    uri.setDataSource("public", "roads", "the_geom", "cityid = 2643")
    
    vlayer = QgsVectorLayer(uri.uri(), "layer_name_you_like", "postgres")
    
  • CSV ou autres fichiers de texte délimité — pour ouvrir un fichier délimité par le point-virgule, ayant des champs “x” et “y” respectivement pour coordonnées x et y, vous devriez utiliser quelque chose comme ceci:

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

    Note: Depusi QGIS 1.7, le fournisseur est structuré comme une URL. Le chemin doit donc être précédé de file://. De même, il autorise les descriptions de géométries au format WKT (well known text) en alternative aux champs “x” et “y”, et permet de spécifier le système de coordonnées de référence. Par exemple:

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" \
      % (";", "shape")
    
  • GPX files — the “gpx” data provider reads tracks, routes and waypoints from gpx files. To open a file, the type (track/route/waypoint) needs to be specified as part of the url

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • Base de données Spatialite — supporté depuis la version 1.1 de QGIS. Tout comme avec les bases de données PostGIS, la classe QgsDataSourceURI peut être utilisée pour générer l’identifiant de la source de données:

    uri = QgsDataSourceURI()
    uri.setDatabase('/home/martin/test-2.3.sqlite')
    schema = ''
    table = 'Towns'
    geom_column = 'Geometry'
    uri.setDataSource(schema, table, geom_colum)
    
    display_name = 'Towns'
    vlayer = QgsVectorLayer(uri.uri(), display_name, 'spatialite')
    
  • MySQL WKB-based geometries, through OGR — data source is the connection string to the table

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|\
      layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • WFS connection:. the connection is defined with a URI and using the WFS provider

    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")
    

    The uri can be created using the standard urllib library.

    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))
    

    Et vous pouvez aussi utiliser

Couches raster

For accessing raster files, GDAL library is used. It supports a wide range of file formats. In case you have troubles with opening some files, check whether your GDAL has support for the particular format (not all formats are available by default). To load a raster from a file, specify its file name and base name

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!"

Les couches raster peuvent également être créées à partir d’un service WCS.

layer_name = 'elevation'
uri = QgsDataSourceURI()
uri.setParam ('url', 'http://localhost:8080/geoserver/wcs')
uri.setParam ( "identifier", layer_name)
rlayer = QgsRasterLayer(uri, 'my_wcs_layer', 'wcs')

Alternatively you can load a raster layer from WMS server. However currently it’s not possible to access GetCapabilities response from API — you have to know what layers you want

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!"

Map Layer Registry

If you would like to use the opened layers for rendering, do not forget to add them to map layer registry. The map layer registry takes ownership of layers and they can be later accessed from any part of the application by their unique ID. When the layer is removed from map layer registry, it gets deleted, too.

Adding a layer to the registry:

QgsMapLayerRegistry.instance().addMapLayer(layer)

Les couches sont automatiquement supprimées lorsque vous quittez, mais si vous souhaitez explicitement supprimer la couche, utilisez:

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)
A FAIRE :
More about map layer registry?