Outdated version of the documentation. Find the latest one here.

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:

    • pour les shp:

      vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
      
    • pour les dxf (Voir les options internes données dans les données sources de l’url):

      uri = "/path/to/dxffile/file.dxf|layername=entities|geometrytype=Point"
      vlayer = QgsVectorLayer(uri, "layer_name_you_like", "ogr")
      
  • Base de données PostGIS — la source des données est une chaîne de caractères contenant toutes les informations nécessaires pour créer une connexion à la base de données PostGIS. La classe QgsDataSourceURI peut générer cette chaîne pour vous. Veuillez noter que QGIS doit être compilé avec le support Postgres sinon ce fournisseur ne sera 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 et autres fichiers texte avec délimiteurs — pour ouvrir un fichier ayant un point-virgule comme délimiteur, et un champ “x” pour la coordonnée X et un champ “y” pour la coordonnée Y vous utiliserez 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 : depuis QGIS version 1.7 le fournisseur de chaîne est structuré comme une URL, donc le chemin doit être préfixé avec file://. Il permet aussi d’utiliser les géométries formatées en WKT (texte bien défini) à la place des champs “X” et “Y”, et permet de spécifier le système de référence géographique. Par exemple :

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" % (";", "shape")
    
  • Fichiers GPS — le fournisseur de données “gpx” lit les trajets, routes et points de passage d’un fichier gpx. Pour ouvrir un fichier, le type (trajet/route/point) doit être fourni dans l’url :

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer name you like", "gpx")
    
  • Base de données SpatialLite — supportée depuis QGIS v1.1. De façon similaire aux bases de données PostGIS, QgsDataSourceURI peut être utilisé pour générer l’identificateur de 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 basées sur WKB, avec OGR — la source des 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 URL 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(uri, "my wfs layer", "WFS")
    

    L’url peut être crée en utilisant la bibliothè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))
    

Note

Vous pouvez changer la source des données d’une couche existante en appelant setDataSource() de l’instance QgsVectorLayer. Par exemple:

# layer is a vector layer, uri is a QgsDataSourceURI instance
layer.setDataSource(uri.uri(), "layer name you like", "postgres")

Couches raster

Pour l’accès aux rasters, la librairie GDAL est utilisée. Elle supporte une grande variété de formats de fichier. Si vous avez des problèmes pour ouvrir un fichier, vérifiez si votre GDAL supporte ce type particulier de fichier (tous les formats ne sont pas disponibles par défaut). Pour ouvrir un raster à partir d’un fichier, spécifiez son nom de fichier et 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 aussi charger une couche raster à partir d’un serveur WMS. Il n’est cependant pas encore possible d’avoir accès à la réponse de GetCapabilities à partir de l’API — vous devez connaître les couches que vous voulez :

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.

En Ajoutant une couche au registre :

QgsMapLayerRegistry.instance().addMapLayer(layer)

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

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)

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

QgsMapLayerRegistry.instance().mapLayers()