¿Alguien sabe qué tipo de algoritmo se utiliza en la herramienta ArcGIS Watershed (en el paquete Spatial Analyst)?
Muy poca información dada en el sitio web de Esri ... pero sospecho que puede ser algún tipo de búsqueda de profundidad / amplitud.
He visto estas páginas de ayuda en línea de ArcGIS:
Entonces, sí, usa el ráster de dirección de flujo, pero ¿qué algoritmo está usando para atravesar el ráster?
Tenga en cuenta que no estoy buscando respuestas en la línea de 'usa D8 ...' ... D8 no es realmente un algoritmo, sino un modelo para ayudar a definir el algoritmo que usaría. Es decir, podría implementar el esquema D8 dentro de un algoritmo de búsqueda de profundidad primero y / o un algoritmo de búsqueda de amplitud
Respuestas:
El método que he implementado en un par de idiomas y creo que utiliza ESRI (lo siento, no hay referencias aparte de Jenson y Domingue citadas en otra parte de esta página) es comenzar en una celda o celda de "punto de fluidez" suministrada por el usuario en el borde de la cuadrícula de dirección del flujo (fdr), examine sus ocho vecinos para encontrar cuál de esos flujos directos en la celda actual y asigne esas celdas a la "cuenca" actual en la cuadrícula de salida. Luego, la función se llama recursivamente una vez para cada uno de los vecinos entrantes. Este proceso se repite hasta que se agoten todas las celdas de entrada para un punto de fluidez, y luego se repetirá para todos los puntos de fluidez.
El diseño del algoritmo recursivo puede ser bastante costoso porque puede terminar tratando de mantener una gran cantidad de datos en la memoria, tener que intercambiar / paginar en el disco y, por lo tanto, generalmente se ralentiza la E / S.
(vea el comentario de whuber a continuación sobre los diferentes métodos de recursión, si va a RYO)
_____________ EDITAR _____________
Saqué mi viejo código C como ejemplo (nota: aunque la mayoría de los pitones pueden querer correr desde la habitación, no debería ser tan malo). Pensé que podría ser de interés ilustrar. Aunque solo ahora soy superficialmente familiar con la recursividad primero en amplitud versus en profundidad, creo que mi rutina es realmente profunda (y que la descripción de mi lenguaje natural anterior fue engañosa) en base a esta publicación de stackoverflow (con suerte @ Whuber u otra persona más inteligente que yo puede confirmar / negar).
Código: explicación:
idir
es la trama de los valores de dirección del flujo.offset
se refiere a la celda central que se está analizando actualmente yoff
verifica cada uno de los vecinos de esa celda. Esto llama a otra función,does_it_flow_into_me
que devuelve un valor booleano en cuanto a si el flowdir de la celda vecina apunta a la celda actual. Si es cierto para un vecino, entonces recurrir a esa ubicación.fuente
La ayuda de ArcGIS dice:
La dirección del flujo se calcula a partir del DEM utilizando el método D8 , donde el flujo se abstrae calculando para cada celda, a cuál de sus 8 vecinos, fluirá el agua de esta celda.
Hay muchas alternativas a D8, como Rho8, Froh8 y Stream Tubes, pero la mayoría del software GIS, incluido ArcGIS, tiende a usar D8, ya que es más simple y menos computacionalmente intensivo que otros.
Hace unos años, estaba trabajando en un proyecto de delineación de cuencas hidrográficas, y nos enfrentamos a varios problemas debido a ArcGIS que utiliza el método D8. Los dos problemas principales fueron
A partir de nuestros datos, sabíamos que estos dos problemas eran grandes, por lo que había desarrollado algunas herramientas para generar direcciones de flujo utilizando métodos híbridos.
Una de mis primeras tareas fue realizar ingeniería inversa en la herramienta de cálculo de captación. Descubrí que era lógicamente bastante simple. Si desea encontrar la cuenca para un punto dado (también llamado punto de fluidez), primero encuentre la celda a la que pertenece. A menudo intentará ajustarlo al punto con la acumulación de flujo más alta en una tolerancia dada.
Para esta celda, encontrará todas las celdas en el vecindario que contribuyen a ella. Para cada una de estas celdas vecinas, encontrará las celdas que contribuyen a ellas, etc. Continúa este proceso iterativo hasta que no encuentres nuevas celdas. Ahí es cuando has llegado a las líneas de la cresta o al límite de la cuenca.
Encontré que mi código simple que hizo esto para los rásteres ASCII, dio un resultado casi similar en comparación con la herramienta Watershed de ArcGIS. A veces solía haber una diferencia de algunas celdas en el límite, por lo que estoy convencido de que ArcGIS sigue un algoritmo D8 no modificado.
fuente
Esto se ha preguntado antes , aunque quizás en un contexto ligeramente diferente. Todas las herramientas de geoprocesamiento en el conjunto de herramientas hidrológicas de Spatial Analyst usan el modelo de dirección de flujo D8 , como se indica en la página Cómo funciona la dirección de flujo :
Una copia del artículo de Jenson y Domingue (1988) está disponible aquí .
Todas las herramientas que usan rásteres de dirección de flujo como entrada utilizan este modelo de dirección de flujo por asociación. Esto incluye la cuenca, la acumulación de flujo, la longitud del flujo, el llenado, etc.
fuente
Para reflexionar más sobre esta pregunta, realicé un análisis de cuenca en arco: tomé un DEM (lleno), calculé la dirección del flujo y coloqué algunos puntos que correspondían a ubicaciones en una red de flujo previamente calculada. Ejecuté la herramienta 'cuenca hidrográfica' y me dio algunas cuencas agradables, que cubren la mayor parte del área restante 'aguas arriba' (como era de esperar):
Luego codifiqué un algoritmo de búsqueda rápida en Python (como la respuesta anterior), que inspecciona la cuadrícula de dirección del flujo y 'sigue' las rutas de flujo. Para cada nodo, inspecciono los 8 vecinos y si un vecino fluye hacia el nodo actual, invoco la misma función recursivamente con el nodo vecino como entrada.
Código pseudo (ish):
Ejecuté esa función usando la misma cuadrícula de entrada de dirección de flujo y uno de los mismos puntos. El problema es que, cuando el arco devuelve una captación de unas 40000 celdas para ese punto, mi algoritmo solo devuelve 72 celdas.
Alguien sabe lo que estoy haciendo mal?
fuente