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