Încărcarea Straturilor

Haideți să deschidem mai multe straturi cu date. QGIS recunoaște straturile vectoriale și de tip raster. În plus, sunt disponibile și tipuri de straturi personalizate, dar nu le vom discuta aici.

Straturi Vectoriale

Pentru a încărca un strat vectorial, specificați identificatorul sursei de date a stratului, numele stratului și numele furnizorului:

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 invalid.

Lista de mai jos arată modul de accesare a diverselor surse de date, cu ajutorul furnizorilor de date vectoriale:

  • Bibliotecă OGR (fișier shape și multe alte formate de fișiere) — sursa de date este calea către fișier

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", \
      "layer_name_you_like", "ogr")
    
  • Bază de date PostGIS — sursa de date este un șir cu toate informațiile necesare pentru a crea o conexiune la baza de date PostgreSQL. Clasa QgsDataSourceURI poate genera acest șir pentru dvs. Rețineți că QGIS trebuie să fie compilat cu suport Postgres, în caz contrar acest furnizor nu va fi disponibil.

    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 sau alte fișiere text delimitate — pentru a deschide un fișier având punct și virgulă ca delimitator, iar câmpurile “x” și “y” ca și coordonate x respectiv y, ar trebui să folosiți ceva de genul următor

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

    Nota: încă de la versiunea 1.7 a QGIS șirul de furnizor este structurat ca un URL, astfel încât calea trebuie să fie precedată cu file ://. De asemenea, ea permite geometrii în format WKT (text bine cunoscut) ca o alternativă la câmpurile “x” și “y”, permițând și specificarea sistemului de coordonate de referință. De exemplu

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" \
      % (";", "shape")
    
  • Fișiere GPX — furnizorul de date “gpx” citește urme, rute și puncte de referință din fișiere gpx. Pentru a deschide un fișier, tipul (urmă / traseu / punct de referință) trebuie să fie specificat ca parte a url-ului

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • Bază de date SpatiaLite — începând cu QGIS v1.1. În mod similar bazelor de date PostGIS, QgsDataSourceURI poate fi utilizat pentru generarea identificatorului sursei de date

    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')
    
  • Geometrii MySQL bazate pe WKB, prin OGR — sursa de date este șirul de conectare la tabelă

    uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|\
      layername=my_table"
    vlayer = QgsVectorLayer( uri, "my_table", "ogr" )
    
  • Conexiune WFS:. conexiunea este definită cu un URI și folosind furnizorul ``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")
    

    URI poate fi creat folosind biblioteca 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))
    

    Și puteți utiliza, de asemenea,

Straturi raster

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

Raster layers can also be created from a WCS service.

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

Map Layer Registry

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)

Layers are destroyed automatically on exit, however if you want to delete the layer explicitly, use:

QgsMapLayerRegistry.instance().removeMapLayer(layer_id)
TODO:
More about map layer registry?