本教程介绍了如何在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的内置编辑器中键入以下命令。
加载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)
加载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)
创建表联接。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)
完成同一件事的一种更简单且更可取的方式是通过处理框架。您可以调用算法
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)
QgsVectorJoinInfo
在本教程的其余部分中,我们将坚持使用原始联接。现在是时候将渐变样式应用于连接的图层了。连接层中的填充字段名称为ca_tracts_pop_D001
。我们将QgsGraduatedSymbolRendererV2
在Quantile
模式下使用类来应用渐变渲染器 。有关需要使用的颜色和范围,请参考 执行表连接。
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)
在Python控制台中键入代码对于执行小任务很有用,但是使用内置Editor会容易得多。您可以在编辑器中复制整个脚本,然后单击“运行”。脚本完成后,您将创建一个表联接并为结果图层设置样式,而无需任何手动步骤。
以下是完整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](https://i-blog.csdnimg.cn/blog_migrate/dd2263c0565b4008f907218c1561a7ca.png)
END
![deb738e775857a7dfe60ea4120b614ee.gif](https://i-blog.csdnimg.cn/blog_migrate/ab43622536290d04c76beb58cfd67c5c.gif)
点击下方“阅读原文”查看更多