Ich habe nicht genügend Wiederholungen, um einen Kommentar abzugeben, aber meine Frage ist, ob sich die Straßen bereits in Segmenten befinden, die den Geschwindigkeitszonen entsprechen, dh, jedem Segment ist im Allgemeinen 1 Geschwindigkeit pro Seite oder mehr als eine zugeordnet.
Unabhängig davon, hier ist mein Vorschlag, obwohl es davon abhängt, dass Sie über eine Lizenzstufe verfügen, die einen einseitigen Puffer zulässt (Advanced / ArcInfo, glaube ich). Ein ähnliches Prinzip könnte mit grundlegenden Werkzeugen angewendet werden, wäre jedoch komplexer. Ich gehe auch davon aus, dass dies eine Weile dauern wird ...
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")
Jetzt haben Sie Puffer für jede Seite jeder Straße, die 6 Meter von der Mittellinie entfernt sind und alle Schilder abdecken sollten. Sie können eine einfache Auswahl nach Standort vornehmen, um sicherzustellen, dass dies der Fall ist, und wenn nicht, die Pufferoperationen mit 1 oder 2 zusätzlichen Metern erneut ausführen.
Nächster:
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"))
Jetzt haben Sie ein Wörterbuch in diesem Format:
"seg_num":[[list of speeds on the right],[list of speeds on the left]]
von dem aus Sie tun können, was Sie wollen, zum Beispiel:
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]))
Oder testen Sie einfach, wie viele Geschwindigkeiten auf jeder Seite des Segments vorhanden sind, oder schreiben Sie sie in Felder in der ursprünglichen Straßen-Feature-Class usw. Auch hier sind Sie sich nicht sicher, ob dies eine endgültige Lösung für die Daten sein könnte, die Sie haben sicherlich als Teil davon arbeiten. Ich konnte sehen, dass es in Verbindung mit dem oben beschriebenen Fang- / Aufteilungsprozess verwendet wird.
Um in die Straßenebene zu schreiben, können Sie zwei neue Felder erstellen, SPD_RIGHT und SPD_LEFT, und vorerst (sofern Sie nicht sicher sind, dass es nur eine Geschwindigkeit pro Segment gibt) Textfelder erstellen. Dann:
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)
Natürlich ist es ideal, nur eine Geschwindigkeit pro Segment zu haben, aber das geht auf die ursprüngliche Frage zurück, wie die Segmente derzeit aufgeteilt sind.