Je n'ai pas assez de représentants pour commenter, mais ma question est de savoir si les routes sont déjà dans des segments qui correspondent aux zones de vitesse, c'est-à-dire que chaque segment aurait généralement une vitesse associée à chaque côté, ou plus d'une.
Quoi qu'il en soit, voici ma suggestion, bien qu'elle dépende du fait que vous ayez un niveau de licence qui permettrait un tampon unilatéral (avancé / ArcInfo, je crois). Un principe similaire pourrait être appliqué avec des outils de base, mais serait plus complexe. De plus, je m'attends à ce que cela prenne un certain temps à fonctionner ...
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")
Vous disposez maintenant de tampons de chaque côté de chaque route, à 6 mètres de la ligne médiane, qui devraient couvrir tous les panneaux. Vous pouvez faire une sélection facile par emplacement pour vous assurer que c'est le cas, et sinon, réexécuter les opérations de tampon avec 1 ou 2 mètres supplémentaires.
Prochain:
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"))
Alors maintenant, vous avez un dictionnaire dans ce format:
"seg_num":[[list of speeds on the right],[list of speeds on the left]]
à partir de laquelle vous pouvez faire ce que vous voulez, par exemple:
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 testez simplement le nombre de vitesses de chaque côté du segment, ou écrivez-le dans les champs de la classe d'entités routes d'origine, etc. Encore une fois, vous ne savez pas si cela pourrait être une solution finale avec les données dont vous disposez, mais cela pourrait certainement travailler dans le cadre de celui-ci. Je pouvais voir qu'il était utilisé en conjonction avec le processus de capture / division décrit ci-dessus.
Pour écrire dans la couche routes, vous pouvez créer deux nouveaux champs, SPD_RIGHT et SPD_LEFT, et pour l'instant (sauf si vous savez avec certitude qu'il n'y a qu'une seule vitesse par segment), faites-en des champs de texte. Alors:
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)
Bien sûr, il est idéal de n'avoir qu'une seule vitesse par segment, mais cela revient à la question initiale de savoir comment les segments sont actuellement divisés.