4 votos

Gradiente de la corriente - dos tipos - utilizando datos de alta resolución NHD

Necesito calcular la pendiente, o el gradiente de la corriente, de dos maneras diferentes:

  1. Pendiente del canal principal desde el punto de vertido hasta el punto de cabecera/fuente a lo largo de la red de corrientes vectoriales

  2. una pendiente local consistente en 100 metros hacia arriba desde el punto de vertido

Estoy utilizando los datos de alta resolución del NHD (necesito utilizar este conjunto de datos porque algunos otros cálculos dependen de él, así que no quiero derivar mis propios flujos de datos del DEM) y tengo algo menos de 500 "puntos de vertido" que se ajustan a los datos de alta resolución del NHD. Comprendo perfectamente la intención y los conceptos, pero me cuesta componer los métodos para automatizar esto para todos los sitios dentro de los límites de ArcGIS (versión 9.3.1). Dispongo de datos DEM de 10 m para toda la zona de estudio para obtener las elevaciones.

Obstáculos con los que estoy luchando mentalmente:

  • Cómo identificar todos los segmentos del arroyo que componen el "canal principal" para poder sumar sus longitudes. En algunos casos, cerca de la cabecera del arroyo puede haber un afluente de primer orden, pero entonces el canal principal también tiene el mismo orden de arroyo (he calculado los órdenes de arroyo de Strahler y de Shreve utilizando una herramienta llamada RivEx, de modo que los segmentos de arroyo se atribuyen con estos, así como sus nodos de origen y de destino a través de la herramienta RivEx, y tengo los nodos de origen y de destino). No parece haber un atributo común en los atributos de las líneas de flujo de NHD (por ejemplo, el ID del GNIS) para disolver esencialmente lo común, o al menos para seleccionar de alguna manera todos ellos. Muchos de los segmentos simplemente no tienen ID de GNIS.

  • Cómo medir sólo 100 m hacia arriba desde un punto de vertido y luego generar un nuevo "nodo desde" para representar esa ubicación de 100 m aguas arriba para obtener datos de elevación y así calcular la pendiente local del arroyo.

He estado trabajando muchas horas así que mi cerebro probablemente está haciendo esto más difícil de lo que es...

y me he encontrado con estos otros dos posts en GIS StackExchange pero he estado luchando con la forma de adaptarlos a mis necesidades:

¿Flujo de trabajo para determinar el gradiente de la corriente?

¿Asignación de puntos a sus respectivos Reaches mediante Stream Gradient?

Parece que todas las piezas están ahí ("m-aware vector streams"), etc. pero empiezo a preguntarme si no es así sin, de nuevo, un identificador común para identificar qué segmentos aguas arriba deben considerarse parte del "canal principal" aguas abajo.

He aquí un ejemplo: Headwater Stream Example

En el ejemplo mostrado, los puntos rojos más oscuros son los nodos, y los puntos rojos brillantes son los puntos de muestreo del flujo. Para calcular la pendiente del canal principal, si escribo un programa de automatización necesito algún tipo de atributo para poder identificar cuáles de los segmentos mostrados aguas arriba son parte del "canal principal". En este caso, el segmento que tiene los puntos de muestreo (rojo brillante) y el segmento aguas arriba que se ramifica a la izquierda tienen el mismo ID del GNIS, por lo que podría utilizarlo. Pero los datos del NHD tienen muchos casos en los que arroyos más pequeños de esta naturaleza simplemente no tienen ID del GNIS. Y la información del nodo desde/hasta o incluso la tabla de flujo de NHD que tengo simplemente te dice que ambos segmentos aguas arriba fluyen hacia el segmento del punto de muestreo. Con este ejemplo como demostración de otras instancias que carecen de un ID GNIS, necesito una forma de automatizar la decisión de CUÁL segmento aguas arriba usar para calcular la pendiente del canal principal en un programa con script. ¿Qué otra cosa podría usarse para hacer esto?

Otro ejemplo en el que el ID del GNIS no podría utilizarse como forma de identificar hidrológicamente todos los segmentos que componen el canal principal es cuando una sección aguas arriba tiene un ID del GNIS y un nombre único del GNIS (por ejemplo, "arroyo X", y luego toma un nombre diferente (por ejemplo, arroyo "y") desde una confluencia con otro trib. Un punto en el arroyo "y" sigue recibiendo hidrológicamente el flujo del canal principal del arroyo x, pero el ID del GNIS no puede utilizarse para conectar los dos.

4voto

cjstehno Puntos 131

La pendiente se obtiene extrayendo las elevaciones en el punto de muestreo y en el punto 100 metros aguas arriba a lo largo de la corriente principal (y luego dividiendo su diferencia por 100). Considere estos criterios para encontrar el punto aguas arriba:

  1. Debe estar en un arroyo.

  2. Debe estar aguas arriba del punto de muestreo.

  3. La distancia del arroyo al punto de muestreo debe ser de 100 metros.

  4. Entre todos esos puntos, debe tener el mayor flujo.

Este último identifica la rama principal de la corriente.

Para aplicar estos criterios, comience con una capa de flujo (1). Calcule previamente una malla de acumulación de flujo a partir de un MDE. Dado un punto de muestra,

  • encontrar todo puntos del arroyo 100 metros aguas arriba del punto de muestreo (2, 3). (Este es un procedimiento propiamente teórico de gráficos o de "análisis de redes", lo que sugiere que la capa del arroyo debe estar en un formato de vector orientado topológicamente correcto).

  • Extraer los valores de acumulación de flujo en los puntos restantes. Seleccione cualquier punto que tenga una acumulación de flujo máxima (4). Utilice su elevación (ya obtenida) para el cálculo de la pendiente.

Este flujo de trabajo pasa lo más rápidamente posible a procesar un pequeño conjunto finito de puntos, que consiste en cálculos rápidos. La clave es el primer paso . Probablemente se puede hacer con Network Analyst o explotando las propiedades de las polilíneas medidas. Incluso puede hacerse desde cero con pocos problemas porque la información topológica ya está ahí. El algoritmo requiere sólo unas pocas capacidades básicas, además de las funciones básicas de manejo de listas (añadir un elemento a una lista y añadir una lista a otra):

  • Encuentra la distancia entre dos puntos que se sabe que se encuentran en un arco (una polilínea no ramificada): Distance(p1, p2, a) (p1, p2:puntos; a:arco).

  • Dado un punto de un arco y una distancia, encuentra cualquier punto de ese arco a esa distancia: Along(p, a, d) (p:punto, a:arco; d:distancia).

  • Obtiene el conjunto de arcos que tienen un "nodo de llegada" común. Si v es un nodo, y que Arcs(v) sea el conjunto de arcos que tienen v como sus "nodos de destino". Esto se puede encontrar con una consulta a la base de datos o, mejor, colocando inicialmente todos los arcos en una matriz asociativa ("diccionario") indexada por sus nodos "a".

Cada arco a tiene un único "nodo de origen" (punto final ascendente), a.From . Cada punto p tiene una elevación, p.Elevation calculado, si es necesario, a partir del MDE.

La entrada es el punto de muestra p el arco a en la que se encuentra, y la distancia deseada aguas arriba d (100 metros). Devuelve un conjunto de puntos que se garantiza que se encuentran aguas arriba del punto p a lo largo de a a distancia d . (Es posible que no existan tales puntos, en cuyo caso se devuelve un conjunto vacío.) A continuación se muestra el pseudocódigo (al que se añaden algunas declaraciones de guarda clave, "asserts", para establecer la corrección):

FindUpstream(p:point, a:arc, d:number) {
    Assert(p lies on a)
    Assert(d >= 0)
    output = {} // Empty set
    e = Distance(p, a.From, a)       // Distance from p to the upgradient endpoint of a
    If (e < d) {                     // We have to move up the branches
        For each b in Arcs(a.From) { // Recursively find the upstream points
            Append FindUpstream(a.From, b, d-e) to output
        }
    } Else {                         // Find the upgradient point on a
        For each q in Along(p, a, d) {
            If (q.Elevation >= p.Elevation) {
                Adjoin q to output
            }
        }
        Assert(output contains exactly one point)
    }
    Return output
}

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