Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I am trying to create an offset polyline using arcpy, identical to the function in ArcObjects (constructoffset). After trying to access ArcObjects in arcpy, which I found difficult for those not well-versed in COM languages, and after much searching for functionality in the regular geoprocessing toolboxes, I discovered that this functionality seems to only exist in ArcObjects. There may be ways to program this functionality in arcpy using trig, but that seems really hard. Essentially, the product I'd like is an offset polyline that preserves all original geometry and curvature. Simply using a SearchCursor on the input and building a new feature class based on its geometry requires some algorithm I don't know. This is because without an algorithm based on slope, etc., a one-size-fits-all addition or subtraction will not preserve an offset shape for all slopes. Any help?

share|improve this question
    
When you mean slope, do you mean that you have a PolyLineZ feature class with Z values at each vertex? And if so, how would offsetting the line affect the Z values? Wouldn't simply preserving them be what you want? –  blah238 May 20 '12 at 22:58
    
Also are your features in projected coordinates? If so you could simply add/subtract your offset to each vertex coordinate. –  blah238 May 20 '12 at 23:07
    
This doesn't work because if my offset is 5 meters, I would need to have that 5 meter offset extend from each line perpendicular from any point on the line, else a 5 meter x offset on a horizontal line just moves the whole line west 5 meters, as opposed to extending in the y-direction as well. Therefore, the offset calculation is more complex than that, and I think it's what the Buffer function does. –  gotanuki May 22 '12 at 18:58
add comment

1 Answer 1

up vote 4 down vote accepted

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.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.