Mehr

Erstellen eines Puffers nur in einer bestimmten Richtung mit ArcGIS for Desktop?

Erstellen eines Puffers nur in einer bestimmten Richtung mit ArcGIS for Desktop?


Ich versuche, einen Puffer für mehrere Polygone in südwestlicher Ausrichtung zu erstellen. Soweit mir bekannt ist, ist dies mit dem Pufferwerkzeug (ich verwende ArcGIS 10.3) nicht möglich. Ich könnte es manuell tun, aber für mehr als 400 Polygone würde es viel zu lange dauern.

Kennt jemand einen besseren Weg?

Das ist mehr oder weniger mein Ziel:


Wenn du damit arbeiten kannstarcpyin Python ein wenig, dann könnten Sie ein Skript verwenden, um diese Zonen in eine bestimmte Richtung zu generieren. Ich habe vor ein paar Wochen einige ähnliche gemacht, ich werde einen Teil meines Skripts veröffentlichen, um Ihnen zu helfen.

import arcpy, math, gc # Workspace, overwrite arcpy.env.workspace = r"YOUR_WORKSPACE" arcpy.env.overwriteOutput = True # INPUTS objects_input = "objects.shp" # muss Polygone sein objects = "objects_lyr.shp" arcpy.MakeFeatureLayer_management (objects_input, objects) # AUSGÄNGE, zeitlichstes Ergebnis = "result.shp" result_erase = "in_memory" + "" + "result_erase" polygon = "in_memory" + "" + "polygon" polygon_dissolve = "in_memory" + "" + "polygon_dissolve" arcpy.CreateFeatureclass_management(arcpy.env.workspace, result, "POLYGON") # Parameter distance = 300 # Distanz für Bewegung in Richtung direction = 90 # Richtung in Grad (90 ist von Nord nach Süd ) index = 0 # Setze UpdateCursor cur_objects = arcpy.da.UpdateCursor(objects, ("FID")) für row_objects in cur_objects: try: fid = row_objects[0] sql = '"FID" = ' + str(index) index += 1 # Listen initialisieren lines_list = [] lines_created = [] # Aktuelles Feature auswählen arcpy.SelectLayerByAttribute_management(objects, "NEW_SELECTION", sql) vert exes = "in_memory" + "" + "vertexes" # Konvertieren von Objekten in Vertexes arcpy.FeatureVerticesToPoints_management(objects, vertexes, "ALL") index_vertex = 0 # Setze SearchCursor für Vertexe cur_vertexes = arcpy.da.SearchCursor(Vertexe, ( "[email protected]")) für row_vertexes in cur_vertexes: vertex_coords_x = row_vertexes[0][0] vertex_coords_y = row_vertexes[0][1] # Definiere Punktkoordinaten point_move_x = vertex_coords_x - (Abstand) * math.cos(math.radians( Richtung)) point_move_y = vertex_coords_y - (Entfernung) * math.cos(math.radians(90 - Richtung)) # Liste der Punkte erstellen new_line = ([[vertex_coords_x, vertex_coords_y], [point_move_x, point_move_y]]) lines_list.append( new_line) # Ab dem zweiten Zyklus, wenn index_vertex > 0: lines_vertexes = ([[vertex_coords_x, vertex_coords_y], start_line]) lines_ends = ([[point_move_x, point_move_y], end_line]) lines_list.append(lines_vertexes) lines_list.append(lines_list.append) = [vertex_coords_x, vertex_coords_y] end_line = [point_move_x, point_move_y] index_v ertex = index_vertex + 1 # Zyklus, der Polylinien aus Punkten für lines_step in lines_list macht: lines_created.append(arcpy.Polyline(arcpy.Array([arcpy.Point(*sour) for sour in lines_step]))) arcpy.FeatureToPolygon_management(lines_created , polygon) arcpy.AggregatePolygons_cartography(polygon, polygon_dissolve, 1) # Endbearbeitung arcpy.Erase_analysis(polygon_dissolve, objects, result_erase) arcpy.Append_management(result_erase, result, "NO_TEST") arcpy.Delete_management("in_memory") arcpy(.Delete_management Scheitelpunkte) start_line = [] # Auswahl löschen, Speicher löschen und Temps löschen arcpy.SelectLayerByAttribute_management(objects, "CLEAR_SELECTION") print "Objektnummer: " + str(index - 1) + " -- done." gc.collect() # Fehler abfangen außer Ausnahme als e: pass print "Error:" print e print "
" index += 1

Ich hoffe ihr könnt es gut lesen, ich musste Kommentare und Variablen übersetzen.


Dies ist das Skript, das das Problem löst. Kredit und vielen Dank gehen an david_p, der es geschrieben hat. Ich habe nur ein paar fehlende Klammern hinzugefügt.

import arcpy, math, gc # Workspace, overwrite arcpy.env.workspace = r"YOUR_WORKSPACE" arcpy.env.overwriteOutput = True # INPUTS objects_input = "objects.shp" # muss Polygone sein objects = "objects_lyr.shp" arcpy.MakeFeatureLayer_management (objects_input, objects) # AUSGÄNGE, zeitlichstes Ergebnis = "result.shp" result_erase = "in_memory" + "" + "result_erase" polygon = "in_memory" + "" + "polygon" polygon_dissolve = "in_memory" + "" + "polygon_dissolve" arcpy.CreateFeatureclass_management(arcpy.env.workspace, result, "POLYGON") # Parameter distance = 300 # Distanz für Bewegung in Richtung direction = 90 # Richtung in Grad (90 ist von Nord nach Süd ) index = 0 # Setze UpdateCursor cur_objects = arcpy.da.UpdateCursor(objects, ("FID")) für row_objects in cur_objects: try: fid = row_objects[0] sql = '"FID" = ' + str(index) index += 1 # Listen initialisieren lines_list = [] lines_created = [] # Aktuelles Feature auswählen arcpy.SelectLayerByAttribute_management(objects, "NEW_SELECTION", sql) vert exes = "in_memory" + "" + "vertexes" # Konvertieren von Objekten in Vertexes arcpy.FeatureVerticesToPoints_management(objects, vertexes, "ALL") index_vertex = 0 # Setze SearchCursor für Vertexe cur_vertexes = arcpy.da.SearchCursor(Vertexe, ( "[email protected]")) für row_vertexes in cur_vertexes: vertex_coords_x = row_vertexes[0][0] vertex_coords_y = row_vertexes[0][1] # Definiere Punktkoordinaten point_move_x = vertex_coords_x - (Entfernung) * math.cos(math.radians( Richtung)) point_move_y = vertex_coords_y - (Entfernung) * math.cos(math.radians(90 - Richtung)) # Liste der Punkte erstellen new_line = ([[vertex_coords_x, vertex_coords_y], [point_move_x, point_move_y]]) lines_list.append( new_line) # Ab dem zweiten Zyklus, wenn index_vertex > 0: lines_vertexes = ([[vertex_coords_x, vertex_coords_y], start_line]) lines_ends = ([[point_move_x, point_move_y], end_line]) lines_list.append(lines_vertexes) lines_list.append(lines_list.append) = [vertex_coords_x, vertex_coords_y] end_line = [point_move_x, point_move_y] index_v ertex = index_vertex + 1 # Zyklus, der Polylinien aus Punkten für lines_step in lines_list macht: lines_created.append(arcpy.Polyline(arcpy.Array([arcpy.Point(*sour) for sour in lines_step]))) arcpy.FeatureToPolygon_management(lines_created , polygon) arcpy.AggregatePolygons_cartography(polygon, polygon_dissolve, 1) # Endbearbeitung arcpy.Erase_analysis(polygon_dissolve, objects, result_erase) arcpy.Append_management(result_erase, result, "NO_TEST") arcpy.Delete_management("in_memory") arcpy(.Delete_management Scheitelpunkte) start_line = [] # Auswahl löschen, Speicher löschen und Temps löschen arcpy.SelectLayerByAttribute_management(objects, "CLEAR_SELECTION") print ("Objektnummer: " + str(index - 1) + " -- done.") gc.collect( ) # Fehler abfangen außer Exception als e: pass print ("Error:") print (e) print ("
") index += 1

Option A:

  1. Erstellen Sie den Puffer mit dem Pufferwerkzeug
  2. Wählen Sie alle Features in der Buffer-Feature-Class aus
  3. Verwenden Sie das Warping-Tool und bestimmen Sie einige wichtige Ecken und führen Sie das Warping durch

Variante B:

  1. Erstellen Sie den Puffer mit dem Pufferwerkzeug
  2. Aktivieren Sie die Bearbeitung und wählen Sie alle Features in der Buffer-Feature-Class aus
  3. Verwenden Sie das Werkzeug "Verschieben", füllen Sie die X- und Y-Offfests im Fenster aus und speichern Sie die Ausgabe.

Schau das Video: ArcGIS Buffer