No tengo suficiente representante para comentar, pero mi pregunta es si las carreteras ya están en segmentos que corresponden a las zonas de velocidad, es decir, cada segmento generalmente tendría 1 velocidad asociada por lado, o más de uno.
De todos modos, esta es mi sugerencia, aunque depende de que tengas un nivel de licencia que permita un búfer unilateral (avanzado / ArcInfo, creo). Un principio similar podría aplicarse con herramientas básicas, pero sería más complejo. Además, espero que esto tarde un tiempo en ejecutarse ...
import arcpy
def TakeOutTrash(dataset):
if arcpy.Exists(dataset):
arcpy.management.Delete(dataset)
roads = "path/to/roads" #make sure it's in a projected crs with meter units
buff_right = "path/to/new/buffer/feature/class1" #new gdb feature class
buff_left = "path/to/new/buffer/feature/class2" #new gdb feature class
arcpy.analysis.Buffer(roads,buff_right,6,"RIGHT","FLAT")
arcpy.analysis.Buffer(roads,buff_left,6,"LEFT","FLAT")
Ahora tiene amortiguadores para cada lado de cada carretera, que están a 6 metros de la línea central, que deben cubrir todas las señales. Puede hacer una selección fácil por ubicación para asegurarse de que este sea el caso, y si no, vuelva a ejecutar las operaciones de búfer con 1 o 2 metros adicionales.
Próximo:
final_dict = {}
buffers = [buff_right, buff_left]
for i, buffer in enumerate(buffers):
rows1 = arcpy.SearchCursor(buffer)
for row1 in rows1:
final_dict[seg] = [[],[]]
seg = str(row1.getValue("seg_num"))
TakeOutTrash("fl")
fl = arcpy.management.MakeFeatureLayer(buffer,"fl",'"seg_num" = ' + seg)
arpcpy.management.SelectLayerByLocation(signs,"INTERSECT",fl)
rows2 = arcpy.SearchCursor(signs)
for row2 in rows2:
final_dict[seg][i].append(row2.getValue("posted_speed"))
Entonces ahora tienes un diccionario en este formato:
"seg_num":[[list of speeds on the right],[list of speeds on the left]]
desde el cual puedes hacer lo que quieras, por ejemplo:
for k,v in final_dict.iteritems():
print "road segment {0}:".format(str(k))
print " speeds on right: {0}".format(", ".join(v[0]))
print " speeds on left: {0}".format(", ".join(v[1]))
O simplemente pruebe cuántas velocidades hay a cada lado del segmento, o escríbalas en los campos de la clase de entidad de carreteras original, etc. Una vez más, no estoy seguro si esta podría ser una solución final con los datos que tiene, pero podría Ciertamente funciona como parte de ello. Pude ver que se usa junto con el proceso de ajuste / división descrito anteriormente.
Para escribir en la capa de carreteras, puede crear dos campos nuevos, SPD_RIGHT y SPD_LEFT, y por ahora (a menos que sepa con certeza que solo hay una velocidad por segmento), haga que sean campos de texto. Entonces:
urows = arcpy.UpdateCursor(roads)
for row in urows:
seg = row.getValue("seg_num")
right_speeds = ", ".join(final_dict[seg][0])
left_speeds = ", ".join(final_dict[seg][1])
row.setValue("SPD_RIGHT",right_speeds)
row.setValue("SPD_LEFT",left_speeds)
urows.updateRows(row)
Por supuesto, es ideal tener solo una velocidad por segmento, pero eso se remonta a la pregunta original de cómo se dividen los segmentos actualmente.