Construyendo sobre ¿Dentro del buffer con atributos en ArcGIS? Me gustaría ser capaz de crear múltiples buffers de anillo mientras se conservan (y posiblemente se disuelven) los valores de los atributos. ¿Cómo se puede hacer esto?
Respuestas
¿Demasiados anuncios?OK, como hice esto, es un bucle a través de la creación de búferes de anillo en los objetos, y guardar la salida como una nueva featureclass en una colección de conjuntos de datos standlone. A continuación, la fusión de las clases de características, así:
tmp_merge = "path to area"\+ "tmp_merge"
final_out_path_agg = final_staging + "_Agg"
final_out_path_simp = final_staging + "_Simp"
#check if files exist and delete if they do; assume nothing
if (arcpy.Exists(tmp_merge)):
arcpy.Delete_management(tmp_merge)
#set up folder to search for polygon data
arcpy.env.workspace = scratchDB + "mytmpBuff.gdb/Polygons/"
#collate FC
fcs = arcpy.ListFeatureClasses()
L = []
count = 0
try:
for fc in fcs:
#append to array ready for merging
L.append(fc)
count = count + 1
except:
print "Error collating FeatureClasses."
try:
if count > 1:
arcpy.Merge_management(L, tmp_merge)
elif count == 0:
arcpy.AddMessage("No FeatureClass Polygons located.")
arcpy.AddMessage("Error collating FeatureClasses.")
sys.exit(-1)
except:
arcpy.AddMessage("Error merging FeatureClasses.")
Entonces los disolvió
#overlaps dissolved
arcpy.Dissolve_management(tmp_merge, final_out_path_agg, "Name", [["RunID","FIRST"],["AltiLwr","FIRST"],["AltUpr","FIRST"],["TimeSl","FIRST"],["ConcentrationBand","FIRST"],["ConcLvl","FIRST"],["IsC","FIRST"]])
arcpy.DeleteField_management(final_out_path_agg, "NAME")
Los búferes se crean en un bucle y se almacenan en arcpy.env.workspace = scratchDB + "mytmpBuff.gdb/Polygons/" antes de que posteriormente haga un bucle a través de ellos.
Funciona, o lo hace si he entendido bien su problema.
A continuación, mi respuesta. Aunque ahora se parece muy poco al ejemplo de Hairy, sólo al revisar y entender su código pude encontrar mi propia solución, así que ¡gracias!
multianillo-buffer.py : Cree varios buffers de anillo, manteniendo los atributos de la clase de característica principal.
Proceso:
- crear dentro de un solo búfer para cada uno de los anchos de búfer especificados
- almacenar la anchura de la memoria intermedia utilizada como atributo
- fusionar todos los búferes en una sola clase de característica, asegurando primero la mayor anchura para que los más estrechos se dibujen encima
Uso:
multi-ring-buffer [feature class] [workspace] [output feature class] [widths list] [attributes to keep]
multi-ring-buffer R:\data.gdb\Foobar_ply X:\maps\buffers.gdb Foobar_rings 50,-50,-100,-300,-600 NAME,TYPE
El espacio de trabajo debe existir. Los parámetros de anchura y atributo deben estar separados por comas y no tener espacios. Requiere Arcgis 10, nivel de licencia Arcinfo.
(c) 2021 Environment Yukon, matt.wilkie@yukon.ca Con licencia MIT: http://www.opensource.org/licenses/MIT
import arcpy
from arcpy import env
in_fc = arcpy.GetParameterAsText(0) # features to buffer
wspace = arcpy.GetParameterAsText(1) # output workspace
out_fc = arcpy.GetParameterAsText(2) # finished result
distances = arcpy.GetParameterAsText(3).split(',') # list of buffer widths
# parse list of attributes to keep into semi-colon separated as expected by buffer tool
dissolveFields = arcpy.GetParameterAsText(4).replace(',',';')
env.workspace = wspace
sideType = "OUTSIDE_ONLY"
endType = "ROUND"
dissolveType = "LIST"
buffered_fcs = []
for distance in distances:
buf_fc = arcpy.ValidateTableName('xxx_' + out_fc + distance)
print("...buffering {0} into {1} with width {2}".format(in_fc, buf_fc, distance))
arcpy.Buffer_analysis(in_fc, buf_fc, distance, sideType, endType, dissolveType, dissolveFields)
# store buffer width as attribute value
arcpy.AddField_management(buf_fc, 'Width', "TEXT", "", "", 16)
arcpy.CalculateField_management(buf_fc, 'Width', distance, "PYTHON")
buffered_fcs.append(buf_fc)
# arrange buffers from largest to smallest width
# so the draw order is correct after merging
buffered_fcs.sort()
buffered_fcs.reverse()
print("...Merging intermediate buffers into {0}".format(out_fc))
arcpy.Merge_management(buffered_fcs, out_fc)
# remove temporary intermediate files
print("...Removing intermediate files")
for fc in arcpy.ListFeatureClasses('xxx_*'):
arcpy.Delete_management(fc)
En la gestión del código fuente en https://github.com/envygeo/arcplus/tree/master/ArcToolbox/Scripts
El anillo resultante se muestra con valores únicos de varios campos en arcmap: