Membuat buffer hanya dalam arah tertentu menggunakan ArcGIS untuk Desktop? [Tutup]


9

Saya mencoba membuat buffer untuk beberapa poligon dengan orientasi barat daya. Sejauh yang saya tahu, ini tidak mungkin menggunakan alat buffer (saya menggunakan ArcGIS 10.3). Saya bisa melakukannya secara manual tetapi untuk lebih dari 400 poligon akan memakan waktu terlalu lama.

Adakah yang tahu cara yang lebih baik?

Ini kurang lebih apa yang saya tuju:

masukkan deskripsi gambar di sini


1
Apakah poligon Anda semua persegi panjang dan bujur sangkar?
Aaron

Tidak, sayangnya tidak. Mereka datang dalam berbagai bentuk
Nama pengguna

Itu klarifikasi penting bagi Anda untuk mengedit pertanyaan Anda.
PolyGeo

Jawaban:


8

Jika Anda bisa bekerja sedikit dengan arcpyPython, maka Anda bisa menggunakan beberapa skrip untuk menghasilkan zona ini dalam arah tertentu. Saya membuat beberapa serupa beberapa minggu yang lalu, saya akan memposting bagian dari skrip saya untuk membantu Anda.

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

Saya harap Anda bisa membacanya dengan baik, saya harus menerjemahkan komentar dan variabel.


Terima kasih untuk skripnya. Saya tidak benar-benar tahu apa-apa tentang Python tetapi saya telah menyalin skrip Anda dan mengubah Workspace dan nama Object serta jaraknya. Kelas fitur dibuat, tetapi tampaknya saya telah membuat kesalahan karena ada kesalahan untuk setiap operasi "pilih lapisan menurut atribut"
Nama pengguna

Saya telah membuat beberapa perubahan pada skrip, Anda dapat mencobanya sekarang. Tetapkan ruang kerja dan shapefile Anda dan kita akan melihat :)
david_p

Terima kasih banyak! Itu memberi saya persis hasil yang saya harapkan. Awalnya tidak berfungsi karena ada beberapa tanda kurung yang hilang di blok terakhir skrip tetapi selain itu sempurna. Saya tidak berpikir saya dapat memposting keseluruhan skrip dalam komentar tetapi saya akan mempostingnya di bawah ini. Terima kasih lagi!
Nama pengguna

Sama-sama :) :) Saya senang bisa membantu Anda!
david_p

5

Ini adalah skrip yang memecahkan masalah. Terima kasih banyak dan terima kasih kepada david_p yang menulisnya. Saya baru saja menambahkan beberapa tanda kurung yang hilang.

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

Opsi A:

  1. Buat buffer menggunakan alat buffer
  2. Pilih semua fitur di kelas fitur Buffer
  3. Gunakan alat warping dan tetapkan beberapa sudut penting dan lakukan pembengkokan

Opsi B:

  1. Buat buffer menggunakan alat buffer
  2. Aktifkan Pengeditan dan Pilih semua fitur di kelas fitur Buffer
  3. Gunakan alat 'Pindahkan', isi X dan Y offests di jendela dan simpan hasilnya

Dengan "Pindahkan", maksud Anda alat Shift? Lagi pula saya tidak yakin apakah ini akan memberi saya hasil yang saya butuhkan. Semua poligon di kelas fitur saya datang dalam bentuk yang berbeda jadi saya tidak bisa memindahkan semua fitur buffer dengan cara yang sama karena ini akan menghasilkan jarak yang berbeda dari fitur awal.
Nama pengguna
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.