需求描述
在进行城市空间拓展分析时,若想对城市空间方向进行研究,就会采用一个八等分方向圆的方法,将城市空间在八个方向上进行划分,统计面积、占比、研究发展趋势等等。
编者结合实际操作中创建八等分圆的需求,在此基于Arcpy开发一个自动生成八等分方向圆的工具。
传统方法
在利用现有ArcGIS构建八等分方向圆时,大部分的操作需要人工计算、操作、赋值。一个整个流程下,不仅步骤繁琐复杂,而且中间保存数据也比较多,不利于数据的整理存放。倘若分析的城市空间区域较多,就需要重复构建时,往往耗费大量的时间。
这对于以分析为主的城市空间拓展分析任务来说,着实效率不够高。
利用ArcGIS手动生成八等分方向的流程,可以点击下方链接:
在ArcGIS中构建八等分方向圆
在学习Arcpy的时候,建议先用ArcGIS工具简单操作一遍,了解整个数据处理的流程和结构,这样有助于理解和学习Arcpy的函数。
也更能体会到学习Arcpy的所带来的好处。
解决思路
调用Arcpy库,编写脚本工具,采用工具操作,一键实现八等分方向圆的创建。并且对过程数据进行规范化保存,便于后期数据处理中的调用。
化繁为简,简化数据处理的过程,把时间重点放在分析上。
工具介绍
实现目标
根据用户提供的圆心坐标数据,缓冲区半径,数据保存路径及空间投影坐标系,完成八等分方向圆的自动化创建。
![c8449cfad81869dc79f8b1d08eafbe61.png](https://i-blog.csdnimg.cn/blog_migrate/3a9572116fa75a27a877ca4c9dc726e4.png)
主要思路
编者的主要解决思路如下:
构建缓冲区、转换成线要素,等到缓冲区边缘线
根据八等分圆的特性,及提供的圆心坐标、缓冲区半径,利用方位角的规律性,逐一计算分割点坐标,同时计算方向点坐标
利用不同方位的分割点与圆心构建成线,形成分割线,将分割线与边缘线一并,转换成面,得到无方向属性的八等分圆
将无方向属性的八等分圆与方向点进行空间叠加,得到最终成果,带有方向信息的八等分方向圆
整体思路与传统方式相似,某种程度上来说,只是传统方法的自动化实现而已。
下面介绍代码部分。
包含功能
生成八等分方向圆
创建圆心点要素类
创建分割点要素类
创建分割线要素类
创建方向点要素类等等
![81e7cde4fa7df2447d78fe6e0683027b.png](https://i-blog.csdnimg.cn/blog_migrate/e8318bb51cabe7cb3d6fca2531da2c13.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公寓入住着开发、分析、制图、数据,快快关注一起入住其中吧
想了解更多,可以点击“阅读原文”,或者访问:www.sircourse.com