Tworzenie bufora tylko w określonym kierunku za pomocą ArcGIS na komputery? [Zamknięte]


9

Próbuję utworzyć bufor dla kilku wielokątów w orientacji południowo-zachodniej. O ile mi wiadomo, nie jest to możliwe przy użyciu narzędzia buforującego (używam ArcGIS 10.3). Mógłbym to zrobić ręcznie, ale dla ponad 400 wielokątów zajęłoby to zdecydowanie zbyt dużo czasu.

Czy ktoś zna lepszy sposób?

To mniej więcej to, do czego dążę:

wprowadź opis zdjęcia tutaj


1
Czy twoje wielokąty to wszystkie prostokąty i kwadraty?
Aaron

Nie, niestety nie. Występują w różnych kształtach
użytkownika

To ważne wyjaśnienie, które możesz edytować w swoim pytaniu.
PolyGeo

Odpowiedzi:


8

Jeśli możesz arcpytrochę popracować w Pythonie, możesz użyć skryptu, aby wygenerować te strefy w określonym kierunku. Zrobiłem kilka podobnych kilka tygodni temu, opublikuję część mojego skryptu, aby ci pomóc.

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

Mam nadzieję, że umiesz to dobrze przeczytać, musiałem tłumaczyć komentarze i zmienne.


Dziękuję za scenariusz. Tak naprawdę nie wiem nic o Pythonie, ale skopiowałem twój skrypt i zmieniłem nazwy Workspace i Object oraz odległość. Klasy funkcji zostały utworzone, ale najwyraźniej popełniłem błąd, ponieważ występuje błąd dla każdej operacji „wybierz warstwę według atrybutu”
użytkownika

Wprowadziłem kilka zmian w skrypcie, możesz spróbować teraz. Ustaw obszar roboczy i swój
plik kształtu,

Dziękuje bardzo! To daje mi dokładnie taki wynik, na jaki liczyłem. Początkowo nie działało, ponieważ w ostatnim bloku skryptu brakowało nawiasów, ale poza tym jest idealny. Nie sądzę, że mogę opublikować cały skrypt w komentarzu, ale opublikuję go poniżej. Dzięki jeszcze raz!
Nazwa użytkownika

Nie ma za co :) Cieszę się, że mogę Ci pomóc!
david_p

5

To jest skrypt, który rozwiązuje problem. Podziękowania i podziękowania należą się Davidowi, który to napisał. Właśnie dodałem kilka brakujących nawiasów.

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

0

Opcja A:

  1. Utwórz bufor za pomocą narzędzia bufora
  2. Wybierz wszystkie funkcje w klasie obiektów Bufor
  3. Użyj narzędzia wypaczania i wyznacz kilka ważnych narożników i wykonaj wypaczenie

Opcja B:

  1. Utwórz bufor za pomocą narzędzia bufora
  2. Włącz edycję i wybierz wszystkie funkcje w klasie obiektów Bufor
  3. Użyj narzędzia „Przenieś”, wypełnij offsety X i Y w oknie i zapisz wynik

Przez „Przenieś” rozumiesz narzędzie Shift? W każdym razie nie jestem pewien, czy da mi to wynik, którego potrzebuję. Wszystkie wielokąty w mojej klasie cech mają różne kształty, więc nie mogę przenieść wszystkich cech bufora w taki sam sposób, ponieważ spowodowałoby to różne odległości od cech początkowych.
Nazwa użytkownika
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.