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
如果无法加载层。
以下列表显示如何使用矢量数据提供程序访问各种数据源:
OGR库(shapefile和许多其他文件格式)---数据源是文件的路径:
Shapefile:
vlayer = QgsVectorLayer("/path/to/shapefile/file.shp", "layer_name_you_like", "ogr")
对于DXF(请注意数据源URI中的内部选项):
uri = "/path/to/dxffile/file.dxf|layername=entities|geometrytype=Point"
vlayer = QgsVectorLayer(uri, "layer_name_you_like", "ogr")
PostGIS数据库-数据源是一个字符串,包含创建到PostgreSQL数据库的连接所需的所有信息。
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(False), "layer name you like", "postgres")
注解
这个 False
参数传递给 uri.uri(False)
阻止扩展身份验证配置参数,如果不使用任何身份验证配置,则此参数不会产生任何差异。
csv或其他带分隔符的文本文件---要打开一个文件,用分号作为分隔符,用字段“x”表示x坐标,用字段“y”表示y坐标,您可以使用如下方法:
uri = "/some/path/file.csv?delimiter={}&xField={}&yField={}".format(";", "x", "y")
vlayer = QgsVectorLayer(uri, "layer name you like", "delimitedtext")
注解
提供程序字符串的结构为URL,因此路径必须以前缀 file://
. 它还允许WKT(众所周知的文本)格式的几何图形作为替代 x
和 y
字段,并允许指定坐标参考系。例如:
uri = "file:///some/path/file.csv?delimiter={}&crs=epsg:4723&wktField={}".format(";", "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")
空间数据库——类似于PostGIS数据库, QgsDataSourceUri
可用于生成数据源标识符:
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的几何体,通过ogr---数据源是到表的连接字符串:
uri = "MySQL:dbname,host=localhost,port=3306,user=root,password=xxx|layername=my_table"
vlayer = QgsVectorLayer( uri, "my table", "ogr" )
WFS连接:。连接是用一个URI定义的,并使用 WFS
供应商:
uri = "http://localhost:8080/geoserver/wfs?srsname=EPSG:23030&typename=union&version=1.0.0&request=GetFeature&service=WFS",
vlayer = QgsVectorLayer(uri, "my wfs layer", "WFS")
可以使用标准创建URI 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))
注解
您可以通过调用 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
实例拥有层的所有权,稍后可以通过其唯一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()