Создание буфера только в определенном направлении с использованием ArcGIS for Desktop? [закрыто]

9

Я пытаюсь создать буфер для нескольких полигонов в юго-западной ориентации. Насколько я знаю, это невозможно с помощью инструмента буфера (я использую ArcGIS 10.3). Я мог бы сделать это вручную, но для 400+ полигонов это заняло бы слишком много времени.

Кто-нибудь знает лучший способ?

Это более или менее то, к чему я стремлюсь:

введите описание изображения здесь

имя пользователя
источник
1
Ваши полигоны - это все прямоугольники и квадраты?
Аарон
Нет, к сожалению нет. Они бывают разных форм
Имя пользователя
Это важное разъяснение для вас, чтобы отредактировать свой вопрос.
PolyGeo

Ответы:

8

Если вы можете arcpyнемного поработать с Python, то вы можете использовать какой-нибудь скрипт для генерации этих зон в определенном направлении. Я сделал несколько похожих недель назад, я опубликую часть моего сценария, чтобы помочь вам.

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

Я надеюсь, что вы можете прочитать это хорошо, мне пришлось переводить комментарии и переменные.

david_p
источник
Спасибо за сценарий. Я ничего не знаю о Python, но я скопировал ваш скрипт и изменил имена Workspace и Object, а также расстояние. Классы объектов созданы, но, по-видимому, я допустил ошибку, потому что есть ошибка для каждой операции «выбор слоя по атрибуту»
Имя пользователя,
Я сделал некоторые изменения в скрипте, вы можете попробовать это сейчас. Установите рабочее пространство и свой шейп-файл, и мы увидим :)
david_p
Огромное спасибо! Это дает мне именно тот результат, на который я надеялся. Сначала это не сработало, потому что в последнем блоке скрипта отсутствовали скобки, но, кроме того, он идеален. Я не думаю, что смогу опубликовать весь сценарий в комментарии, но я опубликую его ниже. Еще раз спасибо!
Имя пользователя
Добро пожаловать :) Я рад, что могу вам помочь!
david_p
5

Это сценарий, который решает проблему. Благодарность и большое спасибо идут к david_p, который написал это. Я просто добавил несколько пропущенных скобок.

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

Вариант А:

  1. Создайте буфер, используя инструмент буфера
  2. Выберите все функции в классе объектов Buffer
  3. Используйте инструмент деформирования, обозначьте некоторые важные углы и выполните деформацию

Вариант Б:

  1. Создайте буфер, используя инструмент буфера
  2. Включить редактирование и выбрать все объекты в классе объектов Buffer
  3. Используйте инструмент «Перемещение», заполните X и Y в окне и сохраните результат
addcolor
источник
Под «перемещением» вы подразумеваете инструмент Shift? Во всяком случае, я не уверен, даст ли это мне результат, который мне нужен. Все полигоны в моем классе пространственных объектов имеют разные формы, поэтому я не могу переместить все буферные объекты одинаково, так как это приведет к разным расстояниям от начальных объектов.
Имя пользователя