文章目录
前言:
本系列Arcpy实验包含以下内容:
- 提取江苏省县区级行政区域的质心,形成一个点类型shape文件,至少含有县区名称属性;
- 将2021年各区数据整理为excel数据,两列,一列为县区名称,一列为2021年县区常住人口;
- 编写一个脚本工具,将县区常住人口数据作为属性值附加到县区质心点数据上;
- 编写脚本工具,对江苏2021年常住人口数据进行插值,插值方法任选;
- 制作一个绘图模版,绘制江苏各地级市2021年人口分布图(注意是地级市,需要用地级数据分别裁剪人口分布数据)。
通过之前的文章 Arcpy 提取面要素文件的质心,已经从面状要素获得了江苏省县区级行政区域的质心,形成了一个点类型shape文件,含有县区名称属性。现在需要将县区常住人口数据作为属性值附加到县区质心点数据上。
县区常住人口数据参考网页中的数据(https://www.maigoo.com/news/624245.html)
将网页的感兴趣数据提取出来做成Excel,方便后续编写脚本工具,将人口数据作为属性值附加到县区质心点数据上。
02-网页数据的Excel汇总整理
- 对于网页中的表格类型的数据如下图所示,手动输入数据显然太过繁琐,可以试试利用Excel的【数据】选项卡-【获取和转换数据】-【自网站】功能进行数据的初步录用添加。
【目的要求】:
将2021年各区数据整理为Excel数据,一列为县区名称,一列为2021年县区常住人口。
【主要思路】:
利用Excel自动导入网页数据,并手动复制粘贴进行后续汇总整理。
【实现步骤】
- 从提供的网站(https://m.maigoo.com/news/624245.html)上面,提取2021年的江苏省各城市的县级人口数据。发现网页中的数据一个一个复制,过于繁琐。
- 利用Excel的【数据】选项卡-【获取和转换数据】-【自网站】功能进行数据的初步录用添加。
- 输入网页链接,接着在导航器中找到目标表格(Table 0),点击加载或者加载到,即可将数据添加到Excel中。重复该步骤,将江苏不同的城市2021常住人口数据都添加到Excel中。
- 接下来,就是复制粘贴,整理需要的数据,将2021年各区人口数据整理成一列为县区名称,一列为常住人口(单位:万人)。整理的最终效果如下所示:
03-添加人口数量属性值
【目的要求】:
编写一个脚本工具,将县区常住人口数据作为属性值附加到县区质心点数据上。
【主要思路】:
读取Excel中的两列数据,将其存为字典,后续添加人口数量数据时,使用县名作为键直接匹配对应的人口数据值。
【实现步骤】
- 首先设置路径,使用xlrd.open_workbook()函数读取Excel文件,并通过索引顺序读取表内容。
- 按列读取表中的数据,表中第一列为县区名称,第二列为人口数量数据;接着转换为字典。
- 获取前面生成的质心点文件的点名称属性,将其存储在变量Name列表中。
- 给质心点文件添加字段,名称为“Num”,人口数量有小数,因此数据类型为“Double”类型。
- 这里是在已有的数据中添加字段,因此游标应该使用arcpy.UpdateCursor()函数。
- 使用字典的好处是可以通过键直接匹配值,为质心数据其添加人口数据。
- 将上述代码稍作改进,将路径设置等变量用arcpy.GetParameterAsText()函数来替换,添加自定义脚本工具,从Excel中添加人口数量属性的工具界面如下所示:
【实验结果】
【脚本使用说明】:添加属性从Excel表脚本工具,需要输入前面从江苏省区县级矢量数据提取出的质心点要素文件,以及对应的Excel表数据。填写相关参数,在Arcmap中运行脚本,质心点数据属性表前后结果如下:
源代码(仅供参考):
# -*- coding: GB2312 -*-
import xlrd
import arcpy
arcpy.env.overwriteOutput = True
# 00-路径设置
pointFile = arcpy.GetParameterAsText(0)
# Excel文件路径
xlsPath = arcpy.GetParameterAsText(1)
data = xlrd.open_workbook(xlsPath)
table = data.sheets()[0] # 通过索引顺序获取
sheetName = table.name # 获取表名
print(sheetName)
rows = table.nrows # 获取行数
print(rows) # 106
countyName = table.col_values(0) # 获取表中第一列
popNumber = table.col_values(1) # 获取表中第二列
# 转换为字典
table_dict = dict(zip(countyName, popNumber))
# 获取点文件中的Name属性
Name = []
for row in arcpy.da.SearchCursor(pointFile, ["NAME"]):
Name.append(row[0])
# print(len(Name))
# 给点文件添加人口数据字段
arcpy.AddField_management(pointFile, "Num", "DOUBLE")
rows = arcpy.UpdateCursor(pointFile)
i = 0
for row in rows:
print(Name[i])
print("添加人口数据中……")
# 添加字段属性值
try:
row.Num = float(table_dict[Name[i]])
except:
print ("有问题!")
rows.updateRow(row)
print(table_dict[Name[i]])
i = i + 1
print "正在处理{0}条记录\n".format(i)
del rows
print("处理完成!")
# 添加生成的点要素到当前图层
mxd = arcpy.mapping.MapDocument("CURRENT")
df = arcpy.mapping.ListDataFrames(mxd)[0]
addLayer = arcpy.mapping.Layer(pointFile)
arcpy.mapping.AddLayer(df, addLayer, "AUTO_ARRANGE")
# 图层刷新
arcpy.RefreshActiveView()
arcpy.RefreshTOC()
arcpy.AddWarning("生成文件已添加至当前图层!")
结语
总结
本文主要介绍了如何利用Excel获取网页上的表格数据,以及如何利用Arcpy 对点矢量数据从Excel中获取并添加人口数量属性的方法。
下文预告:
通过前文从面矢量文件中提取出了质心点数据,通过本文为点数据添加了人口数量的属性。
接下来的文章会介绍如何利用Arcpy 进行空间插值,以期得到江苏省2021年人口分布图。
如果对你有所帮助,还请顺手点个赞,感谢你看到这,祝你生活愉快!