(一)Arcpy 提取面要素文件的质心


前言

本系列Arcpy实验包含以下内容:

  1. 提取江苏省县区级行政区域的质心,形成一个点类型shape文件,至少含有县区名称属性;
  2. 将2021年各区数据整理为excel数据,两列,一列为县区名称,一列为2021年县区常住人口;
  3. 编写一个脚本工具,将县区常住人口数据作为属性值附加到县区质心点数据上;
  4. 编写脚本工具,对江苏2021年常住人口数据进行插值,插值方法任选;
  5. 制作一个绘图模版,绘制江苏各地级市2021年人口分布图(注意是地级市,需要用地级数据分别裁剪人口分布数据)。

01-Arcpy 提取面要素文件的质心

【目的要求】:

提取江苏省县区级行政区域的质心,形成一个点类型shape文件,至少含有县区名称属性。

【主要思路】:

通过arcpy.da.SearchCursor()函数定位输入文件的属性字段,利用令牌"SHAPE@XY"获取质心坐标,并利用arcpy.CreateFeatureclass_management()函数创建点要素。

用到的重要函数:

  • arcpy.CreateFeatureclass_management();
  • arcpy.AddField_management();
  • arcpy.da.SearchCursor();
  • arcpy.InsertCursor()

【实现步骤】

  • 首先进行路径设置,设置输入输出文件的路径,输入文件是江苏省县区级行政区域country.shp。
    在这里插入图片描述

  • 接着使用arcpy.CreateFeatureclass_management()函数,创建点要素。
    在这里插入图片描述

  • 使用arcpy.AddField_management()函数,给创建的点要素添加质心坐标X、Y以及Name的字段。
    在这里插入图片描述

  • 使用arcpy.da.SearchCursor()函数,利用令牌"SHAPE@XY"获取质心坐标,然后将获取到的输入文件(江苏省县区级行政区域country.shp)的质心坐标与地区名称字段的属性值,使用for循环依次分别添加到提前创建好的3个空列表中。
    在这里插入图片描述

  • 使用arcpy.Point()函数,创建普通点。这里是给新生成的文件添加字段属性值,因此游标应使用arcpy.InsertCursor()函数依次进行后续的生成地理点并添加相关字段属性的操作。
    在这里插入图片描述

  • 使用for循环,并根据前面提取到的质心坐标依次生成质心点并添加字段属性值。
    在这里插入图片描述

  • 添加自定义工具箱Geo_Tools,在ArcToolbox上右键-【添加工具箱(A)】。
    在这里插入图片描述

  • 将上述代码稍作改进,主要是将路径设置等变量用arcpy.GetParameterAsText()函数来替换,然后在Geo_Tools自定义工具箱上右键-【添加(A)】-【脚本(S)】,创建自定义脚本工具。
    在这里插入图片描述

  • 在该脚本工具的【常规】中填写名称、标签、描述并勾选存储相对路径名;在【源】中填写.py的脚本代码路径;在【参数】中设置相关参数名称、数据类型、参数属性等。属性设置界面如下:
    在这里插入图片描述

  • 提取质心点脚本工具的界面如下所示:
    在这里插入图片描述

【实验结果】

【脚本使用说明】:提取质心点脚本工具,需要输入待提取质心的面矢量要素,以及形成的质心文件需要的从面矢量要素的赋值字段属性,设置输出文件夹以及文件名(不写后缀),结果的质心文件可自由选择是否添加质心X和Y坐标的字段。
填写相关参数,在Arcmap中运行该脚本,所得结果如下:
在这里插入图片描述

源代码(仅供参考)

# -*- coding: GB2312 -*-
import arcpy

arcpy.env.overwriteOutput = True
# 00-路径设置
inputFile = arcpy.GetParameterAsText(0)  # 待求质心的面状矢量文件
Filed_Name = arcpy.GetParameterAsText(1)  # 将输入文件的某一字段属性赋值给生成的质心文件中
out_path = arcpy.GetParameterAsText(2)  # 生成的质心文件的保存路径(文件夹)
out_name = arcpy.GetParameterAsText(3)  # 生成的质心文件的文件名(不加后缀名)
Centroid_Flag = arcpy.GetParameterAsText(4)  # 质心标志位,1表示生成质心点,0表示不生成
pointFile = out_path + "/" + out_name + ".shp"  # 生成的质心文件的绝对路径

# 01-生成输入文件的质心坐标与地区名称并添加到创建的列表中
arcpy.AddMessage("读取输入文件……")
point_X = []
point_Y = []
point_Name = []
for row in arcpy.da.SearchCursor(inputFile, ["SHAPE@XY", Filed_Name]):
    point_X.append(row[0][0])  # 质心X坐标
    point_Y.append(row[0][1])  # 质心Y坐标
    point_Name.append(row[1])  # 名称属性

# 02-创建点要素
arcpy.AddMessage("创建点要素")
arcpy.CreateFeatureclass_management(out_path, out_name, "POINT")

# 03-给创建的点shp要素添加字段
arcpy.AddMessage("点要素添加字段")
fieldName = ['X', 'Y', 'Name']
if Centroid_Flag == 'true':
    arcpy.AddField_management(pointFile, fieldName[0], "DOUBLE")
    arcpy.AddField_management(pointFile, fieldName[1], "DOUBLE")
arcpy.AddField_management(pointFile, fieldName[2], "TEXT")
# arcpy.AddMessage(Filed_Name)

# 04-生成点要素,并添加属性值
arcpy.AddMessage("点要素添加属性值中……")
point = arcpy.Point()
rows = arcpy.InsertCursor(pointFile)
for i in range(len(point_X)):
    print(point_Name[i])
    row = rows.newRow()
    # 添加点坐标
    point.X = float(point_X[i])
    point.Y = float(point_Y[i])
    pointGeometry = arcpy.PointGeometry(point)
    row.shape = pointGeometry
    # 添加字段属性
    if Centroid_Flag == 'true':
        row.X = float(point_X[i])
        row.Y = float(point_Y[i])
    row.Name = point_Name[i]
    rows.insertRow(row)
del rows
arcpy.AddMessage("质心点生成成功!")

# 05-添加生成的点要素到当前图层
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("生成文件已添加至当前图层!")

结语

总结

本文主要介绍了如何利用Arcpy对面状矢量提取质心并形成点shape文件的方法,然后介绍了如何将代码进行改写形成脚本工具。

下文预告:

通过本文获取了江苏省的各地级市质心点数据。
接下来的文章会介绍如何利用Arcpy 给质心点数据添加人口数量的属性。

如果对你有所帮助,还请顺手点个赞,感谢你看到这,祝你生活愉快!

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucky_云佳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值