Encuesta de Centros de Compras

XXIII C ON G R E S O N A C I O N A L
AMH
DE
H I D R Á U LI C A
PUERTO VALLARTA, JALISCO, MÉXICO, OCTUBRE 2014
AMH
USO DE EXCEL EN EL DESARROLLO DE SOFTWARE PARA DELINEAR
CUENCAS HIDROLÓGICAS A PARTIR DE MDE
Martínez Martínez Sergio Ignacio
Universidad Autónoma de Aguascalientes. Av. Universidad No. 940, Ciudad Universitaria, Aguascalientes,
Aguascalientes, México. C.P. 20131
[email protected]
Introducción
Actualmente, la delineación de cuencas hidrológicas se suele
realizar a partir de modelos digitales de elevación (MDE). Los
MDE más comunes son, básicamente, matrices en las que
cada elemento (cuadrado) representa la elevación de una parte
de la superficie terrestre. El proceso de delineación se puede
automatizar
usando
herramientas
geoinformáticas
implementadas en software comercial y/o libre, tales como las
ArcHydro en ArcMap (ESRI WRT, 2013) o las TauDEM
(Tarboton, 2011) en MapWindowGIS (www.mapwindow.
org); o, alternativamente, crearlas ex profeso debido diversas
razones particulares, tales como la necesidad de crear
herramientas propias o resolver problemas de una forma
alternativa. En este trabajo se describe el proceso seguido al
desarrollar prototipos en Excel de parte de las herramientas
DACHydro
(Delineación
Alternativa
de
Cuencas
Hidrológicas), una serie de herramientas que sirven para
delinear cuencas y efectuar procesos relacionados (Martínez,
(2013a y 2013b). Las herramientas DACHydro corren como
un complemento (en inglés, plug-in o add-in) de
MapWindowGIS, que le añade a esta última aplicación,
funcionalidad que originalmente no tenía.
2014) llamado simplemente asc, es un formato en el que la
malla se da en un solo archivo de texto con extensión asc que
puede importarse fácilmente a Excel; de tal manera que los
datos generales que acompañan a la malla se guardan en una
hoja de trabajo (Worksheet) y la matriz de valores se guarda
en otra. Las celdas de la malla se identifican por renglones que
van de arriba a abajo, del renglón 1 al renglón máximo y por
columnas que van de izquierda a derecha, de la columna 1 a la
columna máxima, concordando de esta manera con la
identificación de las celdas de Excel. En el proceso de análisis
de un MDE se pueden crear varias hojas de trabajo adicionales
que representan mallas y que serían el resultado de los
procesos efectuados. La ilustración 1 muestra un MDE que
abarca los alrededores de la cuenca de la presa Media Luna
(localizada en Calvillo, Ags), la salida de la cuenca y la
cuenca delineada con las herramientas DACHydro. La fuente
del MDE fue el Continuo de Elevaciones Mexicano (INEGI,
2013).
Metodología
Algunas veces, el desarrollo de software se puede abordar
escribiendo código prototípico en un lenguaje interpretado
debido a que se quiere observar de manera inmediata los
resultados intermedios de los algoritmos sujetos a prueba. En
el caso de los MDE, un ambiente de programación propicio
para realizarlo es el proporcionado por hojas de trabajo del
programa Microsoft® Excel® y macros desarrolladas en
lenguaje Visual Basic para Aplicaciones (Microsoft® VBA©).
Primero se escogieron o generaron varios MDE
suficientemente pequeños para poder visualizarlos sin mucha
dificultad en la pantalla de la computadora al usarlos como
casos de prueba. En realidad, para el desarrollo de las
herramientas no es necesario que los MDE correspondan a un
lugar de la superficie terrestre, pueden ser simples matrices.
Existen múltiples formatos en los cuales guardar un MDE
como tiff, grid o asc (ESRI, 2014). De hecho los MDE son un
caso especial de un ráster o malla (del inglés raster o grid). En
una malla se pueden almacenar también valores diferentes a la
elevación, tales como dirección de flujo, número de
escurrimiento o precipitación. Los formatos están definidos
por uno o varios archivos, en los que se guardan la matriz de
celdas de valores, el tamaño de las celdas, la extensión de la
malla, las coordenadas de un punto específico, el valor que
señala una celda sin datos (NoData) y el sistema de
coordenadas geográficas en que está referenciado la malla,
entre otros datos. El formato ArcInfo ASCII Grid (ESRI,
Ilustración 1. MDE de la presa Media Luna cuya salida está
localizada en las coordenadas longitud 102°47’18”W y latitud
21°48’26”N.
Se han propuesto diversos algoritmos para delinear cuencas y
hacer operaciones afines a partir de MDE; ver por ejemplo,
(Vieux, 2004) y (Bartak, 2009). En términos generales, el
proceso de delineación de una cuenca abarca los siguientes
subprocesos: el rellenado de hoyos o depresiones, la
asignación de direcciones de flujo y la delineación,
propiamente dicha, a partir de la celda de salida. El rellenado
de hoyos consiste en aumentar la elevación de zonas del MDE
formadas por una o más celdas que no tienen salida; esto es,
que su elevación es más baja que la de cualquiera de las celdas
AMH
XXIII C ON G R E S O N A C I O N A L
DE
H I D R Á U LI C A
PUERTO VALLARTA, JALISCO, MÉXICO, OCTUBRE 2014
que las rodean. Salvo que esas zonas sean depresiones reales,
deberán ser rellenadas para generar un MDE con
comportamiento hidrológico correcto en el que todas las
celdas tengan salida hacia los límites del MDE. El resultado
de este primer subproceso es el MDE con hoyos rellenados
(MHR). El segundo subproceso, la asignación de direcciones
de flujo, produce una malla de direcciones de flujo (MDF); se
realiza tomando en cuenta la dirección de máxima pendiente
descendente de cada celda del MHR. Existen diferentes
métodos para asignar dicha dirección, uno de los más
populares, sencillo y, la mayor parte de las veces satisfactorio,
es el método de las ocho direcciones de flujo, asignadas a las
ocho celdas vecinas a la celda en estudio (O’Callaghan y
Mark, 1984). En este método se asigna una dirección de las
ocho posibles, será la que tiene máxima pendiente; ésta, se
define con:
(1)
donde, Ea es la elevación de la celda actual, Ev, la elevación de
la celda vecina, y lav, la distancia entre los centros de las
celdas. Una vez identificada la pmax se asigna a la celda actual
la dirección correspondiente (por ejemplo: Este = 1, Sureste =
2, Sur = 3, y así, hasta llegar a Noreste = 8). La ilustración 2
muestra como ejemplo, una celda rodeada por sus ocho celdas
vecinas. Calculando las pendientes se encuentra que la
dirección de flujo es igual a 3, debido a que hacia la celda Sur
se tiene la pendiente máxima.
Ilustración 2. Determinación de la dirección de flujo.
Finalmente, la delineación de la cuenca comienza cuando ya
han sido identificadas las direcciones de flujo. Primero se
selecciona la celda de salida y se hace la actual. Se eligen las
celdas vecinas que descargan a la celda actual. Luego, cada
celda elegida se convierte a su vez en la celda actual y se
repite el proceso hasta que ya no se pueden elegir más celdas
que descarguen a la celda actual. En ese punto se ha delineado
la cuenca y se ha guardado en el MDE de la cuenca delineada
(MCD).
Existen diferentes metodologías para realizar el subproceso de
rellenado de hoyos, en este trabajo se implementó un método
basado en el propuesto por Wang y Liu (2006), que además de
rellenar los hoyos (crear el MHR) asigna las direcciones de
flujo (crea la MDF) y obtiene una malla de cuencas cuyas
salidas se localizan en los límites del MDE; o sea, crea la
Malla de cuencas de frontera (MCF). Un refinamiento
posterior del proceso de delineación (Martínez, 2013a), que
se puede usar cuando se tiene un MDE muy grande
comparado con el tamaño de la cuenca, consiste en definir una
parte o buffer del MDE alrededor de la salida de la cuenca,
realizar el proceso, revisar si la cuenca delineada toca la
frontera del buffer; si es así, ajustarlo y volver a delinearla.
Este proceso iterativo termina cuando la cuenca delineada no
toca la frontera del buffer o se han alcanzado los límites del
MDE.
AMH
Los bloques de construcción de una macro en VBA son las
subrutinas o procedimientos (Sub) y las funciones (Function);
consultar, por ejemplo, Microsoft (2006) para ver una
descripción completa de VBA. Los procedimientos y las
funciones manipulan datos convirtiéndolos en resultados; se
valen de ciclos como For-Next o Do-Loop; de estructuras de
control como If-Then-Else-EndIf o Select-Case, y de
innumerables asignaciones de variables igualadas a algún
valor o a una fórmula más o menos compleja. Los tipos de
datos pueden ser simples como los tipos Integer, Long,
Double y String, los arreglos (vectores y matrices) y otros más
complejos que pueden ser definidos por el usuario, como son
los objetos que se pueden implementar en una colección o en
un módulo de clase. Un objeto es algo que representa
cualquier cosa que uno quiera, siempre y cuando pueda ser
descrito conceptualmente. Una colección (Collection) de VBA
proporciona una manera conveniente para representar un
grupo de elementos como un solo objeto. Los elementos de
una colección no tienen por qué ser del mismo tipo, aunque
suelen serlo. Una clase (Class) de VBA se define en un
módulo de clase y sirve como una plantilla para representar un
objeto. Un ejemplo de una colección podría ser una lista de
coordenadas. Dos ejemplos de clase podrían ser la clase Cell y
la clase RasterAscii. La primera podría tener diversas
propiedades de una celda que servirían para almacenar y tratar
como una unidad todos los datos relevantes a la celda, tales
como su elevación, el renglón y la columna donde está, si está
en la frontera del MDE y la cuenca de frontera a la que
pertenece. La segunda clase podría tener las propiedades de
una malla asc, como por ejemplo, su nombre, su número de
columnas y renglones, las coordenadas geográficas de su
esquina inferior izquierda, el tamaño de las celdas, el valor
NoData y los valores asignados a cada una de sus celdas. El
propósito de esta clase sería facilitar cargar a una hoja de
Excel una malla asc o guardar en un archivo de texto una
malla almacenada en una hoja de trabajo de Excel.
A pesar de que se hagan buenos análisis de los problemas por
resolver mediante un procesamiento automatizado, siempre
existe la posibilidad de que el código generado no trabaje
como se esperaba y deba ser corregido, entrando a una
secuencia de pruebas y errores que va ayudando a refinar y
depurar el código. En el caso de la delineación de cuencas, el
desarrollo de código programático se facilita si se usan MDE
suficientemente pequeños como para que sus celdas puedan
ser distinguidas a simple vista en la pantalla de la
computadora y se utiliza un lenguaje interpretado (como el
VBA). El lenguaje interpretado permite, con cierta facilidad,
parar y continuar la ejecución del código, ejecutarlo paso a
paso y observar la evolución de los valores de las variables.
Esta flexibilidad de ejecución ayuda al programador a escribir
código, correrlo, observar los resultados, revisar si son
correctos, corregir el código, volver a correrlo, observar el
efecto que tienen los cambios realizados, revisar si los
resultados son correctos y repetir el ciclo hasta que el
comportamiento de los algoritmos codificados sea
satisfactorio. Por lo menos, un código satisfactorio cumple dos
condiciones: (uno) produce resultados correctos para los casos
de prueba y (dos) los obtiene en tiempos computacionales
razonablemente cortos. Siguiendo el proceso iterativo de
diseño explicado, se llegó a implementar el proceso de
delineación dentro de Excel usando macros VBA.
Luego, a partir de las macros VBA y trabajo adicional no
realizado en Excel, se implementaron las herramientas
XXIII C ON G R E S O N A C I O N A L
AMH
DE
H I D R Á U LI C A
PUERTO VALLARTA, JALISCO, MÉXICO, OCTUBRE 2014
AMH
DACHydro en un lenguaje compilado, el lenguaje Microsoft®
VB.NET®. La implementación se hizo dentro de un
complemento para el programa geoinformático de código
abierto MapWindowGIS. Detalles de esta parte de la
investigación no se muestran en este trabajo, puede
consultarse en Martínez (2013a y 2013b).
Resultados
El desarrollo de los prototipos de código en VBA de esta parte
de las herramientas de delineación DACHydro arrojó que una
sola macro o rutina Sub que llama a otros procedimientos y
varias funciones bastó para implementar el rellenado de hoyos
(creación del MHR), la asignación de cuencas de frontera
(creación de la MCF) y la asignación de direcciones de flujo
(creación de la MDF). Mientras que otra macro fue suficiente
para realizar la delineación de la cuenca a partir de su salida
(Creación del MCD).
En aras de la brevedad solo el resultado de la construcción en
VBA de esta segunda macro se describe aquí. El proceso de
delineación comienza una vez que se haya ejecutado la
primera macro, obteniendo el MHR y la MDF; adicionalmente
se debe contar con las coordenadas del punto de salida o, sea,
el renglón y la columna de la celda de salida. Para realizar la
delineación se implementó una estructura de datos conocida
como cola (First In First Out queue); la cola es una lista en la
que todas las adiciones de datos se hacen en un extremo, y
todas las eliminaciones se efectúan en el otro extremo (Kruse,
1988); haciendo que los elementos que llegan primero a la
lista sean los que primero salen de ella. Específicamente, la
cola se implementó como una colección de renglones y
columnas a la que se le añade un elemento al final de la lista
con la función Queue y se le quita un elemento al principio de
la lista con la función DeQueue (Ilustración 3).
Ilustración 4. Diagrama de flujo del subproceso de delineación de
la cuenca.
Tabla 1. Pseudocódigo del subproceso delineación de la cuenca.
Paso
1
2
3
Function Queue(list As Collection, _
item As Integer)
list.Add item
End Function
Function DeQueue(list As Collection)
Dim deq As Long
deq = list.item(1)
list.Remove 1
DeQueue = deq
End Function
Ilustración 3. Funciones Queue y DeQueue.
El subproceso de delineación de la cuenca, explicado
previamente con palabras, se puede representar también, como
cualquier otro proceso, en otras formas más formalizadas
como podrían ser, un diagrama de flujo o una sección de
pseudocódigo. En ambas representaciones se indican de una
manera simplificada las principales operaciones que se tienen
que realizar al ejecutar el proceso; es decir, al mismo tiempo
en que se oculta un poco la complejidad, se representa con
claridad lo esencial. La ilustración 4 muestra un diagrama de
flujo del subproceso de delineación de la cuenca, formado
esencialmente por la identificación de la celda de salida y por
un ciclo Do-Loop en el que se revisan las celdas de la MDF y
se crea el MCD. A su vez, la representación del subproceso en
forma de pseudocódigo se muestra en la Tabla 1.
4
5
Iniciar
Introducir a la cola las coordenadas de la celda de
salida.
Hacer la celda de salida (la primera celda de la MCD)
igual a la celda correspondiente (de las mismas
coordenadas) del MHR.
Hacer
a. Sacar de la cola las coordenadas de la última celda.
b. Hacer esta celda la celda actual.
c. Para cada una de las ocho celdas vecinas de la celda
actual:
Revisar si descarga a la celda actual.
Si es así:
Introducir sus coordenadas a la cola.
Hacer la nueva celda del MCD igual a la celda
correspondiente del MHR.
De otro modo:
No hacer nada.
Si la cola no está vacía regresar al paso 3.
Rellenar las celdas restantes del MCD con el valor
NoData.
Terminar
El resultado de la codificación del subproceso delineación de
cuenca se muestra en la ilustración 5. Las variables que no se
declaran son variables globales del módulo en el que se
incluyen las dos macros discutidas y con significado ya
explicado; entre ellas, las que designan las mallas MHR, MDF
y MCD. Los valores almacenados o por almacenar en las
celdas de una hoja de trabajo se referencian con la sintaxis:
Worksheets(NombreHoja).Cells(i, j), donde i representa al
renglón y j la columna donde está la celda (Por razones de
espacio, en la ilustración 5 se sustituyó Worksheets por WS).
El símbolo “_” indica que la línea de código continúa en el
siguiente renglón.
XXIII C ON G R E S O N A C I O N A L
AMH
DE
H I D R Á U LI C A
PUERTO VALLARTA, JALISCO, MÉXICO, OCTUBRE 2014
Public Sub DeliCuenca()
Dim i As Integer, j As Integer
Dim k As Byte, df As Byte
Dim dk As Integer
Dim i1 As Integer, j1 As Integer
Dim Cola As New Collection
Case 3, 7
jj = 0
Case 4, 5, 6
jj = -1
End Select
End Function
' Las coordenadas de la celda de
' salida se almacenan en la cola
´ ' "Cola"
Queue Cola, iSal
Queue Cola, jSal
WS(MCD).Cells(iSal, jSal) = _
WS(MHR).Cells(iSal, jSal)
Function ii(dir As Byte)
Select Case dir
Case 1, 5
ii = 0
Case 2, 3, 4
ii = 1
Case 6, 7, 8
ii = -1
End Select
End Function
Do
'
'
i
j
Las coordenadas de la celda
actual son leídas de la cola.
= DeQueue(Cola)
= DeQueue(Cola)
' Se revisan las ocho celdas vecinas
' de la celda actual desde el Oriente
' hasta el Nororiente en sentido de
' las manecillas del reloj.
For k = 1 To 8
i1 = i + ii(k)
j1 = j + jj(k)
If i1 < 1 Or i1 > imax Or _
j1 < 1 Or j1 > jmax Then
' celda fuera del MDE
' No hacer nada
Else
df = WS(MDF).Cells(i1, j1)
If df <> 0 Then
dk = df - k
If Abs(dk) = 4 Then
Queue Cola, i1
Queue Cola, j1
WS(MCD).Cells(i1, j1) = _
WS(MHR).Cells(i1, j1)
End If
End If
End If
Next k
Loop While Cola.Count > 0
' Llenar con NoData las celdas
' restantes del MCD
For i = 1 To imax
For j = 1 To jmax
If WS(MCD).Cells(i, j) = "" Then
WS(MCD).Cells(i, j) = NoData
End If
Next j
Next i
End Sub
Ilustración 5. Subrutina Delineación de la cuenca.
En la ilustración 5 aparecen dos funciones que dan las
coordenadas relativas de las celdas vecinas con respecto a las
de la celda actual; su codificación en VBA se da en la
ilustración 6.
Function
Select
Case
jj
jj(dir As Byte)
Case dir
1, 2, 8
= 1
AMH
Ilustración 6. Funciones para dar las coordenadas relativas de las
celdas vecinas.
Discusión
Las dos macros que realizan los subprocesos para la
delineación de cuencas fueron la semilla para desarrollar las
versiones compiladas de las mismas. Aunque en este trabajo
solo se muestra el detalle de la segunda macro, llamada
DeliCuenca, es suficiente para demostrar que efectivamente el
uso de hojas de trabajo de Excel y de macros en VBA que
manipulen las hojas, sirve para comenzar a desarrollar
herramientas para realizar análisis de mallas de datos
geográficos. Entre las mallas, son de interés especial los MDE,
pues sirven para efectuar análisis hidrológicos.
Las modificaciones esenciales de los códigos prototípicos
creados al pasar de una versión de Basic (VBA) a otra
(VB.NET) fueron pequeñas. Sin embargo, se tuvo que hacer
trabajo adicional debido a nuevos requerimientos de la versión
compilada, pues la implementación de las herramientas se
tenía que hacer como un complemento que se guarda en un
archivo ejecutable que puede ser activado al correr el
programa MapWindowGIS (MapWindow, 2013a y 2013b).
Además, el propio programa MapWindowGIS permite realizar
funciones geoinformáticas que no pueden hacerse en Excel.
Otra ventaja que conviene enfatizar es que el programa
geoinformático MapWindowGIS es no comercial y de código
abierto, lo que hace atractivo crear complementos para
añadirle funcionalidad sin que los desarrolladores ni los
usuarios finales tengan que comprar licencias de software
comercial para poder utilizarlos.
Conclusiones
El uso de un ambiente de programación interpretado, VBA
implementado en Excel, sencillo y accesible para
programadores principiantes o intermedios, ha demostrado su
utilidad al ayudar a generar códigos prototípicos de
herramientas especializadas, sin requerir nada más que ese
programa ampliamente disponible. Luego, la transformación
del código a un lenguaje muy parecido pero compilado, dando
origen a varias herramientas contenidas en las DACHydro,
demuestra lo útil que puede ser este enfoque. Las herramientas
DACHydro siguen en desarrollo, actualmente se está
mejorando la delineación iterativa, se está tratando de hacer
que su ejecución sea más eficiente, evitando en lo posible la
repetición de operaciones realizadas en iteraciones previas.
AMH
XXIII C ON G R E S O N A C I O N A L
DE
H I D R Á U LI C A
PUERTO VALLARTA, JALISCO, MÉXICO, OCTUBRE 2014
Adicionalmente, trabajo futuro puede incluir el desarrollo de
nuevas herramientas que complementen las ya implementadas.
Referencias
BARTAK, V., How to Extract River Networks and Catchment
Boundaries from DEM: a Review of Digital Terrain Analysis
Techniques. Journal of Landscape Studies 2, 2009, pp. 57-68.
ESRI, Supported raster dataset file formats. [en línea] [citado
el 24 de agosto de 2014]. Disponible para World Wide Web:
http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/
Supported_raster_dataset_file_formats/009t0000000q000000/
ESRI WATER RESOURCES TEAM (ESRI WRT), Arc
Hydro Tools Overview. Version 2.0. [en línea] [citado el 6 de
abril de 2013]. Disponible para World Wide Web:
http://downloads.esri.com/blogs/hydro/ah2/arc_hydro_tools_2
_0_overview.pdf.
INSTITUTO
NACIONAL
DE
ESTADÍSTICA
Y
GEOGRAFÍA (INEGI), Continuo de elevaciones mexicano
CEM 2.0. [en línea] [citado el 24 de mayo de 2013].
Disponible para World Wide Web:
http://www.inegi.org.mx/geo/contenidos/datosrelieve/continen
tal/continuoelevaciones.aspx.
KRUSE, R.L., Estructuras de datos y diseño de programas.
Primera ed., México: Prentice Hall Hispanoamericana, 1988,
488 pp.
MAPWINDOW [Ref a], Write MapWindow GIS Plugins. [en
línea] [citado el 6 de abril de 2013]. Disponible para World
Wide Web:
http://www.mapwindow.org/apps/wiki/doku.php?id=write_plu
gins#ducumentation.
MAPWINDOW [Ref. b], MapWindow Project Overview. [en
línea] [citado el 7 de abril de 2013]. Disponible para World
Wide Web:
http://www.mapwindow.org/apps/wiki/doku.php?id=project_o
verview.
MARTÍNEZ, S. I. [Ref. a], Acercamiento a la delineación
iterativa de cuencas utilizando modelos digitales de elevación,
Memoria de resúmenes del 14o. Seminario de Investigación,
Universidad Autónoma de Aguascalientes, 20-22 mayo 2013,
pp. 168-175.
MARTÍNEZ S. I. [Ref. b], Uso de mapas mentales para la
creación del complemento DACHydro para MapWindow.
Convergencias del diseño y de la construcción. Arquitectura,
ingeniería civil y urbanismo, Universidad Autónoma de
Aguascalientes, Vol. III, pp. 242-255.
MICROSOFT, Referencia del programador de Microsoft
Office Excel 2007 (Parte de la ayuda de Microsoft Excel
2007). Redmond WA: Microsoft Corporation, octubre 2006.
O’CALLAGHAN, J.F., MARK, D.M., The extraction of
drainage networks from digital elevation data. Computer
Vision, Graphics, and Image Processing, Vol. 28, Num. 3,
1984, pp. 323-344.
TARBOTON, D., Terrain Analysis Using Digital Elevation
Models (TauDEM) [en línea] [citado el 12 de Agosto de
2011]. Disponible para World Wide Web:
http://hydrology.usu.edu/ taudem/taudem5.0/.
AMH
VIEUX, B.E., Distributed Hydrologic Modeling Using GIS.
2nd ed., Water Sciences and Technology Library, Dordrecht:
Kluwer Academic Publishers, 2004, 289 pp.
WANG, L., and LIU, H., An Efficient Method for Identifying
and Filling Surface Depressions in Digital Elevation Models
for Hydrologic Analysis and Modelling, International Journal
of Geographical Information Science, Vol. 20, Num. 2, 2006,
pp. 193-213.