How to create an offset polyline in arcpy?

We came up with this technique at work that uses geoprocessing tools to do the job:

First off, make sure your line segs have unique IDs.

  1. Buffer "FLAT" in each direction of the line, add a new field of the same name to each and give them a direction ("L","R").
  2. Merge the buffers together.
  3. Buffer the original line again, this time "FULL".
  4. Convert the FULL buffer to lines (PolygonToLine: "IGNORE_NEIGHBORS"), then convert its vertices to points (FeatureVerticesToPoints: "BOTH_ENDS").
  5. Buffer each point by a very small width (e.g. 0.1 m).
  6. Split the lines by vertex (SplitLine).
  7. Select by location to select all lines that intersect with the point buffers.
  8. Delete these lines.
  9. Dissolve ("SINGLE_PART") on the segment unique ID.
  10. Spatial Join ("SHARE_A_LINE_SEGMENT_WITH") the new lines to the merged "LEFT" and "RIGHT" buffers to attribute them with direction.

Voila! Offset lines without ArcObjects.


Here is the code to do the same in arcpy

import arcpy

tmpwrkspace = "C:/tempgdb/temp.gdb/"
fc_line = tmpwrkspace + "MultiLineLayer"

# Set some variables
tempFeatureClass = tmpwrkspace + "temp_pline"

#set the offset to +n or -n for direction
xOffset = 0.2
yOffset = 0.2

if arcpy.Exists(tempFeatureClass):
    arcpy.Delete_management(tempFeatureClass)

arcpy.CopyFeatures_management(fc_line, tempFeatureClass)

# Perform the move
with arcpy.da.UpdateCursor(tempFeatureClass, ["SHAPE@XY"]) as cursor:
    for row in cursor:
        cursor.updateRow([[row[0][0] + xOffset, row[0][1] + yOffset]])