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.
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.