加载层¶

Docs in progress for 'QGIS testing'. Visit https://docs.qgis.org/3.4 for QGIS 3.4 docs and translations.

此页上的代码段需要以下导入:

import os # This is is needed in the pyqgis console also
from qgis.core import (
    QgsVectorLayer
)

让我们用数据打开一些图层。QGIS识别矢量和栅格层。此外,自定义层类型是可用的,但我们不打算在这里讨论它们。

矢量层

要创建矢量层实例,请指定层的数据源标识符、层的名称和提供程序的名称:

# get the path to the shapefile e.g. /home/project/data/ports.shp
path_to_ports_layer = os.path.join(QgsProject.instance().homePath(), "data", "ports", "ports.shp")

# The format is:
# vlayer = QgsVectorLayer(data_source, layer_name, provider_name)

vlayer = QgsVectorLayer(path_to_ports_layer, "Ports layer", "ogr")
if not vlayer.isValid():
    print("Layer failed to load!")

数据源标识符是一个字符串,它特定于每个向量数据提供程序。层的名称在层列表小部件中使用。检查层是否已成功加载非常重要。如果不是,则返回无效的层实例。

对于地理包矢量层:

# get the path to a geopackage  e.g. /home/project/data/data.gpkg
path_to_gpkg = os.path.join(QgsProject.instance().homePath(), "data", "data.gpkg")
# append the layername part
gpkg_places_layer = path_to_gpkg + "|layername=places"
# e.g. gpkg_places_layer = "/home/project/data/data.gpkg|layername=places"
vlayer = QgsVectorLayer(gpkg_places_layer, "Places layer", "ogr")
if not vlayer.isValid():
    print("Layer failed to load!")

在qgis中,打开和显示矢量层的最快方法是 addVectorLayer() 方法 QgisInterface

vlayer = iface.addVectorLayer(path_to_ports_layer, "Ports layer", "ogr")
if not vlayer:
  print("Layer failed to load!")

这将创建一个新的图层,并将其添加到当前的QGIS项目中(使其显示在图层列表中)。函数返回层实例或 None 如果无法加载层。

以下列表显示如何使用矢量数据提供程序访问各种数据源:

注解

您可以通过调用 setDataSource() 在一 QgsVectorLayer 实例,如下例所示:

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

栅格层

对于访问栅格文件,使用gdal库。它支持多种文件格式。如果您在打开某些文件时遇到问题,请检查您的gdal是否支持特定的格式(默认情况下并非所有格式都可用)。要从文件加载栅格,请指定其文件名和显示名称:

# get the path to a tif file  e.g. /home/project/data/srtm.tif
path_to_tif = os.path.join(QgsProject.instance().homePath(), "data", "srtm.tif")
rlayer = QgsRasterLayer(path_to_tif, "SRTM layer name")
if not rlayer.isValid():
    print("Layer failed to load!")

要从地理包加载栅格,请执行以下操作:

# get the path to a geopackage  e.g. /home/project/data/data.gpkg
path_to_gpkg = os.path.join(QgsProject.instance().homePath(), "data", "data.gpkg")
# gpkg_raster_layer = "GPKG:/home/project/data/data.gpkg:srtm"
gpkg_raster_layer = "GPKG:" + path_to_gpkg + ":srtm"

rlayer = QgsRasterLayer(gpkg_raster_layer, "layer name you like", "gdal")

if not rlayer.isValid():
    print("Layer failed to load!")

与矢量图层类似,可以使用 QgisInterface 对象:

iface.addRasterLayer("/path/to/raster/file.tif", "layer name you like")

这将创建一个新图层,并将其一步添加到当前项目(使其显示在图层列表中)。

也可以从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')

以下是wcs uri可以包含的参数说明:

wcs-uri由 key=value 由分隔的对 & . 它的格式与URL中的查询字符串相同,编码方式相同。 QgsDataSourceUri 应用于构造URI以确保特殊字符正确编码。

或者,您可以从WMS服务器加载栅格层。但是,目前无法从API访问getCapabilities响应——您必须知道您需要哪些层:

urlWithParams = 'url=http://irs.gis-lab.info/?layers=landsat&styles=&format=image/jpeg&crs=EPSG:4326'
rlayer = QgsRasterLayer(urlWithParams, 'some layer name', 'wms')
if not rlayer.isValid():
  print("Layer failed to load!")

QGSProject实例

如果要使用打开的层进行渲染,请不要忘记将它们添加到 QgsProject 实例。这个 QgsProject 实例拥有层的所有权,稍后可以通过其唯一ID从应用程序的任何部分访问层。当从项目中删除层时,也会删除层。用户可以在qgis界面中删除层,也可以使用 removeMapLayer() 方法。

将层添加到当前项目是使用 addMapLayer() 方法:

QgsProject.instance().addMapLayer(rlayer)

要在绝对位置添加图层,请执行以下操作:

# first add the layer without showing it
QgsProject.instance().addMapLayer(rlayer, False)
# obtain the layer tree of the top-level group in the project
layerTree = iface.layerTreeCanvasBridge().rootGroup()
# the position is a number starting from 0, with -1 an alias for the end
layerTree.insertChildNode(-1, QgsLayerTreeLayer(rlayer))

如果要删除层,请使用 removeMapLayer() 方法:

# QgsProject.instance().removeMapLayer(layer_id)
QgsProject.instance().removeMapLayer(rlayer.id())

在上面的代码中,层ID被传递(您可以通过调用 id() 方法),但也可以传递层对象本身。

有关已加载层和层ID的列表,请使用 mapLayers() 方法:

QgsProject.instance().mapLayers()