Masaüstü için ArcGIS kullanarak yalnızca belirli bir yönde arabellek oluşturuluyor mu? [kapalı]


9

Güney-batı yönünde birkaç çokgen için bir tampon oluşturmaya çalışıyorum. Bildiğim kadarıyla, bu tampon aracı kullanarak mümkün değil (ArcGIS 10.3 kullanıyorum). Manuel olarak yapabilirdim ama 400'den fazla çokgen için çok uzun sürecek.

Daha iyi bir yol bilen var mı?

Bu az çok amaçladığım şey:

resim açıklamasını buraya girin


1
Çokgenleriniz tüm dikdörtgenler ve kareler mi?
Aaron

Hayır, maalesef değil. Farklı şekillerde geliyorlar
Kullanıcı Adı

Bu , sorunuzu düzenlemeniz için önemli bir açıklamadır .
PolyGeo

Yanıtlar:


8

arcpyPython'da biraz çalışabilirseniz, bu bölgeleri belirli yönde oluşturmak için bazı komut dosyaları kullanabilirsiniz. Birkaç hafta önce benzer bir şey yaptım, size yardımcı olmak için senaryomun bir kısmını göndereceğim.

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

Umarım iyi okuyabilirsiniz, yorumları ve değişkenleri tercüme etmek zorunda kaldım.


Senaryo için teşekkürler. Python hakkında gerçekten hiçbir şey bilmiyorum ama betiğinizi kopyaladım ve Çalışma Alanı ve Nesne adlarını ve mesafeyi değiştirdim. Özellikler sınıfları oluşturulur, ancak görünüşe göre bir hata yaptım çünkü her "özniteliğe göre katman seçin" işlemi için bir hata var
Kullanıcı adı

Senaryoda bazı değişiklikler yaptım, şimdi deneyebilirsin. Çalışma alanını ve şekil dosyanızı ayarlayın ve göreceğiz :)
david_p

Çok çok teşekkür ederim! Bu bana tam olarak umduğum sonucu veriyor. İlk başta işe yaramadı çünkü senaryonun son bloğunda eksik olan bazı parantezler vardı ama bunun yanında mükemmel. Komut dosyasının tamamını bir yorumda yayınlayabileceğimi sanmıyorum ama aşağıda yazacağım. Tekrar teşekkürler!
Kullanıcı Adı

Rica ederim :) Size yardımcı olabildiğim için mutluyum!
david_p

5

Bu, sorunu çözen komut dosyasıdır. Kredi ve yazdığı david_p'e çok teşekkürler. Birkaç eksik parantez ekledim.

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

Seçenek A:

  1. Arabellek aracını kullanarak arabelleği oluşturma
  2. Arabellek özellik sınıfındaki tüm özellikleri seçme
  3. Çözgü aletini kullanın ve bazı önemli köşeleri belirleyin ve çözgü uygulayın

Seçenek B:

  1. Arabellek aracını kullanarak arabelleği oluşturma
  2. Tampon özellik sınıfındaki Düzenlemeyi Etkinleştir ve Tüm özellikleri seç
  3. 'Taşı' aracını kullanın, pencerede X ve Y offest'lerini doldurun ve çıktıyı kaydedin

"Taşı" ile Shift aracını mı kastediyorsunuz? Her neyse, bunun bana ihtiyacım olan sonucu vereceğinden emin değilim. Özellik sınıfımdaki tüm çokgenler farklı şekillerde gelir, bu nedenle tüm arabellek özelliklerini aynı şekilde taşıyamam çünkü başlangıç ​​özelliklerinden farklı mesafelere neden olur.
Kullanıcı Adı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.