4 votos

Tampón de anillos múltiples con atributos

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?

5voto

mleykamp Puntos 491

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.

3voto

Greg Puntos 1756

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:

Multiple ring buffers displayed with multi-field unique attributes

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X