การสร้างบัฟเฟอร์ในทิศทางที่กำหนดโดยใช้ ArcGIS for Desktop เท่านั้น? [ปิด]


9

ฉันพยายามสร้างบัฟเฟอร์สำหรับรูปหลายเหลี่ยมหลายรูปแบบในแนวตะวันตกเฉียงใต้ เท่าที่ฉันรู้สิ่งนี้เป็นไปไม่ได้โดยใช้เครื่องมือบัฟเฟอร์ (ฉันใช้ ArcGIS 10.3) ฉันสามารถทำได้ด้วยตนเอง แต่สำหรับรูปหลายเหลี่ยมมากกว่า 400 รูปอาจใช้เวลานานเกินไป

ไม่มีใครรู้วิธีที่ดีกว่า?

นี่คือสิ่งที่ฉันตั้งใจจะทำมากหรือน้อย:

ป้อนคำอธิบายรูปภาพที่นี่


1
รูปหลายเหลี่ยมของคุณเป็นรูปสี่เหลี่ยมผืนผ้าและสี่เหลี่ยมทั้งหมดหรือไม่
แอรอน

ไม่น่าเสียดายไม่ใช่ พวกเขามีรูปร่างแตกต่างกัน
ชื่อผู้ใช้

นั่นเป็นคำชี้แจงที่สำคัญสำหรับคุณที่จะแก้ไขคำถามของคุณ
PolyGeo

คำตอบ:


8

หากคุณสามารถทำงานกับarcpyPython ได้เล็กน้อยคุณสามารถใช้สคริปต์เพื่อสร้างโซนเหล่านี้ในทิศทางที่เฉพาะเจาะจง ฉันทำคล้ายไม่กี่สัปดาห์ที่ผ่านมาฉันจะโพสต์ส่วนหนึ่งของสคริปต์ของฉันเพื่อช่วยคุณ

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

ฉันหวังว่าคุณสามารถอ่านได้ดีฉันต้องแปลความคิดเห็นและตัวแปร


ขอบคุณสำหรับสคริปต์ ฉันไม่รู้อะไรเลยเกี่ยวกับ Python แต่ฉันคัดลอกสคริปต์ของคุณและเปลี่ยนชื่อ Workspace และ Object รวมถึงระยะทาง คลาสของฟีเจอร์ถูกสร้างขึ้น แต่เห็นได้ชัดว่าฉันทำผิดเพราะมีข้อผิดพลาดสำหรับการดำเนินการ "เลือกเลเยอร์ตามคุณลักษณะ"
ชื่อผู้ใช้

ฉันได้ทำการเปลี่ยนแปลงบางอย่างในสคริปต์คุณสามารถลองได้ในตอนนี้ ตั้งค่าพื้นที่ทำงานและไฟล์
รูปร่าง

ขอบคุณมาก ๆ! นั่นให้ผลลัพธ์ตรงตามที่หวัง มันไม่ทำงานในตอนแรกเพราะมีวงเล็บบางส่วนขาดหายไปในบล็อกสุดท้ายของสคริปต์ แต่นอกจากนั้นมันสมบูรณ์แบบ ฉันไม่คิดว่าฉันสามารถโพสต์สคริปต์ทั้งหมดในความคิดเห็น แต่ฉันจะโพสต์ไว้ด้านล่าง ขอบคุณอีกครั้ง!
ชื่อผู้ใช้

ยินดีต้อนรับ :) ฉันดีใจที่ฉันสามารถช่วยคุณได้!
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.