当前位置: 首页 > news >正文

【ArcMap】复制选中的线并将其上移一段距离

首先选中需要复制的线

image

 在python2窗口中输入以下代码:此处为上移10米

  • 对于地理坐标系,使用0.00009度(约10米)

  • 对于投影坐标系,使用10米

# -*- coding: utf-8 -*-
import arcpy
import os
import sys# 重新加载sys并设置默认编码
reload(sys)
sys.setdefaultencoding('utf-8')# 设置环境
arcpy.env.overwriteOutput = Truetry:# 获取当前地图文档mxd = arcpy.mapping.MapDocument("CURRENT")df = arcpy.mapping.ListDataFrames(mxd)[0]arcpy.AddMessage("脚本开始执行...")# 查找线图层target_layer = Nonefor layer in arcpy.mapping.ListLayers(mxd):if layer.isFeatureLayer:desc = arcpy.Describe(layer)if desc.shapeType == "Polyline":target_layer = layerbreakif target_layer is None:arcpy.AddError("未找到线图层")sys.exit()arcpy.AddMessage("找到图层: " + target_layer.name)# 检查是否有选中的要素desc = arcpy.Describe(target_layer)if not desc.FIDSet:arcpy.AddError("没有选中的要素")sys.exit()# 获取选中要素的数量result = arcpy.GetCount_management(target_layer)selected_count = int(result.getOutput(0))arcpy.AddMessage("选中的要素数量: " + str(selected_count))# 获取数据源路径data_source = desc.catalogPatharcpy.AddMessage("数据源: " + data_source)# 获取空间参考spatial_ref = desc.spatialReferencearcpy.AddMessage("坐标系: " + spatial_ref.name)# 获取选中要素的OIDselected_oids = []with arcpy.da.SearchCursor(target_layer, ["OID@"]) as cursor:for row in cursor:selected_oids.append(row[0])arcpy.AddMessage("选中的要素OID: " + str(selected_oids))# 创建查询条件oid_field = arcpy.Describe(target_layer).OIDFieldNamewhere_clause = "{} IN ({})".format(arcpy.AddFieldDelimiters(data_source, oid_field), ",".join(str(oid) for oid in selected_oids))# 获取字段列表field_names = []for field in arcpy.ListFields(target_layer):if field.type not in ["OID", "Geometry"]:field_names.append(field.name)arcpy.AddMessage("将复制的字段: " + str(field_names))# 确定移动距离 - 缩短为10米if spatial_ref.type == "Geographic":y_offset = 0.00009  # 大约10米 (1度≈111公里,10米≈0.00009度)else:y_offset = 10.0  # 10米
    arcpy.AddMessage("向上移动距离: " + str(y_offset) + ("" if spatial_ref.type == "Geographic" else ""))# 开始编辑会话edit = arcpy.da.Editor(os.path.dirname(data_source))edit.startEditing(False, True)edit.startOperation()try:# 使用插入游标将移动后的要素添加到同一图层with arcpy.da.InsertCursor(data_source, ["SHAPE@"] + field_names) as insert_cursor:# 使用搜索游标读取选中的要素with arcpy.da.SearchCursor(data_source, ["SHAPE@"] + field_names, where_clause) as search_cursor:moved_count = 0for row in search_cursor:shape = row[0]attributes = row[1:]if shape:# 创建一个新的数组来存储移动后的点new_parts = arcpy.Array()# 遍历原始几何的每个部分for part in shape:new_part = arcpy.Array()# 遍历每个点for point in part:if point:# 创建新点,Y坐标增加偏移量new_point = arcpy.Point(point.X, point.Y + y_offset)new_part.add(new_point)new_parts.add(new_part)# 创建新的Polyline几何moved_shape = arcpy.Polyline(new_parts, spatial_ref)# 插入移动后的要素到同一图层insert_cursor.insertRow([moved_shape] + list(attributes))moved_count += 1arcpy.AddMessage("已复制并移动要素 " + str(moved_count))# 提交编辑
        edit.stopOperation()edit.stopEditing(True)arcpy.AddMessage("成功复制并移动 " + str(moved_count) + " 个要素到原始图层")# 刷新视图
        arcpy.RefreshActiveView()arcpy.RefreshTOC()# 清除选择集,显示所有要素target_layer.setSelectionSet("NEW", [])arcpy.AddMessage("操作完成! 所有移动后的要素都已添加到原始图层中")arcpy.AddMessage("原始要素保持不变,新要素已向上移动10米")arcpy.AddMessage("现在图层中有 " + str(selected_count + moved_count) + " 个要素")arcpy.AddMessage("请使用测量工具验证两条线之间的距离是否为10米")arcpy.AddMessage("注意:由于10米距离很小,可能需要放大查看")except Exception as e:# 中止编辑
        edit.stopOperation()edit.stopEditing(False)raise eexcept Exception as e:arcpy.AddError("错误: " + str(e))import tracebackerror_msg = traceback.format_exc()arcpy.AddError(error_msg)

运行后如下:

image

 

http://www.zskr.cn/news/30545.html

相关文章:

  • HuggingFace 库使用小技巧
  • 【打造自己的 DeepSeek】第 2 期:怎么安装自己的 DeepSeek?
  • 一种解决所有 OI 问题的算法:Dream 算法
  • CobaltStrike流量分析
  • 2025年自动上料机厂家权威推荐榜:螺旋上料机/真空上料机/粉末上料机,高效输送系统精准选型指南
  • 建立VLAN间通信
  • 详细介绍:React Native 中的 useState、Context
  • 明天的任务
  • 深度神经网络 —— 使用深度自动编码器进行手写数字的去噪音
  • 完整教程:Webpack5 第四节
  • 完整教程:ACWing08:高精度专题
  • 使用本地git命令行拉取github.com软件仓库public项目
  • 10.25 CSP-S模拟39/2025多校冲刺CSP模拟赛8 改题记录
  • 嵌入子流形
  • 玩转单片机之智能车小露——数字与字符串的转换与打印
  • linux磁盘管理-RAID介绍 - 详解
  • Link-Cut Tree
  • 线段上随机取n个点的最大距离期望
  • 第5天(中等题 滑动窗口、逆向思维)
  • Meet in the middle 学习笔记
  • 虚拟机下 安装 ubuntu 18.04
  • 路径规划算法学习Day2:广度优先搜索算法(BFS)
  • 完整教程:ros_control 中 hardware_interface 教程
  • 飞牛NAS的SSL证书过期,又开启了强制HTTPS,进不去界面修改SSL怎么办? - 详解
  • 多表查询-练习
  • 小程序原创--基于微信开发者工具实现的猜谜游戏程序 - 教程
  • ReactUse 与ahook对比 - 实践
  • 遗传改良中的核心技术:交配设计
  • 分享二个实用正则
  • 国际水稻研究所推出 AI 驱动的全球杂交水稻育种与亲本筛选数字平台