7 votos

Calcular el promedio de flujo de la pendiente en cada lugar a lo largo de corriente

Estoy tratando de calcular el tiempo de concentración para cada punto a lo largo de una corriente de la red. Para calcular el tiempo de concentración, necesito el canal ascendente de la longitud y la inclinación del canal.

He sido capaz de calcular el canal ascendente de largo en cada píxel con la Hidrología/Flujo de Longitud (aguas arriba) de la herramienta (Ver imagen - rojo corresponde a no acumulativas de la longitud del canal):

Upstream channel length

Sin embargo, no he sido capaz de estimar el canal general de la pendiente en cada píxel (es decir, la pendiente entre el píxel en cuestión a la más lejana-aguas arriba de la cabecera de píxeles). Yo sé que usted puede hacer esto por cuencas individuales (es decir, para un píxel), pero a mi área de estudio es muy grande (el más largo del canal es de 500 km), así que no quiero generar un "hito" para cada secuencia de píxeles, ya que esto va a ser una pérdida de tiempo.

También he tratado de calcular el flujo de longitud con una pendiente de la trama como la "entrada peso de la trama," (y luego dividiendo el resultado por el flujo de la longitud de la trama (sin el peso de la trama) para obtener el promedio de la pendiente a lo largo de la secuencia, pero esta es mucho sobreestimar el general arroyo de la pendiente.

Esencialmente, tengo que encontrar una manera de hacer un mapa de la cabecera de la elevación correspondiente a un píxel en la corriente de la red. Entonces puedo restar la altura en la que cada píxel y dividir por el canal ascendente de longitud para obtener el total de arroyo de la pendiente.

(Estoy usando ArcGIS 10.1, Licencia Básica)

ACTUALIZACIÓN: Aquí está el mensaje de error me estoy poniendo al utilizar la secuencia de comandos de python presenta a continuación (después de correr durante 1 hora y llegar a través de la mitad de los puntos):

error message

9voto

FelixIP Puntos 4035

Como @Hornbydd señalado es la red de búsqueda de problema. Sugiero el siguiente flujo de trabajo:

  1. encontrar puntos de origen de los flujos de
  2. 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).

Screen shot

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.

  1. 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.
  2. Convertir comienza de (seleccionado) polilíneas de los puntos.
  3. 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:

Screen shot

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.

enter image description here

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()        

4voto

John Kramlich Puntos 286

Yo diría que tu problema es una red de búsqueda de problema. Usted necesita identificar el origen de cada punto de la red, la distancia y las elevaciones en el origen y en el punto en la red. Una vez que se tiene toda esta información es una combinación y, a continuación, calcular.

RivEX puede para cualquier punto en un vector de la red (por lo que no raster) identificar la fuente y la distancia a la misma. Usted puede extraer los nodos de origen y la utilización de estos para extraer la elevación y como todos ellos tienen ID simplemente unirse a los datos y calcular usted pendiente.

1voto

David Dean Puntos 3233

Con la suposición básica de que el agua siempre fluye hacia abajo de grado, que podría llevar a su secuencia de trama y sólo donde hay un valor de datos de atributo con el máximo de elevación. Luego, divida a los dos rásteres.

Ahora, cómo se calcula que max elevación de la trama es interesante. Asumiendo que usted tiene spatial analyst, me gustaría que nos la Focal herramienta de Estadísticas y crear un ráster de utilizar el Máximo de la opción, la definición de sus barrios por orden de riachuelos.

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