ArcGIS 10: Erstellen Sie eine lineare Ereignisebene aus einer Punktebene basierend auf der Richtwirkung

8

Ich habe eine Punktebene, die die Geschwindigkeitsbegrenzungen widerspiegelt, und eine Linienebene der Straßen. Die Position des Geschwindigkeitszeichens gibt an, in welche Richtung die Geschwindigkeitsbegrenzung gilt.

Wie kann ich eine lineare Ereignistabelle über der Straßenebene erstellen, die die Geschwindigkeiten widerspiegelt? Geben Sie also für jedes Segment zwei Geschwindigkeitsattribute zurück, eines für jede Richtung.

Geschwindigkeits- / Straßenschicht

dassouki
quelle
Können Sie klarstellen, "Die Position des Geschwindigkeitszeichens gibt an, in welche Richtung das Tempolimit gilt"? Bedeutet dies, dass, wenn sich der Punkt auf der rechten Straßenseite befindet (basierend auf der Richtung der Straße), die Geschwindigkeit auf die rechte Fahrspur angewendet wird? Wie nahe an der Straße befindet sich der Punkt?
Stephen Lead
@StephenLead Ja, der Vorzeichenpunkt befindet sich 1 bis 5 m von der Linienschicht entfernt, um anzuzeigen, in welche Richtung die Geschwindigkeit gilt
dassouki
Sind andere Attribute mit den Verkehrszeichen gespeichert? Klingt so, als müssten Sie sie zuerst an den Straßen ausrichten und dann irgendwie die Richtung der Straße auf die Verkehrszeichen übertragen, dann Linien durch die Eckpunkte schneiden und Attributwerte von den Zeichen auf jedes Segment übertragen. Nur eine Idee. Könnte helfen, wenn Sie die Daten gepostet haben.
Jakub Sisak GeoGraphics
@Jakub Das einzige Attribut, das ich vom Verkehrsschild haben möchte, ist "posted_speed". Die Zeichenschicht hat keine Informationen über die Direktionalität
dassouki
Haben die Seufzer neben der Geschwindigkeit noch andere Eigenschaften? Ich frage, weil es etwas geben könnte, das die Schilder mit den Straßen verbinden kann. Andernfalls ist das, was Sie tun möchten, nicht möglich, ohne die Schilder manuell auf die Straßensegmente zu schnappen, Attribute zu übertragen und die Straßensegmente aufzuteilen. (Sie können dies programmgesteuert tun, aber die Entfernungen sind variabel, sodass eine vollständige Automatisierung möglicherweise nicht möglich ist.) Das Ergebnis ist keine eigenständige Tabelle, sondern eine Attributtabelle, an die alle diese Informationen übertragen werden.
Jakub Sisak GeoGraphics

Antworten:

3

Für lineare Routenereignisebenen müssen Sie eine Tabelle erstellen, die die ID der Route sowie die Start- und End-m-Werte enthält.

Wenn Ihre Straßen keine m-Werte haben, können Sie Routen mit dem Werkzeug Routen erstellen erstellen .

Der zweite Schritt besteht darin, die m-Werte Ihrer Straßen für jeden Punkt zu extrahieren. Dies kann mit der Lokalisierungsfunktion entlang der Straße erfolgen . Wenn ich auf Ihrer Figur gut sehe, befinden sich die Punkte auf derselben Straßenseite, wenn sie sich in derselben Richtung befinden. Das ist großartig, weil Sie dann einen positiven oder negativen Abstand haben, der Ihnen sagt, auf welcher Seite Sie sich befinden.

Der einfachste Weg zum letzten Schritt ist in Microsoft Excel:

  • Sortieren Sie Ihre Punkte nach roadIDund nach dem Abstand zur Route
  • Fügen Sie eine neue Spalte mit der m-valuedes nächsten Punkts (oder des vorherigen Punkts, je nach Richtung) hinzu.
  • Am Ende fehlt ein Wert, der entweder mit 0 oder dem Maximum m-valuedes Segments gefüllt werden sollte .

BEARBEITEN: Nach dem Sortieren sieht Ihre Tabelle folgendermaßen aus

 pointID RoadID mvalue dist speed
 15      2      25     1    80
 25      2      30     1    50
 87      2      45     12   70
 etc

Sie sehen, dass die Punkte nach m-Werten sortiert sind. Die dritte Spalte in meinem Fall wäre der Beginn der Veranstaltung. Die neue Ereignisebene sollte ein fromund ein toFeld haben. In meinem Beispiel würde es also so aussehen:

pointID RoadID from to speed
15      2      25   30   80    
25      2      30   45   50    
87      2      45   max  70

in die andere Richtung wäre es

pointID RoadID from to speed    
15      2      0    25   80    
25      2      25   30   50    
87      2      30   45   70

Anschließend können Sie Ihre Ereignisebene mithilfe des Zeichens als Versatzfeld erstellen, um die Geschwindigkeitsbegrenzung auf der richtigen Seite der Routen zu lokalisieren.

Radouxju
quelle
Bisher funktioniert dies besser als die andere Lösung. Können Sie bitte den Excel-Teil über das Hinzufügen vorheriger und nächster Punkte weiter erläutern?
Dassouki
3

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.

mr.adam
quelle
Jetzt, da Sie Punkte zu kommentieren haben; Woher kommt die Geschwindigkeitsschicht? Habe ich Ihren Pufferbefehl falsch verstanden?
Dassouki
ok, ich habe der Antwort etwas mehr hinzugefügt. Ich hoffe ich verstehe was du suchst.
Mr.adam
Die Segmente und Geschwindigkeiten werden möglicherweise nicht auf dieselbe Weise aufgeteilt, wie die Daten von zwei verschiedenen Entitäten erfasst werden. Darüber hinaus kann ein Segment in beiden Richtungen unterschiedliche Geschwindigkeiten haben.
Dassouki
Ok, ich denke jetzt, dass der bessere Weg, dies zu tun, darin besteht, zuerst einen rechten Puffer (6 m oder so) zu erstellen und dann die Zeichen auszuwählen, die in diesen Bereich fallen, und sie in eine neue Punkt-Feature-Class zu extrahieren. Auf diese Weise können Sie eine Feature-Class für die Zeichen auf der rechten Seite und eine für die Zeichen auf der linken Seite haben.
Mr.adam
Jakubs Antwort in den Kommentaren ist ein guter Ausgangspunkt für die Definition guter Segmente und könnte durch meine ergänzt werden, um die Geschwindigkeiten mit der Fahrtrichtung zu verknüpfen.
Mr.adam