Mehr

Methode zum Aufteilen von Liniensegmenten in einem Straßennetz mit einer Länge von mehr als X in n kleinere Liniensegmente mithilfe von ArcGIS?


Ich verwende ArcGIS Desktop 10.2 und möchte Straßen in einem Netzwerk, das eine bestimmte Länge überschreitet, in gleiche kleinere Teile aufteilen. Mir ist aufgefallen, dass die Aufteilung nach Prozent über das Editor-Menü erfolgen kann; es scheint jedoch, dass dies zeilenweise erfolgen muss.

Könnten Sie Möglichkeiten zur Automatisierung des Prozesses vorschlagen, alle Straßen über eine bestimmte Länge in kleinere Teile basierend auf dem Prozentsatz des Originals aufzuteilen?


Ein wenig Python-Automatisierung erledigt diese Aufgabe. Die grundlegenden Schritte:

  • Bestimmen Sie die maximale Entfernung in den Einheiten der Feature-Class mit Hilfe eines Raumbezugsobjekts (erfordert meiner Meinung nach projizierte Feature-Class)
  • Erstellen Sie eine neue, leere Feature-Class mit der Eingabe-Line-Feature-Class als Vorlage
  • Iterieren Sie die Eingabe-Feature-Class und überprüfen Sie ihre Linienlängen length
  • Wenn die Länge zu lang ist, teilen Sie die Linie kontinuierlich mit awährendSchleife,entlang der Linie positionieren, undTrennlinie am Punkt.
  • Sobald Zeilen kürzer als die maximale Länge sind, fügen Sie ein Zeilenobjekt zu einer Liste hinzu
  • Fügen Sie alle Zeilenobjekte mit einem Einfügecursor in eine neue Feature-Class ein

Eingänge:

inFc: Eingabe-Line-Feature-Class

outFc: Ausgabe-Feature-Class

dist: maximale Entfernung in Metern

Code:

#Vollständiger Pfad zur Eingabe-Line-Feature-Class inFc = r"C:Userse1b8DesktopE1B8WorkspaceWorkspace5.gdb	estLines_split" #Vollständiger Pfad zur Ausgabe-Line-Feature-Class outFc = r"C:Userse1b8 DesktopE1B8WorkspaceWorkspace5.gdb	estLines_split2" #Distanz (Meter) dist = 15 #------------ import arcpy import os #overwrite output (optional) arcpy.env.overwriteOutput = True print "Bestimmen von Raumbezugsinformationen" #Get Raumbezugsobjekt sr = arcpy.Describe (inFc).spatialReference #meters Conversion MeterPerUnit = sr.metersPerUnit #Distance in Feature-Class-Einheiten checkDistance = dist / meterPerUnit print "max distance:", checkDistance print " Ausgabe-Feature-Class erstellen" #Aus-Feature-Class erstellen outPath = os.path.dirname (outFc) outName = os.path.basename (outFc) arcpy.CreateFeatureclass_management (outPath, outName, "POLYLINE", inFc, Spatial_reference = sr) #set workspace arcpy.env.workspace = outPath #list withgeometrie field fields = ["[email protected]"] #Feature-Class-Felder zum Listenfeld hinzufügen ds += [f.name für f in arcpy.ListFields (inFc)] #Get objectid field name oidFld = arcpy.Describe (inFc).OIDFieldName #Entferne oid-Feld aus der Feldliste fields.remove (oidFld) #leere Liste zu haben Zeilen angehängt an Zeilen = [] print print "iterating", arcpy.GetCount_management (inFc).getOutput (0), "rows" i = 0 #cursor um die Feature-Class mit arcpy.da.SearchCursor (inFc, Felder) als Cursor zu iterieren : #Reihen für Reihe im Cursor iterieren: i += 1 #Geometrieobjektgeometrie abrufen = Reihe [0] #Länge abrufen = Geometrie.Länge #überprüfen, ob Länge länger als das Limit if length > checkDistance: print "row", i print "line length:", length #leere Liste für zu löschendes Zwischendatum Müll = [] #erzeuge leere Zeile fc für einzelnes Feature split = arcpy.CreateUniqueName ("split") outPath = os.path.dirname (split) outName = os.path.basename (split) arcpy.CreateFeatureclass_management (outPath, outName, "POLYLINE", inFc, Spatial_reference = sr) #Feature in neues fc einfügen mit arcpy.da.InsertCursor (Split, Felder) als cu r: cur.insertRow (row) del cur #neuen fc zu Müll hinzufügen += [split] #leeren Punkt fc für einzelnes Feature erstellen midPnt = arcpy.CreateUniqueName ("point") outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath, outName, "POINT", Spatial_reference = sr) #Mittelpunkt abrufen pnt = Geometrie.positionAlongLine (.5, True) #Punkt in neue Feature-Class mit arcpy einfügen. da.InsertCursor (midPnt, "[email protected]") as cur: cur.insertRow ((pnt,)) del cur #neuen fc in den Müll hinzufügen += [midPnt] #loop while length ist größer als limit while length > checkDistance: #Split line at (mid)point newSplit = arcpy.CreateUniqueName("split") Müll += [newSplit] arcpy.SplitLineAtPoint_management (split, midPnt, newSplit) #Neue Mittelpunkte erstellen midPnt = arcpy.CreateUniqueName ("point") Müll += [midPnt] outPath = os.path.dirname (midPnt) outName = os.path.basename (midPnt) arcpy.CreateFeatureclass_management (outPath, outName, "POINT", Spatial_reference = sr) #leere Liste für neue Punkte pnts = [] #Trennlinie iterieren und Mittelpunkte erhalten mit arcpy.da.SearchCursor (newSplit, "[email protected]") als cur: für geom, in cur: pnt = geom.positionAlongLine (.5 , True) pnts += [pnt] del cur #Hinzufügen von Mittelpunkten zur Mittelpunkt-Feature-Class mit arcpy.da.InsertCursor (midPnt, "[email protected]") als cur: für pnt in pnts: cur.insertRow ((pnt,)) del cur #divide length variabel durch zwei length = length / 2 print "line length:", length split = newSplit rows += [Zeile für Zeile in arcpy.da.SearchCursor (Split, Felder)] #Zwischendaten für Papierkorb aufräumen in Müll: arcpy.Delete_management (Papierkorb) else: rows += [row] #del Cursor Variable del Cursor print print "Zeilen in neue Feature-Class einfügen" #insert Cursor neue Feature-Class mit Zeilen mit arcpy.da.InsertCursor (outFc, Felder ) als Cursor: für Zeile in Zeilen: cursor.insertRow (row) del Cursor print print "created:", outFc print print "done"

Die Ausgabe sieht in etwa so aus:

Bestimmen der Raumbezugsinformationen max. Entfernung: 65,6166666667 Erstellen der Ausgabe-Feature-Class Iteration 11 Zeilen Zeile 4 Zeilenlänge: 90.6641581736 Zeilenlänge: 45.3320790868 Zeile 6 Zeilenlänge: 81.7030489448 Zeilenlänge: 40.8515244724 Zeile 7 Zeilenlänge: 82.7060163161 Zeilenlänge: 41.3530081581 Zeile 9 Zeilenlänge: 97.005780961 Zeilenlänge: 48.5028904805 Zeilenlänge 10: 90.6565601113 Zeilenlänge: 45.3282800557 Einfügen von Zeilen in neue Feature-Class erstellt: C:Userse1b8DesktopE1B8WorkspaceWorkspace5.gdb	estLines_split2 done

In der Feature-Class:

Out-Feature-Class:


Es entspricht nicht genau dem von Ihnen beschriebenen Prozess, aber ArcGIS bietet die Würfel Werkzeug, um lange Linien automatisch in Teile von X-Scheitelpunkten aufzuteilen. Es verwendet jedoch keine Prozentgrenze, sondern lediglich eine Scheitelpunktgrenze. Wenn Sie jedoch nur beabsichtigen, die Zeilen in ungefähr gleiche Größen aufzuteilen, kann dies nützlich sein:

http://resources.arcgis.com/EN/HELP/MAIN/10.2/index.html#//001700000037000000


Schau das Video: Stream Frequency Mapping in ArcGIS. Drainage Frequency. @GeoTech Studio (Oktober 2021).