此页面上的代码段需要以下导入:
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!")
数据源标识符是一个字符串,它特定于每个矢量数据提供者。图层名称在图层列表控件(widget)中使用。检查图层是否已成功加载很重要。如果加载失败,则返回无效的图层实例None。
对于地理封装矢量层:
# 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中打开和显示矢量层的最快方式是调用QgisInterfacer::
addVectorLayer()
方法:
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
类可以为您生成此字符串。请注意,必须在Postgres支持下编译QGIS,否则该提供接口将不可用: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文件-“ gpx”数据提供程序从gpx文件读取轨迹,路线和航路点。要打开文件,需要将类型(航迹/路线/航路点)指定为网址的一部分:
uri = "path/to/gpx/file.gpx?type=track" vlayer = QgsVectorLayer(uri, "layer name you like", "gpx")
-
SpatiaLite数据库-与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')
-
通过OGR,基于MySQL WKB的几何-数据源是表的连接字符串:
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")
可以使用标准
urllib
库创建uri :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
对象的addRasterLayer函数加载栅格图层:
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由以=分隔的键=值对组成&
。它的格式与URL中的查询字符串相同,编码方式也相同。QgsDataSourceUri
应该用于构造URI,以确保对特殊字符进行正确编码。
-
url(必填):WCS服务器URL。不要在URL中使用VERSION,因为WCS的每个版本都为GetCapabilities 版本使用了不同的参数名称,请参阅param版本。
-
标识符(必填):覆盖范围名称
-
time(可选):时间位置或时间段(beginPosition / endPosition [/ timeResolution])
-
格式(可选):支持的格式名称。默认值为名称中带有tif的第一个受支持格式或第一个受支持格式。
-
crs(可选):形式为AUTHORITY:ID的CRS,例如EPSG:4326。如果支持,则默认为EPSG:4326,或者第一个支持的CRS。
-
用户名(可选):用于基本身份验证的用户名。
-
密码(可选):基本身份验证的密码。
-
IgnoreGetMapUrl(可选,hack):如果指定(设置为1),则忽略由GetCapabilities通告的GetCoverage URL。如果服务器配置不正确,可能有必要。
-
InvertAxisOrientation(可选,hack):如果指定(设置为1),则在GetCoverage请求中切换轴。如果服务器使用错误的轴顺序,则对于地理CRS可能是必需的。
-
IgnoreAxisOrientation(可选,hack):如果指定(设置为1),请不要根据WCS标准为地理CRS反转轴方向。
-
cache(可选):缓存加载控制,如QNetworkRequest :: CacheLoadControl中所述,但是如果AlwaysCache失败,则请求以PreferCache重新发送。允许的值:AlwaysCache,PreferCache,PreferNetwork,AlwaysNetwork。默认值为AlwaysCache。
或者,您可以从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()
方法通过Python删除图层。
使用以下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()
©版权所有2002-现在,QGIS项目 最近更新于2020年4月3日09:14。
使用Sphinx使用Read the Docs提供的主题构建。