当前位置: 首页 > 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.hskmm.com/?act=detail&tid=39108

相关文章:

  • 题解:AT_apc001_h Generalized Insertion Sort
  • 记一次thinkphp3.2项目迁移失败的原因。 is currently unable to handle this request. HTTP ERROR 500
  • 20232310 2025-2026-1 《网络与系统攻防技术》实验三实验报告
  • [SWPUCTF 2024 秋季新生赛]http标头 WP
  • 20251025 之所思 - 人生如梦
  • Jerrum–Sinclair 全有或全无定理
  • 一种解决所有 OI 问题的算法:Dream 算法
  • CobaltStrike流量分析
  • 【论文阅读】ASPS: Augmented Segment Anything Model for Polyp Segmentation - 指南
  • RuoYi-Cloud 认证实现
  • 初步学习计算机相关知识有感 - fang
  • 2025年自动上料机厂家权威推荐榜:螺旋上料机/真空上料机/粉末上料机,高效输送系统精准选型指南
  • 用代码将txt分别转换成列表和字典
  • 每日反思(2025_10_25)
  • AtCoder Beginner Contest 429 ABCDEF 题目解析
  • 2025年提升机厂家推荐排行榜,自动提升机,垂直提升机,物料提升机,工业提升设备公司精选
  • 刷题日记—数组—布尔数组的应用
  • 详细介绍:k8s中的kubelet
  • 树状数组 区间加 区间和 小记
  • 实验二 现代C++编程初体验
  • 昨夜雨疏风骤
  • 明天的任务
  • Windows SMB权限提升漏洞遭活跃利用
  • 江西振兴杯决赛Misc全解
  • 完整教程:Webpack5 第四节
  • 2025.10.25总结
  • ABC429
  • 10.25 CSP-S模拟39/2025多校冲刺CSP模拟赛8 改题记录
  • ABC429(C,D,E)
  • 玩转单片机之智能车小露——数字与字符串的转换与打印