4 votos

Anexar o fusionar segmentos consecutivos (contornos) como una sola línea del mismo valor de elevación

¿Hay una forma utilizando python (ArcPy) o herramientas de ArcGIS 10.1 recopilar segmentos consecutivos con el mismo valor de elevación y anexar/fusión/generar una sola línea de ellos? Cada línea resultante tendrá el mismo valor de elevación que los segmentos originales.

Lo siento, apoyo imagen bloqueada por invitado.

4voto

David Puntos 2901

Si usted está familiarizado con secuencias de comandos de python, escribí el siguiente código para este problema exacto que tuve el mes pasado. Puede crear una secuencia de comandos de la herramienta en ArcToolbox para ejecutar la secuencia de comandos. Cuando se Disuelven o Unsplit herramientas de línea tiene numerosos antecedentes, tiende a estancar y choque. Supongo que esto es debido a que "Esta herramienta se utiliza un proceso de ordenamiento en teselas para manejar conjuntos de datos muy grandes para un mejor rendimiento y escalabilidad. Para obtener más detalles, consulte Geoprocesamiento con grandes conjuntos de datos." Lo ESRI dice, no mejora el rendimiento. Me encontré esto en varios shapefiles con más de 400.000 total de registros. La herramienta de disolver corrió por más de 72 horas y aún no ha acabado. Mi script tomó menos de 10 minutos.

Esencialmente, la herramienta se rompe su contornos de elevación en los shapefiles de el mismo valor (es decir, 15 shapefiles de elevaciones 1ft - 15 pies si sus contornos son de 1 ft contornos como el mío). También compensa los valores negativos (tengo sitios cerca de la costa). Las formas son luego combinadas, disuelto, y de varias partes para singlepart saltos de líneas separadas en los registros individuales. Usted puede modificar el dissolve_fields variable y el nombre de campo en todo el código (he marcado los lugares) para atender a sus necesidades. Espero te sirva de ayuda.

# Contour_Merge_And_Dissolve.py

# Import modules
import arcpy
from arcpy import env

# Define functions
def min_max(featureClass, fieldName):
    listItems = []
    rows = arcpy.SearchCursor(featureClass)
    for row in rows:
        listItems.append(row.getValue(fieldName))
    del rows
    listItems.sort()
    listMin = listItems[0]
    listMax = listItems[-1]
    return listMin, listMax

# Arguments
contourList = arcpy.GetParameterAsText(0) #input shapefiles, ElevationContours
outFolder = arcpy.GetParameterAsText(1) #output folder

# set workspace and overwrite option
arcpy.env.workspace = outFolder
arcpy.env.overwriteOutput = True
arcpy.env.outputZFlag = "Disabled"
arcpy.env.outputMFlag = "Disabled"

# local variables
dissolveFields = ["ELEV_FT"] # change field name here

# Process: Merge
arcpy.AddMessage("Merging contours...")
arcpy.Merge_management(contourList, "contour_merge.shp")

# Get Min/Max values of ELEV_FT field
ft_min, ft_max = min_max("contour_merge.shp", "ELEV_FT") # change field name here
ft_range = ft_max - ft_min

arcpy.AddMessage("ELEV_FT MIN: " + str(ft_min))
arcpy.AddMessage("ELEV_FT MAX: " + str(ft_max))

# Set progressor
arcpy.SetProgressor("step", "Breaking apart contours...", 0, ft_range, 1)
arcpy.AddMessage("Breaking apart contours...")

# Break apart and dissolve for each ELEV_FT value
mergeList = []
counter = ft_min
while counter <= ft_max:
    arcpy.SetProgressorLabel("Breaking out " + str(counter) + "ft contours...")
    arcpy.AddMessage("Attempting " + str(counter) + "ft contours...")
    counter_str = str(counter)
    counter_str = counter_str.replace("-", "neg")
    thisLyr = "elev_" + counter_str + "_lyr"
    thisDis = "elev_" + counter_str + "_dissolve.shp"
    where_clause = '"ELEV_FT" = ' + str(counter) # change field name here
    # Make Layer
    arcpy.management.MakeFeatureLayer("contour_merge.shp", thisLyr)
    # Select by attributes
    arcpy.SelectLayerByAttribute_management(thisLyr, "NEW_SELECTION", where_clause)
    # Dissolve Layer to new shape
    arcpy.Dissolve_management(thisLyr, thisDis, dissolveFields, "", "SINGLE_PART", "DISSOLVE_LINES")
    # Add to mergeList
    mergeList.append(thisDis)
    counter += 1
    arcpy.SetProgressorPosition()

arcpy.ResetProgressor()

# Merge contours
arcpy.AddMessage("Merging dissolved layers...")
arcpy.Merge_management(mergeList, "contour_dissolve.shp")

# Multipart to singlepart
arcpy.AddMessage("Converting multipart to singlepart...")
arcpy.MultipartToSinglepart_management("contour_dissolve.shp", "contour_singlepart.shp")

# Clean up
for shape in mergeList:
    arcpy.Delete_management(shape)

1voto

Oddthinking Puntos 233

Disuelva en función de la elevación, con el parámetro multi_part establecido en "SINGLE_PART".

O podría disolver normalmente y luego explotar características de varias partes.

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