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 façon la plus rapide d’ouvrir et d’afficher une couche vectorielle avec QGIS est la fonction addVectorLayer de QgisInterface:

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

Une nouvelle couche est créée et ajoutée en une seule étape au registre de couches cartographiques (la faisant apparaître dans la liste des couches). La fonction fournit l’instance de la couche ou Aucune si la couche n’a pas pu être chargée.

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

  • librairie OGR (shapefiles et beaucoup d’autres formats) — la source de données est le chemin d’accès au fichier

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
    
  • Base de données PostGIS — la source de données est une chaîne contenant toutes les informations requises pour créer une connexion à la base de données PostgresSQL. La classe QgsDataSourceURI peut générer cette chaîne pour vous. Notez que QGIS doit être compilé avec le support Postgres, sinon le pilote n’est pas 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 optionally
    # 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 un point-virgule, ayant un champ “x” pour les coordonnées X et un champ “y” pour les coordonnées Y, vous pourriez utiliser quelque chose comme

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

    Note: à partir de la version 1.7 de QGIS, la chaîne de caractère du pilote peut être structurée comme une URL. Ainsi, le chemin d’accès doit être préfixé avec file://. Il est également possible d’utiliser des géométries formatées en WKT (Well-Known-Text) à la place des champs “x” et “y” et de spécifier le système de référence de coordonnées. Par exemple

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" % (";", "shape")
    
  • Fichiers GPX — le pilote pour les données “gpx” lit les pistes, les routes et les points de navigation des fichiers gpx. Pour ouvrir un fichier, il faut spécifier le type utilisé (piste/route/point de navigation) dans l’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_column)
    
    display_name = 'Towns'
    vlayer = QgsVectorLayer(uri.uri(), display_name, 'spatialite')
    
  • Géométries MySQL de type WKB, au travers d’OGR — la source de données est la chaîne de connexion à la table

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • Connexion WFS : la connexion est définie par une URI et utilise le fournisseur de données 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")
    

    L’URI peut être créée en utilisant la bilbiothèque standard 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))
    

Couches raster

Pour accéder aux fichiers raster, la bibliothèque GDAL est utilisée. Elle gère un grand nombre de formats de fichiers. Si vous avez du mal à ouvrir certains fichiers, vérifiez si votre installation de GDAL gère ce format particulier (tous les formats ne sont pas gérés par défaut). Pour ouvrir un raster depuis un fichier, indiquez son nom de fichier et son nom de base

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

De la même façon que pour les couches vectorielles, les couches rasters peuvent être ouvertes en utilisant la fonction addRasterLayer de la classe QgisInterface:

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

Une nouvelle couche est créée et ajoutée en une seule étape au registre de couches cartographiques (la faisant apparaître dans la liste des couches).

Les couches raster peuvent également être créées à partir d’un service 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')

le détail des paramètres URI peut être trouvé dans la documentation des pilotes

Vous pouvez également charger une couche raster depuis un serveur WMS. Cependant il n’est pas encore possible d’utiliser la réponse de GetCapabilities depuis l’API — vous devez connaître les couches que vous voulez charger

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

Registre de couches cartographiques

Si vous souhaitez utiliser les couches ouvertes pour faire un rendu, n’oubliez pas de les ajouter au registre de couches cartographiques. Ce registre prend possession des couches et elles peuvent être utilisées ultérieurement depuis n’importe qu’elle partie de l’application en utilisant leur identifiant unique. Lorsqu’une couche est supprimée du registre de couches cartographiques, elle est également supprimée.

Ajouter une couche au registre

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)

Pour obtenir la liste des couches chargées et leurs identifiant, utilisez

QgsMapLayerRegistry.instance().mapLayers()
A FAIRE :

Plus d’informations sur le registre de cartes ?