Puffer nur in einer bestimmten Richtung mit ArcGIS for Desktop erstellen? [geschlossen]

9

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

Kennt jemand einen besseren Weg?

Das ist mehr oder weniger das, was ich anstrebe:

Geben Sie hier die Bildbeschreibung ein

Nutzername
quelle
1
Sind Ihre Polygone alle Rechtecke und Quadrate?
Aaron
Nein, leider nicht. Sie kommen in verschiedenen Formen
Benutzername
Dies ist eine wichtige Klarstellung, die Sie in Ihre Frage einarbeiten können.
PolyGeo

Antworten:

8

Wenn Sie arcpyein wenig in Python arbeiten können , können Sie diese Zonen mithilfe eines Skripts in eine bestimmte Richtung 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" # must be polygons
objects = "objects_lyr.shp"
arcpy.MakeFeatureLayer_management(objects_input, objects)

# OUTPUTS, most temporal
result = "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")

# Parameters
distance = 300 # distance for move in direction
direction = 90 # direction in degrees (90 is from north to south)
index = 0

# Set UpdateCursor
cur_objects = arcpy.da.UpdateCursor(objects, ("FID"))
for row_objects in cur_objects:
    try:
        fid = row_objects[0]
        sql = '"FID" = ' + str(index)
        index += 1

        # Initialize lists
        lines_list = []
        lines_created = []

        # Select current feature
        arcpy.SelectLayerByAttribute_management(objects, "NEW_SELECTION", sql)
        vertexes = "in_memory" + "\\" + "vertexes"

        # Convert object to vertexes
        arcpy.FeatureVerticesToPoints_management(objects, vertexes, "ALL")
        index_vertex = 0

        # Set SearchCursor for vertexes
        cur_vertexes = arcpy.da.SearchCursor(vertexes, ("SHAPE@XY"))
        for row_vertexes in cur_vertexes:
            vertex_coords_x = row_vertexes[0][0]
            vertex_coords_y = row_vertexes[0][1]

            # Define points coordinates
            point_move_x = vertex_coords_x - (distance) * math.cos(math.radians(direction))
            point_move_y = vertex_coords_y - (distance) * math.cos(math.radians(90 - direction))

            # Make list of points
            new_line = ([[vertex_coords_x, vertex_coords_y], [point_move_x, point_move_y]])
            lines_list.append(new_line)

            # From second cycle
            if 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_ends)
            start_line = [vertex_coords_x, vertex_coords_y]
            end_line = [point_move_x, point_move_y]
            index_vertex = index_vertex + 1

        # Cycle that makes polylines from points
        for lines_step in lines_list:
            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)

        # Final editing
        arcpy.Erase_analysis(polygon_dissolve, objects, result_erase)
        arcpy.Append_management(result_erase, result, "NO_TEST")
        arcpy.Delete_management("in_memory")
        arcpy.Delete_management(vertexes)
        start_line = []

        # Clear selection, memory and deleting temps
        arcpy.SelectLayerByAttribute_management(objects, "CLEAR_SELECTION")
        print "Object number: " + str(index - 1) + " -- done."
        gc.collect()


    # Catch errors
    except Exception as e:
        pass
        print "Error:"
        print e
        print "\n"
        index += 1

Ich hoffe du kannst es gut lesen, ich musste Kommentare und Variablen übersetzen.

david_p
quelle
Danke für das Drehbuch. Ich weiß eigentlich nichts über Python, aber ich habe Ihr Skript kopiert und den Arbeitsbereich und die Objektnamen sowie die Entfernung geändert. Die Feature-Classes werden erstellt, aber anscheinend habe ich einen Fehler gemacht, weil es einen Fehler für jede Operation "Ebene nach Attribut auswählen" gibt
Benutzername
Ich habe einige Änderungen am Skript vorgenommen. Sie können es jetzt versuchen.
Stellen
Vielen vielen Dank! Das gibt mir genau das Ergebnis, auf das ich gehofft habe. Anfangs hat es nicht funktioniert, weil im letzten Block des Skripts einige Klammern fehlten, aber ansonsten ist es perfekt. Ich glaube nicht, dass ich das gesamte Skript in einem Kommentar veröffentlichen kann, aber ich werde es unten veröffentlichen. Danke noch einmal!
Benutzername
Gern geschehen :) Ich bin froh, dass ich Ihnen helfen kann!
David_p
5

Dies ist das Skript, das das Problem löst. Dank und vielen Dank geht an david_p, der es geschrieben hat. Ich habe gerade 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" # must be polygons 
objects = "objects_lyr.shp" 
arcpy.MakeFeatureLayer_management(objects_input, objects)

# OUTPUTS, most temporal 
result = "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")

# Parameters 
distance = 300 # distance for move in direction 
direction = 90 # direction in degrees (90 is from north to south) 
index = 0

# Set UpdateCursor
cur_objects = arcpy.da.UpdateCursor(objects, ("FID"))
for row_objects in cur_objects:
    try:
        fid = row_objects[0]
        sql = '"FID" = ' + str(index)
        index += 1

        # Initialize lists
        lines_list = []
        lines_created = []

        # Select current feature
        arcpy.SelectLayerByAttribute_management(objects, "NEW_SELECTION", sql)
        vertexes = "in_memory" + "\\" + "vertexes"

        # Convert object to vertexes
        arcpy.FeatureVerticesToPoints_management(objects, vertexes, "ALL")
        index_vertex = 0

        # Set SearchCursor for vertexes
        cur_vertexes = arcpy.da.SearchCursor(vertexes, ("SHAPE@XY"))
        for row_vertexes in cur_vertexes:
            vertex_coords_x = row_vertexes[0][0]
            vertex_coords_y = row_vertexes[0][1]

            # Define points coordinates
            point_move_x = vertex_coords_x - (distance) * math.cos(math.radians(direction))
            point_move_y = vertex_coords_y - (distance) * math.cos(math.radians(90 - direction))

            # Make list of points
            new_line = ([[vertex_coords_x, vertex_coords_y], [point_move_x, point_move_y]])
            lines_list.append(new_line)

            # From second cycle
            if 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_ends)
            start_line = [vertex_coords_x, vertex_coords_y]
            end_line = [point_move_x, point_move_y]
            index_vertex = index_vertex + 1

        # Cycle that makes polylines from points
        for lines_step in lines_list:
            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)

        # Final editing
        arcpy.Erase_analysis(polygon_dissolve, objects, result_erase)
        arcpy.Append_management(result_erase, result, "NO_TEST")
        arcpy.Delete_management("in_memory")
        arcpy.Delete_management(vertexes)
        start_line = []

        # Clear selection, memory and deleting temps
        arcpy.SelectLayerByAttribute_management(objects, "CLEAR_SELECTION")
        print ("Object number: " + str(index - 1) + " -- done.")
        gc.collect()


    # Catch errors
    except Exception as e:
        pass
        print ("Error:")
        print (e)
        print ("\n")
        index += 1
Nutzername
quelle
0

Option A:

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

Option B:

  1. Erstellen Sie den Puffer mit dem Pufferwerkzeug
  2. Aktivieren Sie die Bearbeitung und wählen Sie alle Features in der Puffer-Feature-Class aus
  3. Verwenden Sie das Werkzeug 'Verschieben', füllen Sie die X- und Y-Offests im Fenster und speichern Sie die Ausgabe
addcolor
quelle
Mit "Verschieben" meinen Sie das Umschaltwerkzeug? Ich bin mir jedenfalls nicht sicher, ob dies mir das Ergebnis bringt, das ich brauche. Alle Polygone in meiner Feature-Class haben unterschiedliche Formen, sodass ich nicht alle Puffer-Features auf dieselbe Weise verschieben kann, da dies zu unterschiedlichen Abständen von den ursprünglichen Features führen würde.
Benutzername