I hope the following will contribute to a solution for you, but it isn't quite a cook-book answer. This attempt uses proximity tools and geometry comparisons to establsh the LEFT or RIGHT-side condition for the Locations Points.
My initial reaction says to create a set of Buffer polygons from your streams and rivers polygons, using the Side Type (optional) argument to produce sets of Left-of-Stream and Right-of-Stream areas respectively. A Spatial Join or Near Table operation could associate your point locations with their nearest Left-of-Stream or Right-of-Stream polygon. However, the LEFT and RIGHT buffers created off of polylines are dependent on the digitized direction of the lines; this means "LEFT" and "RIGHT" could appear arbitrary depending on the directionality of the lines.
As an alternative to this direction-dependent buffering method, maybe you could use arcpy.SearchCursor()'s to retrieve and compare Geometries between your datasets. For example:
First, you could use the Feature Vertices to Points tool to create a feature class of midpoints from your polylines (to be used in the Geometry comparison):
arcpy.env.workspace = r'Path\To\Riparian\Shapefiles'
arcpy.FeatureVerticesToPoints_management(env.workspace + '\\Streams.shp',
Then you could use the Near tool to establish the closest Stream Midpoint to each of your Locations Points:
We should add an empty field to ultimately record the LEFT or RIGHT condition for the Locations points:
arcpy.AddField_management('Locations', "ON_SIDE", "TEXT")
Then, you can use the UpdateCursor to unpack and compare the geometries between a given Locations point, and its nearest Stream Midpoint. Record the result to "ON_SIDE":
cursor1 = arcpy.UpdateCursor('Locations')
for row in cursor1:
comparisonFeatureFID = str(row.getValue("NEAR_FID"))
locationGeometry = row.getValue("Shape") #Assuming 'Shape' is the Shape Field
whereClause = '"FID" = ' + comparisonFeatureID
cursor2 = arcpy.SearchCursor('StreamsMidpoints', whereClause)
for streamRow in cursor2:
midpointGeometry = streamRow.getValue("Shape")
if locationGeometry.firstPoint.X > midpointGeometry.firstPoint.X:
elif locationGeometry.firstPoint.X > midpointGeometry.firstPoint.X:
row.setValue("ON_SIDE", "SOMEHOW THEY ARE EQUAL")
print('Just Finished Comparing a Row')
This entire routine is predicated on the idea that X values can establish the LEFT or RIGHT condition, based on a coordinate system like the UTM, where all coordinate values are positive from an Origin Point.