HOW TO
Although ArcGIS Pro has the Create Parallel tool, the tool is not available through ArcPy. As an alternative, a Python script can be used to create a similar effect as seen in the image below. A script may be useful and efficient for workflows related to pipelines, roads and highways.
This article provides steps to use a Python script that draws parallel features.
Note: This script does not work on line intersections.
import os, arcpy, math
infc=r'<Feature/Shapefile_Path>' 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)
The following shows the full script:
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)
Get help from ArcGIS experts
Download the Esri Support App