Загрузка слоёв

Давайте загрузим несколько слоёв с данными. В QGIS слои делятся на векторные и растровые. Кроме того, существуют пользовательские типы слоёв, но их обсуждение выходит за рамки этой книги.

Векторные слои

Чтобы загрузить векторный слой нужно указать идентификатор источника данных имя слоя и название провайдера:

layer = QgsVectorLayer(data_source, layer_name, provider_name)
if not layer.isValid():
  print "Layer failed to load!"

Идентификатор источника данных это строка, специфичная для каждого провайдера векторных данных. Имя слоя используется в виджете списка слоёв. Необходимо проверять успешно ли завершилась загрузка слоя или нет. В случае каких-либо ошибок возвращается неправильный объект.

Ниже показано как получить доступ к различным источникам данных используя провайдеры векторных данных:

  • библиотека OGR (shape-файлы и другие форматы) — идентификатором источника данных является путь к файлу:

    vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", \
      "layer_name_you_like", "ogr")
    
  • база данных PostGIS — идентификатором источника данных выступает строка с информацией, необходимой для установки соединения с базой данных PostgreSQL. Используйте класс QgsDataSourceURI для формирования такой строки. Помните, что QGIS должна быть скомпилированна с поддержкой PostgreSQL, иначе этот провайдер будет недоступен.:

    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 или другие текстовые файлы с разделителями — для открытия файла с полями “x” для координаты X и “y” для координаты Y и использующего в качестве разделителя запятую, можно использовать такой код:

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

    Примечание: начиная с QGIS 1.7 строка вызова провайдера формируется в виде URL, поэтому путь должен начинаться с file://. Кроме того, допускается использование геометрии в формате WKT (well known text) вместо полей с координатами x и y, и допускатся указание желаемой системы координат. Например:

    uri = "file:///some/path/file.csv?delimiter=%s&crs=epsg:4723&wktField=%s" \
      % (";", "shape")
    
  • GPX файлы — провайдер данных “gpx” позволяет читать треки, маршруты и путевые точки из файлов gpx. При открытии файла необходимо указать его тип (track/route/waypoint) в качестве части url:

    uri = "path/to/gpx/file.gpx?type=track"
    vlayer = QgsVectorLayer(uri, "layer_name_you_like", "gpx")
    
  • база данных SpatiaLite — поддерживается начиная с QGIS v1.1. Как и в случае с базами PostGIS, для генерирования идентификатора источника данных можно использовать QgsDataSourceURI:

    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')
    
  • WKB-геометрия из базы MySQL, доступ выполняется при помощи OGR — в качестве идентификатора источника даных выступает строка подключения к таблице:

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

    And you can also use the

Растровые слои

Для работы с растровыми данными используется библиотека GDAL. Она поддерживает множество различных форматов. В случае проблем при открытии файлов проверьте поддерживает ли ваша версия GDAL этот формат (поддержка некоторых форматов по умолчанию не доступна). Для загрузки растра из файла необходимо указать его имя и имя файла:

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

Или же можно загрузить растровый слой с сервера WMS. Однако, в настоящее время в API не предусмотрена возможность получить доступ к ответу на запроc GetCapabilities — необходимо знать названия нужных слоёв:

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

Список слоёв карты

Если вы хотите использовать открытые слои при отрисовке карты — не забудьте добавить их к списку слоёв карты. Список слоёв карты станет их владельцем, а получить доступ к ним можно будет из любой части приложения по уникальному идентификатору. При удалении слоя из списка слоёв карты, происходит его уничтожение.

Добавление слоя в список:

QgsMapLayerRegistry.instance().addMapLayer(layer)

При выходе слои уничтожаются автоматически, но если необходимо удалить слой явно используйте:

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