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")
    
  • Base de données PostGIS — la source de données est une chaîne de texte contenant toutes les informations nécessaires à la création d’une connexion à 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 pour 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 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 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: à partir de la version 1.7 de QGIS, la chaîne de caractère du fournisseur de données peut être structurée en tant qu’URL. Ainsi, le chemin 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 fournisseur de 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é (track/route/waypoint) 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, QGIS utilise la bibliothèque GDAL. Elle gère un large 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 répertoire d’emplacement

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

Vous pouvez également charger une couche raster depuis un serveur WMS. Néanmoins il ne sera pas possible d’utiliser les réponses du type GetCapabilities depuis l’API de QGIS: 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)
A FAIRE :

Plus d’informations sur le registre de cartes ?