Créer un tampon uniquement dans une direction spécifique à l'aide d'ArcGIS for Desktop? [fermé]


9

J'essaie de créer un tampon pour plusieurs polygones dans une orientation sud-ouest. Pour autant que je sache, cela n'est pas possible en utilisant l'outil tampon (j'utilise ArcGIS 10.3). Je pouvais le faire manuellement, mais pour plus de 400 polygones, cela prendrait beaucoup trop de temps.

Quelqu'un connaît-il une meilleure façon?

C'est plus ou moins ce que je vise:

entrez la description de l'image ici


1
Vos polygones sont-ils tous des rectangles et des carrés?
Aaron

Non, malheureusement non. Ils se présentent sous différentes formes
Nom d'utilisateur

C'est une clarification importante que vous devez modifier dans votre question.
PolyGeo

Réponses:


8

Si vous pouvez travailler arcpyun peu avec Python, vous pouvez utiliser un script pour générer ces zones dans une direction spécifique. J'en ai fait quelques similaires il y a quelques semaines, je posterai une partie de mon script pour vous aider.

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

J'espère que vous pouvez bien le lire, j'ai dû traduire des commentaires et des variables.


Merci pour le script. Je ne sais vraiment rien de Python mais j'ai copié votre script et changé les noms d'espace de travail et d'objet ainsi que la distance. Les classes d'entités sont créées, mais apparemment j'ai fait une erreur car il y a une erreur pour chaque opération "sélectionner la couche par attribut"
Nom d'utilisateur

J'ai fait quelques changements dans le script, vous pouvez l'essayer maintenant. Définissez l'espace de travail et votre fichier de formes et nous verrons :)
david_p

Merci beaucoup! Cela me donne exactement le résultat que j'espérais. Cela n'a pas fonctionné au début car il y avait des parenthèses manquantes dans le dernier bloc du script mais en plus c'est parfait. Je ne pense pas que je puisse poster le script entier dans un commentaire mais je le posterai ci-dessous. Merci encore!
Nom d'utilisateur

Vous êtes les bienvenus :) Je suis heureux de pouvoir vous aider!
david_p

5

Ceci est le script qui résout le problème. Un grand merci et un grand merci à david_p qui l'a écrit. Je viens d'ajouter quelques parenthèses manquantes.

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

Option A:

  1. Créer le tampon à l'aide de l'outil tampon
  2. Sélectionnez toutes les fonctionnalités de la classe d'entités tampons
  3. Utiliser l'outil de déformation et désigner certains coins importants et effectuer la déformation

Option B:

  1. Créer le tampon à l'aide de l'outil tampon
  2. Activer l'édition et sélectionner toutes les fonctionnalités de la classe d'entités tampons
  3. Utilisez l'outil "Déplacer", remplissez les offests X et Y dans la fenêtre et enregistrez la sortie

Par "Déplacer", vous voulez dire l'outil Shift? Quoi qu'il en soit, je ne sais pas si cela me donnera le résultat dont j'ai besoin. Tous les polygones de ma classe d'entités se présentent sous différentes formes, je ne peux donc pas déplacer toutes les entités tampons de la même manière car cela entraînerait des distances différentes par rapport aux entités initiales.
Nom d'utilisateur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.