ArcGIS for Desktop을 사용하여 특정 방향으로 만 버퍼를 생성합니까? [닫은]


9

남서 방향으로 여러 다각형에 대한 버퍼를 만들려고합니다. 내가 아는 한 버퍼 도구를 사용하면 불가능합니다 (ArcGIS 10.3을 사용합니다). 수동으로 할 수는 있지만 약 400 + 다각형의 경우 너무 오래 걸립니다.

아무도 더 나은 방법을 알고 있습니까?

이것은 내가 목표로하는 것입니다.

여기에 이미지 설명을 입력하십시오


1
다각형이 모두 사각형과 사각형입니까?
Aaron

안타깝게도 아닙니다. 그들은 다른 모양으로 온다
사용자 이름

그것은 당신이 당신의 질문 을 편집 하는 중요한 설명입니다 .
PolyGeo

답변:


8

arcpy파이썬에서 약간의 작업을 할 수 있다면 , 스크립트를 사용하여 이러한 영역을 특정 방향으로 생성 할 수 있습니다. 몇 주 전에 비슷한 것을 만들었습니다. 스크립트의 일부를 게시하여 도와 드리겠습니다.

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

대단히 감사합니다! 그것은 내가 바랐던 결과를 정확하게 내게 준다. 스크립트의 마지막 블록에 일부 괄호가 없기 때문에 처음에는 작동하지 않았지만 완벽합니다. 의견에 전체 스크립트를 게시 할 수는 없지만 아래에 게시 할 것이라고 생각합니다. 다시 감사합니다!
사용자 이름

당신은 환영합니다 :) 나는 당신을 도울 수있어서 기쁩니다!
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

옵션 A :

  1. 버퍼 도구를 사용하여 버퍼 만들기
  2. 버퍼 피처 클래스의 모든 피처 선택
  3. 워핑 도구를 사용하고 중요한 코너를 지정하고 워핑을 수행하십시오.

옵션 B :

  1. 버퍼 도구를 사용하여 버퍼 만들기
  2. 버퍼 기능 클래스에서 편집 기능 사용 및 모든 기능 선택
  3. '이동'도구를 사용하여 창에서 X 및 Y 축제를 채우고 출력을 저장하십시오.

"이동"이란 Shift 도구를 의미합니까? 어쨌든 이것이 이것이 필요한 결과를 줄지 확신 할 수 없습니다. 피쳐 클래스의 모든 다각형은 다른 모양으로되어 있으므로 모든 버퍼 피쳐를 동일한 방식으로 이동할 수 없으므로 초기 피쳐와 다른 거리가됩니다.
사용자 이름
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.