users表空间是干嘛的_【PyQGIS】执行表联接

本教程介绍了如何在QGIS(PyQGIS)中使用Python脚本执行表联接并将渐变样式应用于结果层。本教程仅使用python脚本复制了Performing Table Joins教程的步骤。

任务概述

有关概述,请参阅“执行表联接”教程。您将学习的其他技能

  • 通过Python在QGIS中加载压缩层。

  • 使用QgsGraduatedSymbolRendererV2将渐变样式应用于矢量层。

获取数据

将以下文件下载到您的计算机。

tl_2013_06_tract.zip

ca_tracts_pop.csv

ca_tracts_pop.csvt

资料来源[TIGER] [USCENSUS]

程序

您可以在Python控制台或QGIS的内置编辑器中键入以下命令。

  1. 加载shapefile。人口普查区域文件是一个包含shapefile的zip文件。虽然我们可以解压缩并加载shapefile,但OGR提供程序可以直接通过虚拟文件系统加载zip文件。添加/vsizip/路径后,我们可以访问zip存档中包含的shapefile。

    注意

    zip_uri将从/vsizip//Linux和Mac系统上开始。(注意额外的/)

zip_uri = '/vsizip/C:/Users/Ujaval/Downloads/tl_2013_06_tract.zip'shp =  QgsVectorLayer(zip_uri, 'tl_2013_06_tract', 'ogr')QgsMapLayerRegistry.instance().addMapLayer(shp)

d4fa12f8ef5a2ae8b489b98374958d74.png

  1. 加载CSV文件。由于CSV文件不包含任何空间数据,因此我们使用delimitedtext提供程序将其加载为表格。

    csv_uri = 'file:///C:/Users/Ujaval/Downloads/ca_tracts_pop.csv?delimiter=,'csv = QgsVectorLayer(csv_uri, 'ca_tracts_pop', 'delimitedtext')QgsMapLayerRegistry.instance().addMapLayer(csv)

c42e4a5e392bfa6ee9868c332637604c.png

  1. 创建表联接。QGIS中的表联接是使用QgsVectorJoinInfo对象执行的 。我们需要GEO.id2将CSV层中的字段指定为Join Field,GEOID将shapefile层中的字段指定为Target Field。一旦运行以下代码,shapefile图层将具有从csv图层加入的其他属性。

注意

使用QgsVectorJoinInfo时的一个常见陷阱是必须将两个图层都加载到QgsMapLayerRegistry中-否则联接将无法工作。

shpField='GEOID'csvField='GEO.id2'joinObject = QgsVectorJoinInfo()joinObject.joinLayerId = csv.id()joinObject.joinFieldName = csvFieldjoinObject.targetFieldName = shpFieldjoinObject.memoryCache = Trueshp.addJoin(joinObject)

81e3503ccbb48c9b4d8d93e766bb2d0f.png

  1. 完成同一件事的一种更简单且更可取的方式是通过处理框架。您可以调用算法 qgis:joinattributestable并创建一个连接层。

注意

我们正在使用该processing.runandload()方法来执行算法,而不是更常见的算法processing.runalg()。由于我们要在QGIS中加载结果连接层,因此processing.runandload()是更好的选择。

import processingshpField='GEOID'csvField='GEO.id2'result = processing.runandload('qgis:joinattributestable', shp, csv, shpField, csvField, None)

4807bb60a8a403bf4411b99e0588c37b.png

  1. QgsVectorJoinInfo在本教程的其余部分中,我们将坚持使用原始联接。现在是时候将渐变样式应用于连接的图层了。连接层中的填充字段名称为 ca_tracts_pop_D001。我们将QgsGraduatedSymbolRendererV2Quantile模式下使用类来应用渐变渲染器 。有关需要使用的颜色和范围,请参考 执行表连接

from PyQt4 import QtGuimyColumn = 'ca_tracts_pop_D001 'myRangeList = []myOpacity = 1ranges = []myMin1 = 0.0myMax1 = 3157.2myLabel1 = 'Group 1'myColor1 = QtGui.QColor('#f7fbff')ranges.append((myMin1, myMax1, myLabel1, myColor1))myMin2 = 3157.2myMax2 = 4019.0myLabel2 = 'Group 2'myColor2 = QtGui.QColor('#c7dcef')ranges.append((myMin2, myMax2, myLabel2, myColor2))myMin3 = 4019.0myMax3 = 4865.8myLabel3 = 'Group 3'myColor3 = QtGui.QColor('#72b2d7')ranges.append((myMin3, myMax3, myLabel3, myColor3))myMin4 = 4865.8myMax4 = 5996.4myLabel4 = 'Group 4'myColor4 = QtGui.QColor('#2878b8')ranges.append((myMin4, myMax4, myLabel4, myColor4))myMin5 = 5996.4myMax5 = 37452.0myLabel5 = 'Group 5'myColor5 = QtGui.QColor('#08306b')ranges.append((myMin5, myMax5, myLabel5, myColor5))for myMin, myMax, myLabel, myColor in ranges:  mySymbol = QgsSymbolV2.defaultSymbol(shp.geometryType())  mySymbol.setColor(myColor)  mySymbol.setAlpha(myOpacity)  myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel)  myRangeList.append(myRange)myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList)myRenderer.setMode(QgsGraduatedSymbolRendererV2.Quantile)myRenderer.setClassAttribute(myColumn)shp.setRendererV2(myRenderer)

0cf9bb140a94d8cde865cfeffc006a33.png

  1. 在Python控制台中键入代码对于执行小任务很有用,但是使用内置Editor会容易得多。您可以在编辑器中复制整个脚本,然后单击“运行”。脚本完成后,您将创建一个表联接并为结果图层设置样式,而无需任何手动步骤。

    ec3dc79fb319f42b2d9f122040872830.png

以下是完整join_attributes.py文件,仅供参考。

from PyQt4 import QtGuizip_uri = '/vsizip/C:/Users/Ujaval/Downloads/tl_2013_06_tract.zip/tl_2013_06_tract.shp'shp =  QgsVectorLayer(zip_uri, 'tl_2013_06_tract', 'ogr')QgsMapLayerRegistry.instance().addMapLayer(shp)csv_uri = "file:///C:/Users/Ujaval/Downloads/ca_tracts_pop.csv?delimiter=,"csv = QgsVectorLayer(csv_uri, "ca_tracts_pop", "delimitedtext")QgsMapLayerRegistry.instance().addMapLayer(csv)shpField='GEOID'csvField='GEO.id2'joinObject = QgsVectorJoinInfo()joinObject.joinLayerId = csv.id()joinObject.joinFieldName = csvFieldjoinObject.targetFieldName = shpFieldjoinObject.memoryCache = Trueshp.addJoin(joinObject)myColumn = 'ca_tracts_pop_D001 'myRangeList = []myOpacity = 1ranges = []myMin1 = 0.0myMax1 = 3157.2myLabel1 = 'Group 1'myColor1 = QtGui.QColor('#f7fbff')ranges.append((myMin1, myMax1, myLabel1, myColor1))myMin2 = 3157.2myMax2 = 4019.0myLabel2 = 'Group 2'myColor2 = QtGui.QColor('#c7dcef')ranges.append((myMin2, myMax2, myLabel2, myColor2))myMin3 = 4019.0myMax3 = 4865.8myLabel3 = 'Group 3'myColor3 = QtGui.QColor('#72b2d7')ranges.append((myMin3, myMax3, myLabel3, myColor3))myMin4 = 4865.8myMax4 = 5996.4myLabel4 = 'Group 4'myColor4 = QtGui.QColor('#2878b8')ranges.append((myMin4, myMax4, myLabel4, myColor4))myMin5 = 5996.4myMax5 = 37452.0myLabel5 = 'Group 5'myColor5 = QtGui.QColor('#08306b')ranges.append((myMin5, myMax5, myLabel5, myColor5))for myMin, myMax, myLabel, myColor in ranges:    mySymbol = QgsSymbolV2.defaultSymbol(shp.geometryType())    mySymbol.setColor(myColor)    mySymbol.setAlpha(myOpacity)    myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel)    myRangeList.append(myRange)myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList)myRenderer.setMode(QgsGraduatedSymbolRendererV2.Quantile)myRenderer.setClassAttribute(myColumn)shp.setRendererV2(myRenderer)
310b39d1f962af474989c60a103e6eae.png

END

deb738e775857a7dfe60ea4120b614ee.gif

点击下方“阅读原文”查看更多

e57a30907adb53783b7b0f075e6f2aea.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值