arcpy帮助文档_基于Arcpy自动生成 八等分方向圆实现过程

5f5992ee89f1d08084c230905084773e.gif

需求描述

在进行城市空间拓展分析时,若想对城市空间方向进行研究,就会采用一个八等分方向圆的方法,将城市空间在八个方向上进行划分,统计面积、占比、研究发展趋势等等。

编者结合实际操作中创建八等分圆的需求,在此基于Arcpy开发一个自动生成八等分方向圆的工具。

传统方法

在利用现有ArcGIS构建八等分方向圆时,大部分的操作需要人工计算、操作、赋值。一个整个流程下,不仅步骤繁琐复杂,而且中间保存数据也比较多,不利于数据的整理存放。倘若分析的城市空间区域较多,就需要重复构建时,往往耗费大量的时间。

这对于以分析为主的城市空间拓展分析任务来说,着实效率不够高。

利用ArcGIS手动生成八等分方向的流程,可以点击下方链接:

在ArcGIS中构建八等分方向圆

在学习Arcpy的时候,建议先用ArcGIS工具简单操作一遍,了解整个数据处理的流程和结构,这样有助于理解和学习Arcpy的函数。

也更能体会到学习Arcpy的所带来的好处。

解决思路

调用Arcpy库,编写脚本工具,采用工具操作,一键实现八等分方向圆的创建。并且对过程数据进行规范化保存,便于后期数据处理中的调用。

化繁为简,简化数据处理的过程,把时间重点放在分析上。

工具介绍

实现目标

根据用户提供的圆心坐标数据,缓冲区半径,数据保存路径及空间投影坐标系,完成八等分方向圆的自动化创建。

c8449cfad81869dc79f8b1d08eafbe61.png

主要思路

编者的主要解决思路如下:

  • 构建缓冲区、转换成线要素,等到缓冲区边缘线

  • 根据八等分圆的特性,及提供的圆心坐标、缓冲区半径,利用方位角的规律性,逐一计算分割点坐标,同时计算方向点坐标

  • 利用不同方位的分割点与圆心构建成线,形成分割线,将分割线与边缘线一并,转换成面,得到无方向属性的八等分圆

  • 将无方向属性的八等分圆与方向点进行空间叠加,得到最终成果,带有方向信息的八等分方向圆

整体思路与传统方式相似,某种程度上来说,只是传统方法的自动化实现而已。

下面介绍代码部分。

包含功能

  • 生成八等分方向圆

  • 创建圆心点要素类

  • 创建分割点要素类

  • 创建分割线要素类

  • 创建方向点要素类等等

81e7cde4fa7df2447d78fe6e0683027b.png

本来只有八等分方向方向圆是需要的的数据图层,其余都是中间数据,在工具运行的最后删除即可。

考虑到后期分析时可能是需要调用到的,所以对这些数据进行了一个保留并命名。

倘若实在不需要就用一句删除代码搞定哈哈哈

arcpy.Delete_management(FeatureClass)

Arcpy函数

代码是基Arcpy编写的,主要用到的工具和函数都是调用的Arcpy库,若想对这些工具和函数有更多了解,就点击下方链接,看官方文档,当然本地也有帮助文档,一样可以搜索查看

官方的帮助文档,编者认为是最好的学习参考,看完不懂再去查看网上的帮助,效果更佳。

毕竟,网上有一些所谓教程,都是照搬的官方文档。我这边就偷懒直接放链接了。(主要是编者写不出这样的帮助说明...)

https://desktop.arcgis.com/zh-cn/arcmap/10.3/analyze/arcpy/what-is-arcpy-.htm

部分代码

处理流程上,关键的一个步骤就是计算分割点的位置。

已有的数据是一个圆心和缓冲半径,在空间上确定另外一点的位置,则通过加入方位角,利用三角函数便可以计算得到。

八等分方向圆,所需分割点为8个,加入一个嵌套循环语句,便可以计算得到。

最后将圆心点与分割点,创建点要素类输出即可。

#@author:GIS公寓#Copyright © GIS公寓(www.sircourse.com)# 计算各个点坐标    xx = 0    while xx <= 7:    # 根据八等分方向圆的特性,根据圆心坐标、半径,逐一计算各个分割点的坐标        splitpointX = centerX + distanceR * math.cos((xx * (math.pi / 4)) + math.pi / 8)        splitpointY = centerY + distanceR * math.sin((xx * (math.pi / 4)) + math.pi / 8)        # 将坐标赋予点对象,用于创建分割点点集        XYSplitpoint.X = splitpointX        XYSplitpoint.Y = splitpointY        # 调用函数创建点列表        SplitpointGeometry = arcpy.PointGeometry(XYSplitpoint, spRef)        SplitpointGeometryList.append(SplitpointGeometry)        xx += 1                  # 根据点列表生成分割点要素类,含圆心及分割点    Spoint = os.path.join(dataPath, splitPoint)    arcpy.CopyFeatures_management(SplitpointGeometryList, Spoint)

此外,为了最后给八等分方向圆赋值方向信息,还需要同时计算一个方向点数据,计算方法流程与分割点一致。

方向点为了确保位于八等分方向圆的内,计算时将缓冲区半径折半加入计算

#@author:GIS公寓#Copyright © GIS公寓(www.sircourse.com)    # 根据八等分方向圆的特性,根据圆心坐标、半径,逐一计算各个方向点的坐标        directionpointX = centerX + ( distanceR / 2 ) * math.cos((xx * (math.pi / 4)) + math.pi / 4)        directionpointY = centerY + ( distanceR / 2 ) * math.sin((xx * (math.pi / 4)) + math.pi / 4)

获取分割点后,建立分割线,形成分割线集,再转成面要素,便可得到无方向信息的八等分方向圆,再将方向点信息利用空间叠置工具赋予既可。

建立分割线集,分为两个部分,第一个便是利用要素转线,将缓冲区转成线;第二个部分,则是各个分割点与圆心连线形成线要素。

#@author:GIS公寓#Copyright © GIS公寓(www.sircourse.com)# 构建分割线,生成分割圆def CreatSplitLine(Sline, Dpoint_file):    line_cursor = arcpy.da.InsertCursor(Sline, ("SHAPE@"))    count_row = len(SplitpointX)    p_row = 1    while p_row < count_row:        STpx = SplitpointX[0] # 获取圆心的坐标信息        STpy = SplitpointY[0]        ETpx = SplitpointX[p_row] # 获取分割点的坐标信息        ETpy = SplitpointY[p_row]        point_col = arcpy.Array([arcpy.Point(STpx, STpy), arcpy.Point(ETpx, ETpy)])        polyline = arcpy.Polyline(point_col) # 生成线要素        line_cursor.insertRow((polyline,)) # 更新到线要素类中                p_row += 1    del line_cursor
#@author:GIS公寓#Copyright © GIS公寓(www.sircourse.com)# 生成最终八方向成果数据    # 创建八方向分割面    CSpolygonname = "八等分分割圆_无方向"    CSpolygon = os.path.join(dataPath, CSpolygonname)    arcpy.FeatureToPolygon_management(Sline, CSpolygon)    # 赋予方向信息    CDpolygonname = "八等分方向圆"    CDpolygon = os.path.join(dataPath, CDpolygonname)    arcpy.SpatialJoin_analysis(CSpolygon, Dpoint_file, CDpolygon)

利用上面两个函数,先是创建线要素,更新到分割线要素类中,再要素转面,获得无方向信息的八等分方向圆,在通过空间链接,便可以得到最终数据——八等分方向圆。

写在最后

人类的伟大,在于使用工具;人类的进步,在于创造工具。

在想这个工具如何实现的时候,复习了一遍三角函数,起初差点以为把所学都还给老师,好在还是有印象的,有惊无险的把所需要的分割点和方向点都计算出来了。

还有就是空间XY坐标,是跟平面XY坐标相反的,如果有仔细看分割点计算代码的话,应该是发现了。当然一开始就知道就更好。

若对代码有任何疑问、或者指教的,欢迎评论区留言。

GIS公寓入住着开发分析制图数据,快快关注一起入住其中吧

9be07a0d2d16d56c41a9d88ef0bf5227.png9be07a0d2d16d56c41a9d88ef0bf5227.png9be07a0d2d16d56c41a9d88ef0bf5227.png

bced3f2bc5d07f0a3ad388e7bd24bfb0.png

想了解更多,可以点击“阅读原文”,或者访问:www.sircourse.com

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值