Não tenho representante suficiente para comentar, mas minha pergunta é se as estradas já estão ou não em segmentos que correspondem às zonas de velocidade, ou seja, cada segmento geralmente teria 1 velocidade associada a ela por lado ou mais de uma.
Independentemente disso, aqui está minha sugestão, apesar de depender de você ter um nível de licença que permita um buffer unilateral (avançado / ArcInfo, acredito). Um princípio semelhante poderia ser aplicado com ferramentas básicas, mas seria mais complexo. Além disso, espero que isso demore um pouco para ser executado ...
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")
Agora você tem amortecedores para cada lado de cada estrada, a 6 metros da linha central, que deve cobrir todos os sinais. Você pode fazer uma seleção fácil por local para garantir que esse seja o caso e, caso contrário, execute novamente as operações do buffer com 1 ou 2 metros extras.
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"))
Então agora você tem um dicionário neste formato:
"seg_num":[[list of speeds on the right],[list of speeds on the left]]
a partir do qual você pode fazer o que quiser, por exemplo:
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]))
Ou teste apenas quantas velocidades existem em cada lado do segmento ou escreva nos campos da classe de estrada original, etc. Novamente, não tenho certeza se essa poderia ser uma solução final com os dados que você possui, mas poderia certamente funciona como parte disso. Eu pude vê-lo sendo usado em conjunto com o processo de encaixe / divisão descrito acima.
Para gravar na camada de estradas, você pode criar dois novos campos, SPD_RIGHT e SPD_LEFT, e por enquanto (a menos que você saiba com certeza que existe apenas uma velocidade por segmento), faça campos de texto. Então:
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)
Obviamente, é ideal ter apenas uma velocidade por segmento, mas isso remonta à questão original de como os segmentos estão divididos atualmente.