5 votos

¿Numeración de cuencas hidrográficas con ArcGIS Desktop?

Estoy trabajando con un mapa de cuencas hidrográficas y me preguntaba si existe una función o una forma de conseguir que ArcMap numere las cuencas. Por ejemplo, si tenemos la cuenca X numerada como 0, quiero que las cuencas que rodean o comparten un límite con la cuenca X sean numeradas como 1, y que las cuencas que rodean o comparten un límite con la cuenca número 1 sean numeradas como 2 y así sucesivamente. ¿Hay alguna forma de hacer esto construyendo un modelo en ModelBuilder? Me gustaría guardarlo para que cuando cambie una capa de cuenca y ejecute el modelo, haga lo mismo en una nueva área de cuenca.

Image Link

0 votos

¿Puede demostrar con una imagen lo que busca?

3 votos

Por curiosidad, dado que se trata de cuencas hidrográficas, ¿un sistema de numeración del tipo Strahler o Pfafstetter sería más apropiado, ya que se ocupa de la direccionalidad ascendente y descendente?

0 votos

Bueno, yo sólo me fijo en las cuencas en su conjunto, no en los arroyos. Creo que si yo usaría eso si estuviera haciendo el análisis a nivel de arroyo.

6voto

auramo Puntos 161

Estoy pensando que se podría hacer algo con Select by Location, Calculate Field e iteración en ModelBuilder... vea esta página para un ejemplo: Iteración mediante una condición de recuento o booleana

Image

0 votos

Creo que esto puede funcionar. Lo probaré. Sin embargo, ¿sabe usted si se le asignará valores? He mirado el ejemplo, pero ¿cada Interacción da a esas cajas un nuevo valor y si es así les da a todos los mismos valores?

0 votos

Esta respuesta no pretende ser una solución completa, sólo un punto de partida. Yo utilizaría la herramienta Calcular campo para asignar los valores de las características seleccionadas. Sin embargo, habría que tener cuidado de que las características previamente seleccionadas no se calculen también en cada iteración.

0 votos

La herramienta SelectByLocation le ofrece la opción NEW_SELECTION para que no sobrescriba su última iteración.

1voto

ESV Puntos 4591

Una posible solución escrita en arcpy Python basado en la solución de @blah238 arriba. Si quisieras permanecer en un entorno de constructor de modelos, podrías simplemente tomar la expresión del archivo CalculateFieldManagement y utilizarlo en el model builder. Tenga en cuenta la configuración adicional de -1 y 0 para el campo original en caso de que la entrada es un shapefile.

import arcpy
import sys

def watershed_counter(watershed_lyr, calc_attribute):
    current_count = int(arcpy.GetCount_management(watershed_lyr).getOutput(0))
    assert current_count == 1, "Too many features selected!"

    watershed_value = 0

    arcpy.AddMessage("Calculating base watershed")

    #We calculate to -1 as if base file is shapefile it uses 0 instead of Null
    #as placeholders for no data, and that'a where we want to start the
    #watershed count
    arcpy.CalculateField_management(watershed_lyr, calc_attribute, -1)

    while watershed_value >= 0:
        arcpy.AddMessage("Selecting new watersheds")
        arcpy.SelectLayerByLocation_management(watershed_lyr, 'SHARE_A_LINE_SEGMENT_WITH', watershed_lyr)

        new_count = int(arcpy.GetCount_management(watershed_lyr).getOutput(0))
        if current_count == new_count:
            watershed_value = -1
            arcpy.AddMessage("No more watersheds")
            break
        else:
            watershed_value += 1
            arcpy.AddMessage("At watershed level %i, %i new watersheds found" % (watershed_value, new_count - current_count))
            current_count = new_count

        data = {"val": watershed_value, "field": calc_attribute}
        arcpy.CalculateField_management(watershed_lyr, calc_attribute, "%(val)i if !%(field)s! is None or !%(field)s! == 0 else !%(field)s!" % data, "PYTHON_9.3")

    arcpy.AddMessage("Setting base watershed to 0")
    arcpy.SelectLayerByAttribute_management(watershed_lyr, "NEW_SELECTION", " %s = -1" % arcpy.AddFieldDelimiters(watershed_lyr, calc_attribute))
    arcpy.CalculateField_management(watershed_lyr, calc_attribute, 0)

if __name__ == '__main__':
    try:
        watershed_counter(*sys.argv[1:])
    except Exception, e:
        arcpy.AddError(e)
        sys.exit(e)

Tenga en cuenta que cada iteración del bucle en esta solución es probable que tome una mayor cantidad de tiempo como el tamaño de seleccionar por ubicación aumenta en complejidad basada en el número de características, así como el número de características a calcular cada vez mayor.

Por último, si le interesa tener varios puntos de partida posibles (es decir, el destino más corto), elimine la opción assert en el guión.

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