Como @Hornbydd señalado es la red de búsqueda de problema. Sugiero el siguiente flujo de trabajo:
- encontrar puntos de origen de los flujos de
- ordenar en orden descendente por el flujo de longitud
En la imagen de abajo 139 puntos verdes son fuentes marcados por su orden secuencial y elevación, por ejemplo, más alejados del punto (1/435).
Hay 2 posibles caminos desde aquí:
- Seguimiento y disolver los flujos aguas abajo de cada nodo de origen, a
calcular lo que yo llamo 'largo de los ríos
- Espacialmente join (intersect) secuencia de puntos que representan las corrientes de
(uno a muchos) a los largo de los ríos
- Seleccione los puntos con un mínimo de un río de IDENTIFICACIÓN y añadir a la tabla de puntos
relevantes de la elevación.
Esto es bastante o cerca de lo @Hornbydd es lo que sugiere.
Alternativamente ejecutar el flujo de acumulación varias veces para cada punto (139 en mi ejemplo), el uso de su número secuencial como el peso de la trama.
El uso de células estadísticas para calcular el mínimo. Esto dará origen de ID de punto, etc
ACTUALIZACIÓN:
Voy a elaborar sobre raster enfoque debido a que la red de búsqueda es aburrido.
- Uso de Flujo para la Función (no simplificar líneas) para convertir corriente
la trama a polilíneas. En caso de duda volver a las fuentes de ubicación, de uso corriente
el fin de la herramienta. Primer punto de la secuencia de órdenes 1 es su origen.
- Convertir comienza de (seleccionado) polilíneas de los puntos.
- Extracto de múltiples valores de los puntos de Flujo de Longitud y DEM rásteres.
Ordenar los puntos utilizando el Flujo de Longitud de campo en orden descendente, la salida a SHAPEFILE, llamar esta capa de "FUENTES" en el actual mxd.
Es la tabla debería tener este aspecto:
Agregar la dirección del flujo de ráster a mxd y lo llaman "FDIR"
Entorno de conjunto de grado igual FDIR medida, la trama de análisis de tamaño de la celda a uno en FDIR.
Modificar la carpeta de salida y la de salida nombre de la cuadrícula en la siguiente secuencia de comandos y ejecutar desde mxd.
import arcpy, os, traceback, sys
from arcpy import env
from arcpy.sa import *
env.overwriteOutput = True
outFolder=r"D:\SCRATCH\GRIDS"
outGrid=r"fromELEV"
env.workspace = outFolder
try:
def showPyMessage():
arcpy.AddMessage(str(time.ctime()) + " - " + message)
mxd = arcpy.mapping.MapDocument("CURRENT")
SOURCES=arcpy.mapping.ListLayers(mxd,"SOURCES")[0]
FDIR=arcpy.mapping.ListLayers(mxd,"FDIR")[0]
SOURCES.definitionQuery=""
aTable=arcpy.da.TableToNumPyArray(SOURCES,("ID","DEM"))
victim ='VICTIM'
fd=arcpy.Raster(FDIR.name)
one=Con(fd>0,0)
for ID,Z in aTable:
arcpy.AddMessage('Processing source no %s' %ID)
dq='"ID"=%s' %ID
SOURCES.definitionQuery=dq
arcpy.PointToRaster_conversion(SOURCES, "DEM", victim)
facc = FlowAccumulation(FDIR, victim, "FLOAT")
two=Con(one==0,facc,one)
one=two
# REMOVE LINE BELOW AFTER TESTING
if ID==10:break
SOURCES.definitionQuery=""
two=Con(one!=0,one)
two.save(outGrid)
arcpy.Delete_management(victim)
except:
message = "\n*** PYTHON ERRORS *** "; showPyMessage()
message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
message = "Python Error Info: " + str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()
SALIDA:
Nota las fuentes de etiquetado mediante la IDENTIFICACIÓN,el flujo de longitud y elevación.
Después de procesar la última fuente que tomará algún tiempo para la secuencia de comandos para terminar! Supongo que es ArcGIS eliminación de todas temporal rásteres creado durante la ejecución.
ACTUALIZACIÓN 2 esperemos que última
Mi mal, trate de hacer esto. Es mucho más rápido:
import arcpy, os, traceback, sys
from arcpy import env
from arcpy.sa import *
env.overwriteOutput = True
outFolder=r"D:\SCRATCH\GRIDS"
outGrid=r"fromELEV"
env.workspace = outFolder
NODATA=-9999.0
try:
def showPyMessage():
arcpy.AddMessage(str(time.ctime()) + " - " + message)
mxd = arcpy.mapping.MapDocument("CURRENT")
SOURCES=arcpy.mapping.ListLayers(mxd,"SOURCES")[0]
FDIR=arcpy.mapping.ListLayers(mxd,"FDIR")[0]
fd=arcpy.Raster(FDIR.name)
one=Con(fd>0,NODATA)
dirArray = arcpy.RasterToNumPyArray(fd,"","","",NODATA)
nRows,nCols=dirArray.shape
blankArray=arcpy.RasterToNumPyArray(one,"","","",NODATA)
del one
ext=arcpy.Describe(FDIR).extent
origin=ext.lowerLeft
yMax,xMin=ext.YMax,ext.XMin
cSize=fd.meanCellHeight
## directions to find neighbour
fDirs=(1,2,4,8,16,32,64,128)
dCol=(1, 1, 0, -1, -1,-1, 0,1)
dRow=(0, -1, -1, -1, 0, 1, 1,1)
## flipped
dRow=(0, 1, 1, 1, 0, -1, -1,-1)
aDict={}
for i,v in enumerate(fDirs):
aDict[v]=(dCol[i],dRow[i])
with arcpy.da.SearchCursor(SOURCES,("Shape@","ID","DEM")) as cursor:
for shp,ID, Z in cursor:
arcpy.AddMessage('Processing source no %s' %ID)
p=shp.firstPoint
nR=int((yMax-p.Y)/cSize)
nC=int((p.X-xMin)/cSize)
while True:
blankArray[nR,nC]=Z
direction=dirArray[nR,nC]
if direction==NODATA:break
dX,dY=aDict[direction];nC+=dX
if nC not in range(nCols): break
nR+=dY
if nR not in range(nRows): break
S=blankArray[nR,nC]
if S!=NODATA: break
myRaster = arcpy.NumPyArrayToRaster(blankArray,origin,cSize,cSize)
oneGrid=Con(myRaster<>NODATA,myRaster)
oneGrid.save(outGrid)
del dirArray,blankArray
except:
message = "\n*** PYTHON ERRORS *** "; showPyMessage()
message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
message = "Python Error Info: " + str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()