Haideți să deschidem mai multe straturi cu date. QGIS recunoaște straturile vectoriale și pe cele de tip raster. În plus, sunt disponibile și tipurile de straturi personalizate, dar pe acestea nu le vom discuta aici.
To load a vector layer, specify layer’s data source identifier, name for the layer and provider’s name:
layer = QgsVectorLayer(data_source, layer_name, provider_name)
if not layer.isValid():
print "Layer failed to load!"
Identificatorul sursei de date reprezintă un șir specific pentru fiecare furnizor de date vectoriale în parte. Numele stratului se va afișa în lista straturilor. Este important să se verifice dacă stratul a fost încărcat cu succes. În cazul neîncărcării cu succes, va fi returnată o instanță de strat nevalid.
Cea mai rapidă cale de a deschide și de a afișa un strat vectorial în QGIS are loc prin utilizarea funcției addVectorLayer din clasa QgisInterface:
layer = iface.addVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr") if not layer: print "Layer failed to load!"
Astfel se creează un nou strat care va fi adăugat într-un singur pas în registrul de straturi al hărții (ceea ce-l va face să apară în lista straturilor). Funcția returnează instanța stratului, sau None dacă stratul nu a putut fi încărcat.
Lista de mai jos arată modul de accesare a diverselor surse de date, cu ajutorul furnizorilor de date vectoriale:
OGR library (shapefiles and many other file formats) — data source is the path to the file
vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
PostGIS database — data source is a string with all information needed to create a connection to PostgreSQL database. QgsDataSourceURI class can generate this string for you. Note that QGIS has to be compiled with Postgres support, otherwise this provider isn’t available.
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 or other delimited text files — to open a file with a semicolon as a delimiter, with field “x” for x-coordinate and field “y” with y-coordinate you would use something like this
uri = "/some/path/file.csv?delimiter=%s&xField=%s&yField=%s" % (";", "x", "y")
vlayer = QgsVectorLayer(uri, "layer_name_you_like", "delimitedtext")
Note: from QGIS version 1.7 the provider string is structured as a URL, so the path must be prefixed with file://. Also it allows WKT (well known text) formatted geometries as an alternative to “x” and “y” fields, and allows the coordinate reference system to be specified. For example
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")
SpatiaLite database — supported from QGIS v1.1. Similarly to PostGIS databases, QgsDataSourceURI can be used for generation of data source identifier
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')
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))
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!"
Similar straturilor vectoriale, straturile raster pot fi încărcate cu ajutorul funcției addRasterLayer a clasei QgisInterface:
iface.addRasterLayer("/path/to/raster/file.tif", "layer_name_you_like")
Astfel se creează un nou strat care se adaugă la registrul de straturi al hărții într-un singur pas (făcându-l să apară în lista straturilor).
Raster layers can also be created from a WCS service.
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')
setările URI detaliate pot fi găsite în documentația furnizorului
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!"
Dacă doriți să utilizați straturile deschise pentru randare, nu uitați să le adăugați în registrul straturilor de hartă. Acest registru înregistrează proprietatea asupra straturilor, acestea putând fi accesate ulterior din oricare parte a aplicației după ID-ul lor unic. Atunci când un strat este eliminat din registru, va fi și șters totodată.
Adding a layer to the registry
QgsMapLayerRegistry.instance().addMapLayer(layer)
Layers are destroyed automatically on exit, however if you want to delete the layer explicitly, use
QgsMapLayerRegistry.instance().removeMapLayer(layer_id)
For a list of loaded layers and layer ids, use
QgsMapLayerRegistry.instance().mapLayers()