PyQGisCookbook--加载图层(四)


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

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(众所周知的文本)格式的几何图形来替代xy字段,并允许指定坐标参考系统。例如:

    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提供的主题构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值