Tạo bộ đệm chỉ theo hướng cụ thể bằng ArcGIS cho Máy tính để bàn? [đóng cửa]


9

Tôi đang cố gắng tạo một bộ đệm cho một số đa giác theo hướng tây nam. Theo như tôi biết, điều này là không thể khi sử dụng công cụ đệm (tôi sử dụng ArcGIS 10.3). Tôi có thể làm điều đó bằng tay nhưng với hơn 400 đa giác thì sẽ mất quá nhiều thời gian.

Có ai biết một cách tốt hơn?

Đây là ít nhiều những gì tôi đang hướng tới:

nhập mô tả hình ảnh ở đây


1
Là đa giác của bạn tất cả các hình chữ nhật và hình vuông?
Aaron

Không, tiếc là không. Chúng có nhiều hình dạng khác nhau
Tên người dùng

Đó là một sự làm rõ quan trọng để bạn chỉnh sửa câu hỏi của bạn.
PolyGeo

Câu trả lời:


8

Nếu bạn có thể làm việc với arcpyPython một chút, thì bạn có thể sử dụng một số tập lệnh để tạo các vùng này theo hướng cụ thể. Tôi đã thực hiện một số tương tự vài tuần trước, tôi sẽ đăng một phần kịch bản của tôi để giúp bạn.

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

Tôi hy vọng bạn có thể đọc nó tốt, tôi đã phải dịch các bình luận và các biến.


Cảm ơn bạn cho kịch bản. Tôi thực sự không biết gì về Python nhưng tôi đã sao chép tập lệnh của bạn và thay đổi tên Workspace và Object cũng như khoảng cách. Các lớp tính năng được tạo, nhưng rõ ràng tôi đã mắc lỗi vì có lỗi cho mỗi thao tác "chọn lớp theo thuộc tính"
Tên người dùng

Tôi đã thực hiện một số thay đổi trong kịch bản, bạn có thể thử ngay bây giờ. Đặt không gian làm việc và shapefile của bạn và chúng ta sẽ thấy :)
david_p

Cảm ơn bạn rât nhiêu! Điều đó mang lại cho tôi chính xác kết quả mà tôi đã hy vọng. Ban đầu nó không hoạt động vì có một số dấu ngoặc đơn bị thiếu trong khối cuối cùng của tập lệnh nhưng bên cạnh đó nó hoàn hảo. Tôi không nghĩ rằng tôi có thể đăng toàn bộ kịch bản trong một bình luận nhưng tôi sẽ đăng nó bên dưới. Cảm ơn một lần nữa!
Tên người dùng

Bạn được chào đón :) Tôi rất vui vì tôi có thể giúp bạn!
david_p

5

Đây là kịch bản giải quyết vấn đề. Tín dụng và cảm ơn rất nhiều đến david_p người đã viết nó. Tôi chỉ thêm một vài dấu ngoặc đơn bị thiếu.

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

Tùy chọn A:

  1. Tạo bộ đệm bằng công cụ đệm
  2. Chọn tất cả các tính năng trong lớp tính năng Bộ đệm
  3. Sử dụng công cụ cong vênh và chỉ định một số góc quan trọng và thực hiện cong vênh

Tùy chọn B:

  1. Tạo bộ đệm bằng công cụ đệm
  2. Bật chỉnh sửa và chọn tất cả các tính năng trong lớp tính năng Bộ đệm
  3. Sử dụng công cụ 'Move', điền vào các dấu hiệu X và Y trong cửa sổ và lưu kết quả đầu ra

"Di chuyển" có nghĩa là công cụ Shift? Dù sao, tôi không chắc chắn nếu điều này sẽ cho tôi kết quả tôi cần. Tất cả các đa giác trong lớp đối tượng của tôi có các hình dạng khác nhau vì vậy tôi không thể di chuyển tất cả các tính năng bộ đệm theo cùng một cách vì điều này sẽ dẫn đến khoảng cách khác với các tính năng ban đầu.
Tên người dùng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.