Vous créez un tampon carré autour d'une entité ponctuelle à l'aide d'ArcGIS for Desktop?


31

Je voudrais créer un tampon carré à partir d'une entité ponctuelle mais je ne comprends pas le code qui y est contenu.

Des questions similaires ont été posées sur le site forums.esri mais c'était il y a plus de 10 ans, et cela n'a pas fonctionné lorsque j'ai essayé le code.

Comment créer un tampon carré à partir d'une entité ponctuelle?


gis.stackexchange.com/questions/12479/… est essentiellement un doublon (car il répond à une généralisation de cette question), mais comme il existe déjà de bonnes réponses spécifiques aux tampons carrés, il semble préférable de laisser les deux threads ouverts et séparer plutôt que de les fusionner. Mais si vous voulez encore plus de solutions, lisez aussi l'autre fil!
whuber

2
OK merci whuber. Je viens de trouver ce site Web hier et je le connais toujours. J'essaierai de le faire avec mes futurs messages / questions. J'aime beaucoup ce site mieux que les forums ArcGIS.
Kimball

Je ne voulais pas que ce commentaire soit une critique, Kimball: c'était là pour empêcher la fusion des deux fils, c'est tout. Bienvenue dans notre communauté! (Et veuillez parler de nous à vos amis, en particulier ceux des forums ArcGIS. :-)
whuber

Droite. Je sais que tu ne le pensais pas de cette façon. J'apprécie beaucoup cette communauté et j'ai déjà commencé à parler aux autres de ce nouveau forum.
Kimball

Merci pour votre part importante. Je me demande comment utiliser un ensemble de données de champ dans l'entité ponctuelle pour créer des tampons rectangulaires à l'aide du script que vous fournissez sans saisir manuellement leurs coordonnées. Merci

Réponses:


47

Essayez ces étapes avec ArcMap 10:

  1. Mettez en mémoire tampon votre entité ponctuelle (ArcToolbox> Outils d'analyse> Proximité> Tampon). Assurez-vous de sélectionner la bonne distance dans la zone Unité linéaire.
  2. Saisissez vos tampons nouvellement créés dans l' outil Enveloppe de fonction vers polygone (Outils de gestion des données> Fonctions> Enveloppe de fonction vers polygone). Assurez-vous de cocher la case «Créer des entités à plusieurs parties» si vous avez plusieurs points.

Pour une solution Python:

Utilisation de SearchCursor et InsertCursor pour créer des tampons carrés

entrez la description de l'image ici


2
+1 Les réponses qui démontrent que la solution fonctionne sont les meilleures.
whuber

12

Une solution possible serait de créer vos tampons ronds "normaux" à l'aide de l'outil de tampon ESRI standard avec le rayon que vous souhaitez, puis d'effectuer une enveloppe de fonction vers un polygone sur cette classe d'entités résultante de tampons. Cela crée une entité enveloppe carrée autour de l'étendue de chaque entité. L'enveloppe d'entité vers le polygone se trouve dans Gestion des données> Entités. Le modèle de création de modèle ressemblerait à:

entrez la description de l'image ici


Excellente solution! De plus, en créant la sortie du tampon en tant que couche in_memory (in_memory \ tmpBuffer) et vous pouvez éviter d'écrire des données inutiles sur le disque et accélérer le processus.
RyanDalton

9

Étant donné que le script lié à la fin du code d'Aaron ne peut être utilisé que pour les tampons carrés et n'utilise pas le nouveau module arcpy.da, j'ai écrit un script qui peut être utilisé pour créer des tampons rectangulaires. Sur un ensemble de données de points aléatoires de 10 000, il s'est terminé en 10 secondes:

entrez la description de l'image ici

import os, arcpy

point_FC = arcpy.GetParameterAsText(0)
w = float(arcpy.GetParameterAsText(1))
h = float(arcpy.GetParameterAsText(2))
output_FC = arcpy.GetParameterAsText(3)

def rect(coord, w, h):
        #Given XY coordinates and rectangle dimensions,
        #return a polygon object of a rectangle centered about the point
        x,y = coord
        w *= 0.5
        h *= 0.5
        xmin,xmax = x-w, x+w
        ymin,ymax = y-h, y+h
        poly = ((xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin))
        return arcpy.Polygon(arcpy.Array(arcpy.Point(*p) for p in poly))

#Create output feature class.
spatref = arcpy.Describe(point_FC).spatialReference
folder, base = os.path.split(output_FC)
arcpy.CreateFeatureclass_management(folder, base, "POLYGON", spatial_reference=spatref)

#Get field object for every field in input except OID and Shape.
fields = [f for f in arcpy.ListFields(point_FC) if f.type not in ("OID", "Geometry")]

for field in fields:
         arcpy.AddField_management(output_FC, field.name, field.type, field.precision,
                                   field.scale, field.length, field.aliasName,
                                   field.isNullable, field.required, field.domain)

#Get field names to be inputted to cursors.
#Need SHAPE@XY token to read point coords and SHAPE@ token to write polygon coords.
fnames = [f.name for f in fields]
fields_in = fnames[::]
fields_out = fnames[::]
fields_in.append("SHAPE@XY")
fields_out.append("SHAPE@")

#Create buffers and write attributes to output FC, if any.
count = int(arcpy.GetCount_management(point_FC)[0])
arcpy.SetProgressor("step", "Buffering...", 0, count, 1)
with arcpy.da.SearchCursor(point_FC, fields_in) as Scursor,  arcpy.da.InsertCursor(output_FC, fields_out) as Icursor:
        for i,row_in in enumerate(Scursor):                
                #"Convert" point to rectangle
                arcpy.SetProgressorPosition(i)
                feature = list(row_in)
                feature[-1] = rect(feature[-1], w, h)                
                Icursor.insertRow(feature)


1

Comme alternative à la réponse d'Aaron, pour ceux sans licence Advanced, utilisez l' outil Minimum Bounding Geometry . Étapes ci-dessous (modifiées à partir d'Aaron):

  1. Mettez en mémoire tampon votre entité ponctuelle (ArcToolbox> Outils d'analyse> Proximité> Tampon). Assurez-vous de sélectionner la bonne distance dans la zone Unité linéaire.
  2. Saisissez vos tampons nouvellement créés dans l' outil Géométrie de délimitation minimale (Outils de gestion des données> Fonctions> Géométrie de délimitation minimale). Utilisez 'RECTANGLE_BY_AREA' ou 'RECTANGLE_BY_WIDTH', les autres options ne sont disponibles qu'avec une licence avancée.

EDIT : Cette option ne vous permet pas de contrôler l'orientation des tampons carrés résultants, sans utiliser l'option 'ENVELOPE' (qui nécessite une licence avancée). En cochant l'option «Ajouter des caractéristiques géométriques en tant qu'attributs à la sortie (facultatif)» - le décalage résultant sera enregistré comme «MBG_Orientation» dans la classe d'entités en sortie. Cela peut ensuite être utilisé pour faire pivoter les entités vers le centre si vous le souhaitez - voir Rotation des polygones par valeur à partir de la table attributaire en utilisant ArcPy? pour une solution potentielle à cela.

entrez la description de l'image ici


Pour ma classe d'entités particulière, il finit par faire pivoter les carrés dans différentes directions à l'aide de ce flux de travail. Peut-être parce que mes cercles tampons se chevauchent. Pas certain. J'ai demandé à Esri d'utiliser la méthode d'Aaron ci-dessus sur ma même classe d'entités et cela n'a pas fait pivoter les cercles tamponnés.
Andrew

@Andrew, oui, vous avez raison, c'est une limitation de l'outil sans licence avancée. L'utilisation de l'option ENVELOPE retournerait le même résultat que la méthode d'Aaron ci-dessus, mais nécessite également une licence avancée. Une solution de contournement possible serait de cocher l'option `` Ajouter des caractéristiques de géométrie en tant qu'attributs '', de déterminer la valeur de leur inclinaison (devrait être cohérente), puis de faire pivoter les tampons carrés résultants de cette valeur dans une session d'édition. Je n'ai pas encore essayé ça.
Dùn Caan

0

Ce site décrit comment convertir des fichiers csv en tampons carrés, rectangulaires ou circulaires à l'aide de JavaScript JavaScript et de js2shapefile.

Vous pouvez jeter un œil si cela résout votre problème.

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.