Shifting features

Shifting (or moving) features is a snap using the arcpy.da module’s UpdateCursor. By modifying the SHAPE@XY token, it modifies the centroid of the feature and shifts the rest of the feature to match. This approach will hold for point, polyline or polygon features.

To modify only a single or subset of features in a feature layer, apply a selection to that layer and pass the layer in as the input to shift_features.

Word of caution, this is using UpdateCursor, so features will be permanently modified. So, back up your data if you may potentially want to reverse the updates.

import arcpy

def shift_features(in_features, x_shift=None, y_shift=None):
    Shifts features by an x and/or y value. The shift values are in
    the units of the in_features coordinate system.

    in_features: string
        An existing feature class or feature layer.  If using a
        feature layer with a selection, only the selected features
        will be modified.

    x_shift: float
        The distance the x coordinates will be shifted.

    y_shift: float
        The distance the y coordinates will be shifted.

    with arcpy.da.UpdateCursor(in_features, ['SHAPE@XY']) as cursor:
        for row in cursor:
            cursor.updateRow([[row[0][0] + (x_shift or 0),
                               row[0][1] + (y_shift or 0)]])


5 thoughts on “Shifting features

  1. We are trying this with annotation (non-feature linked). The script moves the box but not the annotation text itself. Will the update cursor work with annotation feature classes? Do we need to somehow break into the ‘Element’ rather than the SHAPE?

    • Hi Jean,
      Unfortunately, our cursors currently don’t have support for updating or inserting annotation features.

  2. A very nice (undocumented) feature. This would be useful to mention in the next help update.

    Now what about a rotate feature function? I have to use a numpy cross product matrix for every point.

    • Hi Mel, yes what you could do instead of passing x_shift & y_shift arguments to the shift_features function you do this.

      Have a look at the UpdateCursor on line 21, currently it only asks for one field from the table : [‘SHAPE@XY’]. What you’d want to do is add the name of the fields you want and use those values instead of x_shift & y_shift on lines 23 & 24.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s