操作方法

操作方法:使用 Python 创建与 ArcGIS Pro 中“平行复制”工具效果类似的平行要素

Last Published: October 16, 2020

摘要

虽然 ArcGIS Pro 具有“平行复制”工具,但是此工具在 ArcPy 中不可用。 或者,可以使用 Python 脚本来创建类似的效果,如下图所示。 对于与管线、道路和高速公路有关的工作流,脚本可能是非常有用且高效的。

显示用于创建与“创建平行”工具类似的效果的脚本输出的图像。

本文提供了使用 Python 脚本绘制平行要素的步骤。

过程

注意: 此脚本不适用于直线相交。
  1. 创建线要素克隆。 有关详细信息,请参考 ArcGIS Pro:使用剪贴板复制粘贴要素ArcGIS Pro:复制要素(数据管理)
  2. 将“宽度”字段添加到克隆线要素中。
    1. 使用克隆线要素“字段”视图中的添加字段。 有关详细信息,请参阅 ArcGIS Pro:“字段”视图
    2. 将字段命名为 Width 并将任一数值数据类型(长整型、短整型)设置为数据类型。
    3. 使用值填充 Width 字段,以根据线要素确定平行线的宽度。
  3. 打开 ArcGIS Pro 中的 Python 控制台或 Python 窗口。
  4. 导入所需的模块。
import os, arcpy, math
  1. 指定工作空间。
infc=r'<Feature/Shapefile_Path>' workspace = os.path.dirname(infc) edit = arcpy.da.Editor(workspace)
  1. 开始编辑要素。
edit.startEditing(False,True) edit.startOperation()
  1. 定义用于创建平行线的新函数。
def CopyParallel(plyP,sLength): part=plyP.getPart(0) lArray=arcpy.Array() rArray=arcpy.Array() for ptX in part: dL=plyP.measureOnLine(ptX) ptX0=plyP.positionAlongLine (dL-0.01).firstPoint ptX1=plyP.positionAlongLine (dL+0.01).firstPoint dX=float(ptX1.X)-float(ptX0.X) dY=float(ptX1.Y)-float(ptX0.Y) lenV=math.hypot(dX,dY) sX=-dY*sLength/lenV sY=dX*sLength/lenV leftP=arcpy.Point(ptX.X+sX,ptX.Y+sY) lArray.add(leftP) rightP=arcpy.Point(ptX.X-sX, ptX.Y-sY) rArray.add(rightP) array = arcpy.Array([lArray, rArray]) section=arcpy.Polyline(array) return section
  1. 启动新游标以将克隆线要素更新为平行线。
with arcpy.da.UpdateCursor(infc,("Shape@","Width")) as cursor: for shp,w in cursor: twoLines=CopyParallel(shp,w) cursor.updateRow((twoLines,w))
  1. 删除游标并停止编辑以释放要素上的锁定文件。
del cursor edit.stopOperation() edit.stopEditing(True)

以下显示了完整脚本:

import os, arcpy, math infc=r'C:\Users\User\Desktop\Work\Sample\Test_Shapefile.shp' workspace = os.path.dirname(infc) edit = arcpy.da.Editor(workspace) edit.startEditing(False,True) edit.startOperation() def CopyParallel(plyP,sLength): part=plyP.getPart(0) lArray=arcpy.Array() rArray=arcpy.Array() for ptX in part: dL=plyP.measureOnLine(ptX) ptX0=plyP.positionAlongLine (dL-0.01).firstPoint ptX1=plyP.positionAlongLine (dL+0.01).firstPoint dX=float(ptX1.X)-float(ptX0.X) dY=float(ptX1.Y)-float(ptX0.Y) lenV=math.hypot(dX,dY) sX=-dY*sLength/lenV sY=dX*sLength/lenV leftP=arcpy.Point(ptX.X+sX,ptX.Y+sY) lArray.add(leftP) rightP=arcpy.Point(ptX.X-sX, ptX.Y-sY) rArray.add(rightP) array = arcpy.Array([lArray, rArray]) section=arcpy.Polyline(array) return section with arcpy.da.UpdateCursor(infc,("Shape@","Width")) as cursor: for shp,w in cursor: twoLines=CopyParallel(shp,w) cursor.updateRow((twoLines,w)) del cursor edit.stopOperation() edit.stopEditing(True)

文章 ID:000024330

从 ArcGIS 专家处获得帮助

联系技术支持部门

下载 Esri 支持应用程序

转至下载选项

相关信息

发现关于本主题的更多内容