EDIT: He renovado esta respuesta después de darme cuenta de que la referenciación lineal permite determinar el lado a lo largo de una línea.
El mejor enfoque para este problema es utilizar el Caja de herramientas de referencia lineal en ArcGIS :
Un sistema de referencia lineal almacena los datos utilizando una posición relativa a lo largo de las características de las líneas existentes. Es decir, la ubicación se da en términos de una característica lineal conocida y una posición, o medida, a lo largo de ella. Por ejemplo, la ruta I-10, milla 23,2, identifica de forma única una posición en el espacio geográfico, y puede utilizarse en lugar de una coordenada x,y.
Así es como lo harías, asumiendo que estamos usando las calles y líneas de abajo:
-
Ejecutar el Creación de rutas (referencia lineal) herramienta con sus calles como su in_line_features
. Elija un campo de identificación único para el route_id_field
parámetro. Puede dejar todos los demás parámetros por defecto.
-
Ejecutar el Localizar elementos a lo largo de las rutas (referencia lineal) con sus puntos como el in_features
las rutas que creamos anteriormente como el in_routes
y el campo ID de la calle como su route_id_field
. Debería cambiar su radius_or_tolerance
de tal manera que haya suficiente distancia de sus calles para capturar todos sus puntos. Por último, desmarque la opción m_direction_offsetting
Esto hará que la designación izquierda/derecha se base en la dirección de digitalización de sus calles en lugar de la dirección más arbitraria de sus rutas.
-
En su tabla de resultados (mostrada a continuación), tendrá una fila para cada punto. El valor de la fila MEAS
representa la distancia a lo largo de la calle en la que se encuentra el punto. El valor del campo Distance
representa la distancia desde el punto hasta el lugar más cercano de su calle, donde el signo de la distancia indica el lado de la calle . Así, los valores negativos indican puntos a la izquierda de la calle y los valores positivos indican puntos a la derecha de la calle.
Para recorrer los puntos del lado izquierdo, ordene la tabla por RID
y MEAS
y omitir los valores positivos; hacer lo mismo pero invirtiendo la ordenación de MEAS
y omitir los valores negativos para iterar a través de sus puntos del lado del paseo en orden inverso. Probablemente sea más fácil ordenar en Python:
points = []
cursor = arcpy.da.SearchCursor(eventTable, ["RID","MEAS","Distance","OBJECTID"])
for row in cursor:
if row[2] < 0: #negative value = digitized left
points.append((row[0],"L",row[1]))
else: #positive value = digitized right
points.append((row[0],"R",row[1]*-1.0)) #negate MEAS to reverse direction
points.sort() #will break ties when sorting using 2nd or 3rd element in tuple
print [point[3] for point in points]
Esto da como resultado nuestros puntos ordenados por el ID de la calle, luego el lado izquierdo desde el inicio hasta el final, y luego el lado derecho desde el final hasta el inicio:
[9, 11, 12, 10, 8, 1, 4, 6, 5, 3, 2, 7]