arcgis学习笔记
arcgis的概念
arcgis的应用场景
arcgis的发展历史
arcgis的cc工具箱
arcgis操作四十四个技巧
arcigspro中的动态文本技巧
ARCgis的图斑对比操作实操
arcgis如何汇总统计
arcgis如何布满布局操作
arcgis如何在dem栅格中提取水文线
arcgispro中如何创建空图层-最快办法
arcgismap过渡到PRO的操作细节
arcgisPRO如何画建筑阴影
arcgis的模型构建器-减轻重复劳动利器
如果在ArcGIS Pro的地图系列中插入动态统计表
arcgis土地利用转移矩阵
ArcGIS中的【OBJECTID_1】字段是什么鬼?如何还原成【OBJECTID】
arcgis四十个操作技巧-提高工作效率
ArcGIS 批量导出 MXD 地图,高效不加班
arcgis获取四至坐标
ArcGIS 强行修改字段类型工具
在ArcGIS中生成界址点的方法——基于arcpy脚本的实践指南
【ArcGIS 小技巧】为国空用地字段设置属性域,快速填充属性值并减少出错
arcgis导出csv格式
arcgis小技巧
数据分享2024年5月全国行政区划
arcgis计算子段的表达式
ArcGIS_空间连接_工具详解
ArcMap的那些功能在ArcGIS Pro里都去哪儿了?
【平面面积、椭球面积】计算方法全收录
解锁 ArcGIS 字段计算器!
ArcGIS【汇总统计】方法详解
解决你的所有 ArcGIS 标注问题:二分式、三分式、上下标、牵引线……
ArcGIS 模型构建器(ModelBuilder)_知识要点汇总
一篇文章学会 ArcGIS 模型构建器(ModelBuilder)
ArcGIS 筛选工具:19 段 SQL 代码,所有需求一网打尽
ArcGIS 模型构建器 Pro 版_更多花活演示
ArcGIS Pro 属性规则:数据自动化神器
【模型构建器高级技巧】迭代要素选择实现带属性的线面转换
【超级干货】26 段 python 代码,解锁 ArcGIS 字段计算器!
一文搞定 ArcGIS Pro 布局中的动态文本
本文档使用 MrDoc 发布
-
+
首页
在ArcGIS中生成界址点的方法——基于arcpy脚本的实践指南
什么是界址点? 界址点,简单来说就是宗地的拐点,是地块边界的转折处。每个界址点都有其独一无二的编号,用于准确定位地块边界。在 ArcGIS 中,界址点通常以点要素的形式存储,并与其他属性信息(如界址点编号、坐标等)关联。   **为何选择 arcpy 脚本?** **批量处理:** arcpy 脚本可以一次性处理多个宗地,大大节省时间。 **灵活性强:** 可以根据具体需求自定义脚本逻辑,实现更多功能。 **自动化:** 设置好参数后,脚本可自动运行,无需人工干预。 **可重复性:** 脚本可以保存下来,以便在需要时重复使用。  **实战演练** 下面的 arcpy 脚本实现了上述需求。脚本的主要步骤包括:创建输出要素类、提取和处理边界点、排序点、以及将结果保存到新的要素类中。 ``` import arcpy # 导入 arcpy 模块 import os # 导入 os 模块 try: # 获取用户输入的参数 input_polygon_fc = arcpy.GetParameterAsText(0) # 输入的多边形要素类 output_point_fc = arcpy.GetParameterAsText(1) # 输出的点要素类 id_field = arcpy.GetParameterAsText(2) # 多边形要素类中的ID字段 # 获取输出点要素类的路径和名称 output_folder = os.path.dirname(output_point_fc) # 输出文件夹路径 output_name = os.path.basename(output_point_fc) # 输出文件名称 # 创建一个新的点要素类 arcpy.CreateFeatureclass_management( out_path=output_folder, out_name=output_name, geometry_type="POINT", spatial_reference=input_polygon_fc # 使用输入多边形要素类的空间参考 ) # 为输出点要素类添加字段 arcpy.AddField_management(output_point_fc, "JID", "TEXT") # 添加 "JID" 字段,类型为文本 arcpy.AddField_management(output_point_fc, "X", "DOUBLE") # 添加 "X" 字段,类型为双精度 arcpy.AddField_management(output_point_fc, "Y", "DOUBLE") # 添加 "Y" 字段,类型为双精度 # 如果指定了ID字段,则添加ID字段 if id_field: arcpy.AddField_management(output_point_fc, "ID", "TEXT") # 将输入的多边形要素类复制到内存中的临时要素类 temp_polygon_fc = "in_memory\\temp_polygon" arcpy.CopyFeatures_management(input_polygon_fc, temp_polygon_fc) # 定义计算点到西北角距离的函数 def distance_to_nw_corner(point, nw_corner): return ((point.X - nw_corner.X) ** 2 + (point.Y - nw_corner.Y) ** 2) ** 0.5 # 定义获取最接近西北角点的函数 def get_nw_point(points, nw_corner): return min(points, key=lambda p: distance_to_nw_corner(p, nw_corner)) # 定义去除重复点的函数 def remove_duplicate_points(points): unique_points = [] seen = set() for p in points: if (p.X, p.Y) not in seen: unique_points.append(p) seen.add((p.X, p.Y)) return unique_points # 定义计算多边形面积的函数 def calculate_polygon_area(points): area = 0.0 n = len(points) for i in range(n): j = (i + 1) % n area += points[i].X * points[j].Y area -= points[j].X * points[i].Y return area / 2.0 # 定义提取多边形边界点的函数 def extract_boundary_points(polygon): points = [] for part in polygon: for pnt in part: if pnt: points.append(pnt) return points # 定义要素类的字段 fields = ["SHAPE@", "JID", "X", "Y"] if id_field: fields.append("ID") # 创建插入游标用于向输出点要素类添加点 cursor = arcpy.da.InsertCursor(output_point_fc, fields) # 使用搜索游标遍历输入的多边形要素类 with arcpy.da.SearchCursor(temp_polygon_fc, ["SHAPE@", id_field] if id_field else ["SHAPE@"]) as poly_cursor: for row in poly_cursor: polygon = row[0] # 获取多边形几何 points = extract_boundary_points(polygon) # 提取多边形的边界点 points = remove_duplicate_points(points) # 去除重复点 envelope = polygon.extent # 获取多边形的范围 nw_corner = arcpy.Point(envelope.XMin, envelope.YMax) # 计算西北角点 nw_point = get_nw_point(points, nw_corner) # 获取最接近西北角的点 start_index = points.index(nw_point) # 获取西北角点的索引 ordered_points = points[start_index:] + points[:start_index] # 重新排序点,起点为西北角点 # 如果多边形面积为正(逆时针),则反转点顺序(变为顺时针) if calculate_polygon_area(ordered_points) > 0: ordered_points.reverse() # 获取ID字段的值,如果没有指定ID字段,则使用点的索引生成ID id_value = row[1] if id_field else "J{}".format(points.index(nw_point) + 1) # 插入点到输出点要素类 for i, point in enumerate(ordered_points): cursor.insertRow([arcpy.Point(point.X, point.Y), "J{}".format(i + 1), point.X, point.Y, id_value] if id_field else [arcpy.Point(point.X, point.Y), "J{}".format(i + 1), point.X, point.Y]) # 删除游标 del cursor # 删除临时要素类 arcpy.Delete_management(temp_polygon_fc) # 捕获并报告 arcpy 执行错误 except arcpy.ExecuteError: arcpy.AddError(arcpy.GetMessages(2)) # 捕获并报告所有其他错误 except Exception as e: arcpy.AddError(str(e)) ```  **如何使用脚本?** 怎么通过代码来制作就不讲了,反正文末我都会分享,直接展示一下效果,主要实现了判断西北角作为起点,保证顺时针的顺序,缺点就是目前还没有解决有空洞的情况,那么尽量先避免空洞吧。关于注记如何不压盖面要素可以参考之前写到的[在 ArcGIS 中如何避免标注压盖要素](http://mp.weixin.qq.com/s?__biz=MzI2MDQzNDkyMA==&mid=2247485963&idx=1&sn=d2012ee86d012d6c44ef2b34818b71a6&chksm=ea68f48cdd1f7d9ad4d69b9d8072b38558e2b4e8a54a8d58133e9b6bcb96891baafc005f328d&scene=21#wechat_redirect)。   结语 通过本文的学习,我们了解了界址点在土地调查和地籍管理中的重要性,并探讨了如何利用 ArcGIS 的 arcpy 模块来批量生成界址点。利用 Python 脚本,我们可以大大提高工作效率,实现自动化和批量处理,减少人工干预,增强工作流程的灵活性和可重复性。尽管当前的脚本还有一些局限性,比如未处理有空洞的情况,但它已经为界址点生成提供了一个有效的解决方案。 如果你觉得这篇文章对你有帮助,请不要忘记**关注、点赞、在看、收藏、转发**给更多的朋友,让大家一起来提升土地调查和地籍管理的精度与效率!你的支持是我们持续创作的动力!
睡觉的骆驼
2024年8月6日 20:33
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码