SlackBuild para Quantum GIS 1.8.0 en Slackware 14

He estado trabajando mucho con QGIS últimamente, sin embargo en mi trabajo uso QGIS 1.8.0 (en Windows) y en mi casa QGIS 1.7.4 (en Slackware) por lo tanto pierdo compatibilidad en mis proyectos al pasarlo de una máquina a otra.

Dada esta situación, me di un tiempo para actualizar el QGIS de mi laptop. Lo primero con que me topé fue que no encontré un paquete compilado de la versión 1.8.0 para Slackware y tampoco un SlackBuild. La opción fácil hubiese sido convertir un paquete rpm, o usar la compilación «manual» (make && make install), sin embargo decidí otra aún más fácil que me ayudaría a administrar el paquete nativamente con las herramientas de Slackware: modificar el SlackBuild existente.

Gracias al tipo de licencia en la que se encuentra el script es posible tomar el código como base y modificarlo para obtener lo que uno necesita. Aquí es cuando el verdadero valor del software libre y de fuente abierta es apreciado.

Como no he escrito un SlackBuild, no tengo la experiencia necesaria para hacer uno para Quantum GIS, lo único que he hecho con estos scripts ha sido estudiarlos un poco y por lo tanto se mas o menos como modificarlos.

INICIANDO

Modifiqué el script y lo ejecuté, en mi primer intento obtuve errores como los siguientes:

CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
SPATIALITE_INCLUDE_DIR
used as include directory in directory /tmp/SBo/qgis-1.8.0/src/plugins/offline_editing
SPATIALITE_LIBRARY`
linked by target "offlineeditingplugin" in directory /tmp/SBo/qgis-1.8.0/src/plugins/offline_editing

-- Configuring incomplete, errors occurred!

Para solucionarlos se necesita instalar dos librerías: libspatialindex y libspatialite. Así que instalé la primera.

# sbopkg -ri libspatialindex

Esto disminuyó el número de errores en la segunda ejecución del SlackBuild y confirmé que instalar las librerías tenia éxito, así que fui con la siguiente. libspatialite que requiere proj, geos (ambos ya instalados) y frexl, así que solo ejecuté sbopkg para instanlar lo que necesitaba.

# sbopkg -i "freexl libspatialite"

Como falló la descarga del código fuente, lo descargué de aqui: http://www.gaia-gis.it/gaia-sins/freexl-sources/ , escogí el archivo que tiene la letra «d» ya que es el que está en el sitio de SlackBuilds.

Extraer el código fuente, ejecutar manualmente el SlackBuild…

$ tar -xvzf freexl.tar.gz

$ cd freexl

# ./freexl.Slackbuild

…y finalmente instalar el paquete:

# installpkg /tmp/freexl-1.0.0d-i486-1_SBo.tgz

Ahora si instalar lo que queríamos.

# sbopkg -i libspatialite

FINALMENTE QGIS

Ya que se instalaron los requerimientos de compilación, descargué el SlackBuild de Quantum GIS del sitio de SlackBuilds, primero tuve que cambiar el número de la versión a 1.8.0, luego comentar/eliminar la parte de la aplicación de un parche para la versión 1.7.4 y cambiar la palabra «CHANGELOG» por «ChangeLog» en el SlackBuild (en las últimas líneas de código).

$ tar -xvjf qgis-1.8.0.tar.bz2

$ cd qgis

# ./qgis.SlackBuild

# installpkg /tmp/qgis-1.8.0-i486-1_eco.tgz

Ejecuté el SlackBuild de QGIS y luego instalé el paquete, esta es la prueba de mi éxito:

qgis18

DESCARGA

Se que tal vez haya pocos interesados en lo mismo que yo, sin embargo, si alguno de ustedes desea usar el SlackBuild modificado, he decidido compartirlo y lo pueden encontrar en: https://github.com/ecoslacker/Slackware-Hacks

Claro que esto solo está probado en mi computadora con Slackware 14 x86 o de 32 bits, úsalo bajo tu propio riesgo pues es la primera cosa que hago por el estilo.

PD: Hay un error que hace que Quantum GIS se cierre al dar click en el menú About o Acerca de, aún no se como solucionarlo pero ando investigando.

Saludos

Dividir linea de capa vectorial en QGIS

Dividir una linea en QGIS es bastante sencillo, lo primero que debemos hacer es cargar el archivo en donde esta nuestra víctima y seleccionarla, para ello tenemos la opción Seleccionar objetos espaciales individuales que se encuentra en la barra de herramientas de Atributos o en el menú Ver > Seleccionar > Seleccionar objetos espaciales individuales y hacer clic con el cursor en la linea.

En mi caso es una linea que representa un canal de una unidad de riego que se encuentra en un shapefile llamado Canales.shp la cual quiero dividir en dos partes.

Seleccionando la línea a cortar

En la imagen anterior se puede ver la línea seleccionada de color amarillo. Y en la imagen siguiente se puede ver la tabla de atributos (sin atributos llenos jeje) de la capa con la línea seleccionada.

Atributos de la linea seleccionada

Para proceder con la división ir al menú Capa > Conmutar edición (con la capa seleccionada) apareceran unas pequeñas cruces sobre las líneas que indican que se está editando, y luego dar en Edición > Dividir objetos espaciales. El cursor cambiará a un circulo con una cruz.

Herramienta para dividir objetos espaciales.

Colocarse con el cursor cerca del punto en el que se desea dividir la línea y dar clic a un lado de la línea y se marcará un punto de inicio de una linea roja, con esta linea roja cruzar la que deseamos cortar y estando del otro lado con el cursor dar clic derecho. Si se tiene activado el autoensamblado hay que deshabilitarlo para que no cause problemas.

Dividiendo una linea.

Solo resta guardar la edición y listo con esto ya tendremos dos lineas separadas a partir de una, en una capa vectorial.

Linea dividida en dos.

En la tabla de atributos encontraremos dos elementos con las mismas características después de hacer la división.

Atributos de las nuevas lineas.

Solo resta llenar la tabla con los atributos correctos, usando para ello la opción de Conmutar edición en la capa.

Keep working.

Importar archivo KML en QGIS (como SHP)

Para importar un acrchivo KML creado por  GoogleEarth a QGIS hay que hacer unos trucos muy sencillos, dependiendo de lo que se desee hacer, en este ejemplo muestro como yo lo hago, para ello estoy usando QGIS 1.7.4 Wroclaw con GRASS 6.4 en Slackware Linux 14.0 instalados desde SlackBuilds con todas las dependencias.

Primero se crea el archivo desde GoogleEarth, en mi caso es un archivo de rutas (canales) digitalizadas y guardadas como KML desde el mismo programa. Es importante mencionar que puede haber problemas con el archivo generado por GoogleEarth si la versión de la aplicación es muy vieja por lo que se recomienda usar una versión reciente.

Digitalizando en GoogleEarth

Además hay que asegurarse de guardar el archivo en formato KML, pues por omisión el programa lo guardará en un KMZ, éste último no es más que un archivo KML comprimido por lo tanto con descomprimirlo bastará para tener un KML que regularmente se llama doc.kml. En Windows puede que sea necesario cambiar la extensión del archivo por ZIP (o alguna otra) antes de realizar la descompresión. En Linux hay muchas herramientas para realizar esto, por mi parte elegí hacerlo con Ark de KDE (incluye unrar y p7zip):

Extraer archivo KMZ

Ya que se tiene este archivo se puede agregar directamente el KML mediante el menú de QGIS Capa > Añadir capa vectorial y seleccionando en la ventana el filtro para Keyhole Markup Language [KML] [OGR].

Abrir KML

Otra forma de agregar los datos es haciendo una conversión de KML a SHP. ¿Por qué? bueno por cuestiones de edición, para mí es más fácil y cómodo editar un shapefile y los KML son más bien para visualizar información, además un SHP es el estándar de facto para representar vectoriales así que bien puedo manejar mis datos en diferentes programas y sistemas operativos.

Para hacer la conversión basta hacer en el terminal:

$ ogr2ogr -f 'ESRI Shapefile' Canales.shp doc.kml

Conversion de KML a SHP

Ahora si se puede agregar y editar la capa más cómodamente.

Datos en QGIS

NOTA: Al parecer QGIS es capaz de reconocer archivos KMZ de manera automática siempre y cuando se tenga soporte para el Google LIBKML en GDAL (1.9). Si se tiene entonces al importar una capa solo hay que seleccionar Todos los archivos (*) y abrir el KMZ. Si no se tiene saldrá un error. Para checar si se tiene este soporte (creo que debería poderse agregar durante la compilación, la verdad lo ignoro) en la consola de Python de QGIS ejecutar:

import osgeo.ogr
print 'Has LIBKML ogr driver: ' + str(osgeo.ogr.GetDriverByName('LIBKML') is not None)

Fuentes:

Hilo en stackexchange

Usar partición de Windows en VirtualBox

Por las razones que sea a veces es necesario usar un dual boot, en mi caso después de unos años usando solo Slackware y una máquina virtual de Windows XP me ví en la necesidad de instalar Windows 7 por cuestiones de rendimiento del equipo y falta de recursos para una memoria RAM.

Con los sencillos pasos siguientes se puede ejecutar la partición de Windows de nuestro dual boot como si fuera una máquina virtual, sin la necesidad de tener que reiniciar para buscar «ese archivo» o ejecutar «esa aplicación». Además ahorra tener que estar instalando todo el software de Windows una maquina virtual.

OPCIÓN 1

Teniendo instalado el VirtualBox en Slackware (instalado con el binario .run), se ejecuta con permisos de root la instrucción:

# VBoxManage internalcommands createrawvmdk -filename /home/eduardo/.VirtualBox/win7.vmdk -rawdisk /dev/sda -relative

Con ello se crea una nueva unidad vmdk de virtualbox y se enlaza al disco duro sda. El nombre «win7» es opcional y puede cambiarse. Para que un usuario normal pueda acceder a dicha unidad hay que darle los permisos correctos.

# chmod 666 /home/eduardo/.VirtualBox/win7.vmdk

OPCIÓN 2

En recientes versiones el método anterior me da un error de permisos que por alguna extraña razón (noob) no se presentaba antes, el error consiste en:

Permission problem accessing the file for the medium '/home/eduardo/.VirtualBox/win7.vmdk' (VERR_ACCESS_DENIED)

Lo que significa que como usuario normal no se puede acceder al disco duro creado, solo root puede. Sin embargo se soluciona de la siguiente manera, primero hay que colocar a nuestro usuario en el grupo disk:

# usermod -a -G disk eduardo

Luego cerrar sesión y volver a entrar, y como usuario normal ya se tienen privilegios para crear el disco duro:

$ VBoxManage internalcommands createrawvmdk -filename /home/eduardo/.VirtualBox/win7.vmdk -rawdisk /dev/sda -relative

Eso es todo.

Mi carpeta de usuario es eduardo, tienes que cambiar esa parte por el nombre de la tuya. Ahora en VirtualBox se crea una nueva máquina virtual y cuando pida crear un nuevo disco duro hay que seleccionar el creado anteriormente en el directorio /home/eduardo/.VirtualBox/win7.vmdk.

Nueva maquina virtual

Disco virtual

En esta ventana elegir la opción Usar disco duro existente y dar clic en el botón para explorar el sistema de archivos y elegir el disco duro.

Ver archivos ocultos

Elegir disco de Windows

Crear máquina

Listo, ahora al iniciar la máquina virtual aparecerá el mismo menú de LILO que pide seleccionar el sistema operativo (pues en realidad se está arrancando desde el disco duro). Es importante seleccionar Windows pues ejecutar Slackware desde Slackware, la verdad no se que consecuencias pueda tener pero no creo que sean muy buenas. Lo que si hay que instalar son los GuessAdittions para que reconozca el tamaño de pantalla y la integración del ratón, sin embargo la configuración al bootear desde Windows normalmente no se ve afectada.

Menú de LILO

Y este es el maldito programa que uso en el trabajo que me obliga a tener que reiniciar en Windows para usarlo al procesar algo pesado y ocupar todos los recursos de la máquina, y me obliga a usar la máquina virtual para consultas rápidas y visualización de los mapas ya elaborados. Usar QGIS ha sido una opción viable pero «el trabajo en equipo» me limita por ahora pues los famosos MXD no son estándar, en fin…

Partición de Windows en VBox

Saludos Slackers.

Obtener area de polígono de GoogleEarth con QGIS

Muchas veces necesitamos obtener un área de un polígono digitalizado en Google Earth, y para ello tenemos de dos sopas. La primera es que tengamos la versión «Pro» de paga del Google Earth, para lo cual hay que pagar por ella, usando la regla de la barra de herramientas se puede digitalizar el polígono y obtener su área directamente. La otra es usando alguna otra aplicación independiente lo cual es más tardado pero al fin de cuentas es lo mismo. Dado que no tengo la versión de paga del Google Earth  he tenido que usar QGIS para obtener las áreas de mis polígonos. El método es el siguiente:

Primero hay que digitalizar los polígonos en el Google con la herramienta Agregar polígono, en mi caso son una explanada, pasillos y estacionamientos.

Poligonos digitalizados en Google Earth

Poligonos digitalizados en Google Earth

Luego guardarlos dando clic derecho en el polígono creado en la sección Lugares y aparecerá un menú en el que hay que seleccionar Guardar lugar como…, dar un nombre y guardar en formato KML.

Abrir los polígonos con el QGIS, mediante la opción de Añadir capa vectorial y en el cuadro de diálogo dar clic en Explorar y en el filtro seleccionar Keyhole Markup Language [KML] [OGR]. Buscar las capas y abrirlas.
Ya que están abiertas las convertí a shapefile en la sección Capas dando clic derecho sobre la capa y seleccionando Guardar como….

Exportar polígonos a shapefile

Exportar polígonos a shapefile

Seguidamente dar un nombre y ubicación a la capa, verificar que se guarde como Archivo shape de ESRI.

Guardar polígonos como shape.

Guardar polígonos como shape.

Es necesario activar la opción Configuración > Propiedades del proyecto > Activar transformación de SRC al vuelo lo cual permite cambiar las capas de sistema de coordenadas fácilmente. Se cambia el Estado del SRC, dando clic en el ícono que se encuentra en la esquina inferior derecha de QGIS. En la ventana que se abre seleccionar Sistema de coordenadas proyectadas y luego Universal Transverse Mercator (UTM) finalmente WGS 84 / UTM zone 14N (en mi caso). Dar clic en Aceptar.

Una vez que se han convertido, se agregan las capas shape, opcionalmente se pueden eliminar las KML de QGIS.

Establecer estado de SRC

Establecer estado de SRC

Ahora cambiar el sistema de coordenadas de las capas vectoriales digitalizadas en Google Earth, esto mediante el establecimiento de un SRC diferente. Para ello se da clic derecho en la capa y  seleccionar la pestaña Guardar como… y en SRC cambiar el SRC original de la capa mediante el botón explorar y seleccionar UTM como anteriormente: seleccionando Sistema de coordenadas proyectadas después Universal Transverse Mercator )UTM) y finalmente WGS 84 / UTM zone 14N. Personalmente para no perderme le agrego el sufijo «_utm.shp» al nombre de la capa y listo, se guarda y se agrega a QGIS.

Cambiar el SRC de la capa

Cambiar el SRC de la capa

Antes de obtener el área de los polígonos hay que verificar algunas cosas en Configuración > Opciones y la pestaña Herramientas de mapa. Verificar que las unidades sean metros, dejar 3 lugares decimales y que el elipsoide de medición sea el WGS 84.

Opciones del proyecto

Opciones del proyecto

Finalmente para obtener el área dar clic derecho en la capa deseada y abrir su tabla de atributos, seleccionar Conmutar el modo edición (el icono de la navaja azul) y se observa como se activa el icono de la calculadora, darle clic para Abrir la calculadora de campos y en la ventana que se abre en Nombre del campo de salida poner «AREA» en Tipo del campo de salida seleccionar Número decimal (real) y en precisión poner 2 decimales. Clic en el botón area y se escribirá «$area» en el la Expresión de la calculadora de campos, listo ya solo al dar Aceptar se hará el cálculo.

Calculando el área del polígono

Calculando el área del polígono

Área de polígono calculada

Área de polígono calculada

Finalmente aparece la columna con el valor del área en metros cuadrados. Si se desea obtenerlo en hectáreas sólo es necesario dividir el valor entre 10,000 y la expresión sería: $area/10000. Ahora al cerrar la tabla de atributos hay que dar de nuevo clic derecho en la capa para conmutar el modo edición y guardar los cambios.

Saludos, espero que les sirva algo tan sencillo.

Polígonos con área

Polígonos con área

Crear shape de lineas a partir de puntos en QuantumGIS

En la entrada pasada puse una forma de meter puntos desde un archivo de texto delimitado en QuantumGIS, ahora en complemento pongo el ejemplo de como hice una capa vectorial de lineas en formato shapefile a partir de los puntos existentes tomándolos como vértices. Una vez importados los puntos se tiene algo como esto:

Puntos base

Puntos base para archivo shape de lineas

Ahora lo que hay que hacer es crear la nueva capa vectorial de lineas, para ello se sigue la siguiente ruta en el menú:

Crear nueva capa shape

Crear nueva capa shape

Y aparece una ventana como la siguiente:

Propiedades del nuevo shape

Propiedades del nuevo shape

Hasta arriba hay que indicar que Tipo se shape se desea, en mi caso seleccione Línea y se nos permite crear los atributos para la Tabla de atributos de la nueva capa, solo hay que poner el nombre del atributo y en Tipo hay que seleccionar si será de texto, números enteros o decimales; en cualquier caso hay que poner la anchura y/o precisión que se necesite tener. Con ello ya se tiene la nueva capa vectorial creada.

Abrir la nueva capa, y asegurarse de que se tiene activa la barra de herramientas de digitalización, sino se tiene activada hay que dar clic derecho en una parte de la barra de herramientas vacía y marcar la opción Digitalización.

Mostrar la barra de digitalización

Mostrar la barra de digitalización

Una vez que se ha marcado la opción aparece la barra de herramientas de digitalización.

Barra de digitalización

Barra de digitalización

Para empezar a editar hay que marcar en el primer icono azul, que se llama Conmutar edición y que parece un plumón azul, para ello hay que asegurarse de tener seleccionada la capa correcta que se desea editar. Cuando se da clic en este icono se observa que algunos de los otros iconos se activan también. Este procedimiento es el equivalente a hacer Start / Stop editing en ArcView y ArcGIS, sin embargo me resultó más sencillo hacerlo en QGIS pues solo se edita la capa que se tiene seleccionada. Para guardar los cambios hechos en la edición se tiene el icono de al lado, que está representado con la típica imagen para guardar. Hay que tener cuidado de no confundir con el otro icono para guardar el proyecto.

Barra de digitalización activada

Barra de digitalización activada

Dado que el trabajo consiste en hacer lineas tomando como vertices los puntos existentes en otra capa, es altamente probable de que si se crean lineas «a ojo» no con el ratón no se marque exactamente el punto sino un lugar visiblemente cercano. Para evitar eso en ArcGIS se usa la herramienta Snapping en la que se seleccionan las capas que sirven de guía. En QGIS se tiene una herramienta que cumple la misma función y se llama Autoensamblado, para activarla hay que ir al menú Configuración > Opciones de autoensamblado:

Opciones de autoensamblado

Opciones de autoensamblado

Se abre una ventana como la siguiente en la que hay que marcar la capa que servirá como guía de autoensamblado (o snapping como se llama la herramienta en ArcGIS) esto en la primera columna, en la segunda columna llamada Modo hay que seleccionar hacia que se desea hacer el autoensamblado las opciones son: vértice, segmento o ambos. La tolerancia de la tercera columna, es la exactitud que se aceptará para hacer clic cerca del punto y que éste se seleccione automáticamente. En el caso de mi imagen si yo doy clic alrededor del punto dentro de una circunferencia de hasta tres unidades (también se pueden elegir pixeles) de radio, el programa toma exactamente las coordenadas del punto más cercano y se posiciona sobre dicho punto.

Ventana de opciones de autoensamblado

Ventana de opciones de autoensamblado

Ya que se ha configurado el autoensamblado, se procede a crear las líneas que van a componer el shape y para ello se utiliza la opción de Añadir linea la cual es el tercer icono de la barra de herramientas de digitalización.

Añadir linea

Añadir linea

Para la creación de las líneas simplemente hay que acercar el cursor al primer punto que será el inicio de la primera línea, al acercar el cursor al punto y dependiendo de la tolerancia que se le haya puesto al autoensamblado el cursor será «jalado» hasta las coordenadas exactas del punto más cercano. Para usar el punto se hace clic e inmediatamente se forma una linea desde ese punto hasta el cursor en movimiento y para completarla hay que seleccionar otro punto de la misma forma.

Dibujar lineas

Dibujar lineas

Finalmente se pueden ir creando varias lineas finalizando cada una con un doble clic y colocando un identificador y los atributos que se hayan agregado al inicio del proceso en la ventana que aparece.

Shape de lineas finalmente creado

Shape de lineas finalmente creado

Conclusión

El autoensamblado es una función muy útil para cuando se necesita tener exactitud en la creación de líneas que coincidan con ciertos vértices o puntos, para hacer un shape con base en un conjunto de puntos es necesario tener activada y correctamente configurada ésta función. Es muy usada por ejemplo para trazar un camino o ruta, límites de un terreno, un recorrido … etcétera, a partir de un conjunto de puntos tomados, por ejemplo con GPS.

Importar coordenadas x,y en QuantumGIS

Hasta ahora he trabajado poco con QuantumGIS (o QGIS), sin embargo cada vez que lo abro para hacer cualquier cosa por más sencilla que esta sea, siento que de verdad disfruto aprender a usarlo por el entorno tan amigable que ofrece y es por eso que no me dan ni un poquito de ganas de regresar a las aplicaciones privativas que usaba antes.

En esta entrada les presento una forma muy sencilla de importar coordenadas X,Y en un archivo de texto delimitado. Las coordenadas de mi ejemplo son UTM para la Zona 14 de México, en el estado de Michoacán, tomadas con un GPS Garmin en campo las cuales me enviaron en un archivo de hoja de cálculo en formato xlsx por correo electrónico.

Importando coordenadas XY

Primero hay que dar el formato necesario de tres columnas. En la primera se escribe el nombre de los puntos da cada par de coordenadas. En la segunda columna se colocan las coordenadas en X y en la tercera se colocan las correspondientes a Y. En la primera fila se pueden colocar títulos como «Nombre», «X» y «Y» para identificar correctamente a las tres columnas, es importante no dejar filas vacías.

Coordenadas X,Y

Coordenadas X,Y

Ya que se ha dado el formato correcto en la hoja de cálculo hay que guardar el archivo como Texto CVS para que automáticamente se obtenga un archivo de texto plano en el que los datos de cada una de las tres columnas esté separado por comas. Listo con ello ya se tiene el archivo preparado.

Ahora hay que abrir QuantumGIS y activar el complemento para importar texto delimitado, haciendo clic en el menú Complementos > Administrar complementos y en la ventana que se abre marcar la opción Añadir capa de texto delimitado, como se muestra en la figura.

Añadir capa de texto delimitado

Añadir capa de texto delimitado

Ya que se tiene activado el complemento, hay que buscar el mismo icono azul en la barra de herramientas para utilizarlo.

Icono del complemento

Icono del complemento

A continuación se abre una ventana en la que hay que buscar el archivo dando clic en Explorar… y llendo hasta donde éste se encuentre, hay que dar también un nombre a la capa que se agregará en QGIS y, si el archivo es CVS, seleccionar la opción Delimitadores seleccionados y marcar Coma, si se desea se pueden marcar más de una opción. En la parte baja de la ventana se mostrará una vista previa de las modificaciones que se hagan.

Importando el archivo de texto delimitado

Importando el archivo de texto delimitado

Finalmente los puntos aparecen dentro del QGIS como una nueva capa a la que pueden hacerse varias operaciones como por ejemplo ver su tabla de atributos dando clic en el icono correcto en la barra de herramientas.

Capa de puntos agregada y su tabla de atributos

Capa de puntos agregada y su tabla de atributos

Los datos se pueden exportar en varios formatos disponibles, si se desea por ejemplo exportar en formato shapefile solo hay que dar clic derecho en el nombre del layer mostrado en la parte de Capas del QGIS y seleccionar Guardar como…, luego en la ventana que aparece seleccionar el formato que para el ejemplo es Shape de ESRI y la ruta, luego escribir el nombre con el que se desea guardar el archivo y dar en Aceptar. Aparecerá un mensaje de confirmación cuando se haya terminado de guardar.

Guardando el archivo vectorial

Guardando el archivo vectorial

Una vez exportados e puede agregar la capa shape para verla en conjunto con los puntos agregados. Se puede notar que no hay diferencia alguna en cuanto a lo que ambas representan.

Capa vectorial shape agregada.

Capa vectorial shape agregada.

Saludos.

Delimitar una cuenca hidrológica con herramientas OpenSource en Linux

Hace ya unas semanas me propuse encontrar la forma de hacer mis trabajos que regularmente hago con software privativo como ArcGIS, con herramientas Open Source y hacer una pequeña demostración de las capacidades que tienen tales aplicaciones y de la facilidad de su uso. En esta entrada presento un método para delimitar una cuenca hidrológica (Cuenca de Metztitlán en el estado de Hidalgo, México) usando la distribución ArchLinux, con la potencia de análisis que tiene el software GRASS mediante la facilidad que proporciona QuantumGIS.

Instalando las herramientas

La instalación de las herramientas necesarias para ArchLinux ya se explicó en un post anterior y realmente es muy sencilla, así que solo me limitaré a decir que las herramientas usadas son:

  • ArchLinux
  • GRASS 6.4
  • QGIS 1.7 (con el plugin para usar GRASS)
  • Además se necesita el Modelo Digital de Elevaciones de INEGI

Descargando el Modelo Digital de Elevaciones (MDE)

El modelo digital de elevaciones que se utilizó se descargó del sitio de INEGI siguiendo la ruta Geografía > Datos de relieve > Continental > Continuo de elevaciones mexicano CEM (2.0) – descarga > Descargar donde se abrirá una página en la que se tienen que introducir las coordenadas geográficas de los límites del área de estudio donde se encuentra la cuenca por delimitar. También es posible descargar la carta a escala 1:50,000 en la que se encuentra la cuenca, si se conoce el nombre de la carta (para saber la nomenclatura de las cartas visitar este sitio), y una tercera opción es descargar todo el estado en el que está la cuenca. Si se va a utilizar la segunda o tercera opción hay que asegurarse de que la cuenca se encuentre solo en una carta o en un estado, en caso de que la cuenca atraviese dos o mas cartas se pueden descargar todas ellas, lo mismo para cuando atraviesa dos o mas estados. Sin embargo es bueno descargar solo la porción que contiene la cuenca con la primera opción de descarga, la única complicación es saber las coordenadas extremas de la misma.

Descarga del MDE del sitio de INEGI

Descarga del MDE del sitio de INEGI

Cuando ya se hizo la selección de la descarga hay que dar clic en Procesar selección y se abrirá una página con información de la selección que se hizo anteriormente con un archivo comprimido en formato ZIP que contiene el MDE, hay que descargarlo dando clic derecho y seleccionando Guardar enlace como…. Se extrae el comprimido en un directorio y se encontrarán varios archivos:

  • bil
  • blw
  • hdr
  • prj

El archivo BIL es el que se puede abrir con QGIS y el programa lo reconocerá.

Crear una localización y conjunto de mapas

Para manejar la información y trabajar con GRASS es necesario crear una base de datos en donde se tenga el conjunto de capas deseadas. Una base de datos de GRASS es simplemente un directorio en el que se guardan locations (localizaciones) y mapsets (conjuntos de mapas). Se pueden tener todas las bases de datos que se deseen, para usar GRASS generalmente se crea una llamada grassdata en la carpeta personal: home/usuario.

En este caso se creará la base de datos con el plugin de QGIS-GRASS el cual permite usar los módulos de GRASS desde el ambiente amigable de QGIS. Para activar el plugin se abre QGIS y se va al menú Complementos > Administrar complementos… en donde se tiene que marcar el que se llama GRASS, yo personalmente activo todos.

Activando el plugin de GRASS en QGIS

Activando el plugin de GRASS en QGIS

Cuando se tenga activado el complemento se puede seguir con la creación de la base de datos. Dar clic en el icono Añadir capa ráster en la barra de menú de QGIS y buscar el ráster que se descargó de INEGI y seleccionar el archivo en formato BIL y abrirlo. Una vez cargado, para crear la base de datos selecciona el menú Complementos > GRASS > Nuevo directorio de mapas y se abrirá una ventana que pedirá crear o seleccionar una carpeta para la base de datos.

Creando una nueva base de datos

Creando una nueva base de datos

Se pide elegir el directorio para crear la base de datos, como se mencionó anteriormente se elige crear un directorio llamado grassdata en la carpeta de usuario.

Elegir directorio para la base de datos

Elegir directorio para la base de datos

Se crea una nueva location para ello simplemente se le da el nombre deseado, en este caso se le dió el nombre del estado en el que se encuentra la mayor parte de la cuenca.

Crear nueva localización

Crear nueva localización

Se elije el sistema de coordenadas de referencia,las cuales pueden ser coordenadas geográficas o elegir un sistema de proyección, en la imagen se muestra que el seleccionado es el sistema de proyección UTM con elipsoide y datum WGS84 y Zona 14N, la elección depende de los objetivos del usuario. Para ayudar a elegir la zona UTM se puede hacer uso de GoogleEarth, marcando el menú Ver > Cuadrícula y luego en Herramientas > Opciones y marcar Universal Transverse of Mercator y se mostrarán las zonas UTM en el globo. Elegir la que corresponda.

Selección de la proyección

Selección de la proyección

A continuación se elige la región predeterminada para trabajar, en este caso elegí la que corresponde para México de la lista.

Región predeterminada de GRASS

Región predeterminada de GRASS

Finalmente aparece una ventana en la que se pide el nombre del mapset o conjunto de mapas (layers) del usuario, introducir el nombre deseado (p. ej. el nombre del usuario) y luego se pide confirmación de los datos. Al aceptar se establecerá automáticamente la nueva localización y conjunto de datos por defecto para QGIS.

Con estos sencillos pasos se tiene una nueva base de datos creada, al principio parece difícil pero es cuestión de acostumbrarse a la manera en que GRASS organiza las cosas. Usando QGIS el proceso de creación de la base de datos ha resultado un poco más fácil que si se hubiera utilizado solo GRASS.

Importar ráster a la base de datos

Ya que se ha creado la base de datos, se puede notar que está vacía puesto que la capa ráster en formato BIL agregada al principio, está en otro directorio fuera de la nueva base de datos. Para importar esta capa o layer a la base de datos se utiliza la opción: Complementos > GRASS > Abrir herramientas de GRASS y en la ventana que aparece escribir y seleccionar el módulo r.in.gdal.

Importar ráster GDAL

Importar ráster GDAL

En la ventana del módulo que aparece seleccionar el ráster a importar y darle un nombre de salida. También puede consultarse el manual en inglés en la pestaña Manual. Para procesar la imagen dar clic en Ejecutar, y al terminar el proceso en Ver salida para que se agregue la capa al QGIS automáticamente. La capa importada se agrega al mapset de la base de datos por defecto, es decir la última creada.

Ráster importado y agregado de manera automática

Ráster importado y agregado de manera automática

Delimitación de la cuenca

Para la delimitación de la cuenca se utiliza el módulo r.watershed, abriéndolo desde Complementos > GRASS > Abrir herramientas de GRASS y seleccionándolo en la lista de módulos, aparecerá una ventana en la que se introducen los datos para necesarios.

Módulo r.watershed ejecutándose

Módulo r.watershed ejecutándose

Se elije como entrada el ráster de elevaciones importado llamado «mdemetztitlan» el cual aparece mientras esté marcada la casilla para ser visto en la sección Capas, todo el análisis se basará en este ráster. Un dato importante es el tamaño mínimo para cada cuenca el cual se tiene que introducir en número de celdas, para éste ejemplo se colocó un tamaño mínimo de 111 celdas, haciendo el cálculo como sigue:

Resolución del ráster de INEGI (una celda): 30m x 30m = 900 m2 entonces para una hectárea que equivale a 10,000 m2 entre 900 m2 = 11.11 celdas / ha. Entonces si se desean delimitar cuencas con un tamaño mínimo de 10 ha se tendrá que introducir un valor de 111.11 celdas.

Se pide introducir los nombres de las capas de salidas que para este ejemplo son:

acumulacion
Mapa de salida: El valor absoluto de cada elemento en esta capa de salida es la cantidad de flujo superficial que atraviesa la celda. Este valor será el número de celdas terreno arriba, más una, si no se especifica el mapa de flujo superficial. Si se da el mapa de flujo superficial, el valor estará en las mismas unidades que flujo superficial. Los números negativos indican que las celdas posiblemente tienen escurrimiento superficial desde fuera de la región geográfica actual. Por lo tanto, en celdas con valores negativos no se puede calcular con precisión el escurrimiento superficial y la producción de sedimentos.

drenaje
Mapa de salida: la dirección de drenaje. Proporciona el «aspecto» de cada celda medido en sentido contrario a las manecillas del reloj desde el Este. Multiplicando los valores positivos por 45 dará la dirección en grados que el escurrimiento superficial viajará desde la celda. El valor 0 (cero) indica que la celda es una zona de depresión (definida por el mapa de entrada de depresiones). Los valores negativos indican que el escurrimiento superficial se sale de los límites de la región geográfica actual. El valor absoluto de estas celdas negativas indica la dirección del flujo.

corrientes
Mapa de salida: segmentos de la corriente. Los valores corresponden a los valores de las cuencas hidrográficas. Pueden ser vectorizados después de un adelgazamiento (r.thin) con r.to.vect.

cuencas
Mapa de salida: da una etiqueta única para cada cuenca hidrográfica. A cada cuenca se le asignará un único número par entero y positivo. Áreas a lo largo de los bordes no pueden ser lo suficientemente grandes como para crear una cuenca hidrográfica exterior. Valores de 0 indican que la celda no es parte de una cuenca hidrográfica completa en la región geográfica actual.

Dar clic en Ejecutar y al terminar el proceso dar clic en el botón Ver salida para agregar automáticamente el resultado a QGIS. De manera adicional se muestra el comando que se ejecuta en el shell de GRASS, el cual se podría ejecutar si únicamente se usara ésta aplicación, en QGIS se pone con una finalidad informativa:

r.watershed elevation=mdemetztitlan@Eduardo threshold=111 accumulation=acumulacion drainage=drenaje stream=corrientes basin=cuencas

Resultando:


SECTION 1a (of 5): Initiating Memory.
SECTION 1b (of 5): Determining Offmap Flow.
SECTION 2: A * Search.
SECTION 3: Accumulating Surface Flow with SFD.
SECTION 4: Watershed determination.
SECTION 5: Closing Maps.
Finalizado correctamente

En la corrida anterior se usó un valor mínimo de cuencas muy pequeño y por ello como resultado se obtuvo una capa con muchas cuencas pequeñas, para delimitar la cuenca «principal» es conveniente entonces incrementar este valor y volver a ejecutar el módulo. Ahora para delimitar la cuenca general se usa un tamaño mínimo de cuencas de 10,000 ha ejecutando el módulo con un área de 111111 celdas se obtiene un resultado como el mostrado en la imagen:

Delimitación de la cuenca de Metztitlán

Delimitación de la cuenca de Metztitlán

Clic en el botón Ejecutar y cuando termine en el botón Ver salida para agregar automáticamente el resultado a QGIS. El código de la instrucción ejecutada en GRASS ahora es:

r.watershed elevation=mdemetztitlan@Eduardo threshold=111111 accumulation=acumulacion2 drainage=drenaje2 stream=corrientes2 basin=cuenca2

El resultado que se despliega es:

SECTION 1a (of 5): Initiating Memory.
SECTION 1b (of 5): Determining Offmap Flow.
SECTION 2: A * Search.
SECTION 3: Accumulating Surface Flow with SFD.
SECTION 4: Watershed determination.
SECTION 5: Closing Maps.

Finalizado correctamente

De esta forma se obtuvieron dos resultados, por una parte, al ejecutar el módulo con un tamaño mínimo de cuencas de 10 ha, se obtuvieron cuencas con una superficie pequeña y una red de corrientes detallada que más adelante servirá para generar una capa vectorial de escurrimientos superficiales, además de la capa de drenaje y acumulacion. Y por otra parte se obtuvo una delimitación general de la cuenca usando un tamaño mínimo de 10,000 ha, en este caso se nombraron las salidas con los mismos nombres que la anterior pero agregando un «2» al final quedando acumulacion2, corrientes2, cuenca2 y drenaje2.

Ahora para manejar de una forma más práctica la delimitación de la cuenca, se convierte la capa llamada cuenca2, de ráster a vectorial. Para hacer la conversión hay que abrir las herramientas de GRASS y hacer clic en la pestaña Lista de módulos en la que hay que seleccionar r.to.vect.area el cual sirve para convertir un archivo ráster a vectorial (polígonos).

Conversión de ráster a vectorial

Conversión de ráster a vectorial

El código de la instrucción es:

r.to.vect input=cuenca2@Eduardo output=cuencametztitlan feature=area -s

Se obtiene la siguiente información al ejecutar el módulo, notar que salen un par de advertencias pero nada de cuidado por lo pronto:

!Default driver / database set to:
!driver: dbf
!database: $GISDBASE/$LOCATION_NAME/$MAPSET/dbf/

Extracting areas...
Building topology for vector map ...
Registering primitives...
2 primitives registered
4192 vertices registered
Building areas...
1 areas built
1 isles built
Attaching islands...
Attaching centroids...
Number of nodes: 2
Number of primitives: 2
Number of points: 0
Number of lines: 0
Number of boundaries: 1
Number of centroids: 1
Number of areas: 1
Number of isles: 1
r.to.vect complete.
Finalizado correctamente

Al terminar la ejecución de la instrucción, se tiene la delimitación de la cuenca en vectorial. Resulta más práctico manejar áreas en formato vectorial como polígono que en vez de un ráster, además en mi opinión se le puede dar más presentación a un polígono.

Para terminar hay que hacer un sombreado de las elevaciones, conocido como hillshade que tiene fines estéticos. Para ello usar el módulo llamado r.shaded.relief que requiere lo siguiente: el modelo de elevaciones, en este caso mdemetztitlan; el nombre de la capa de salida, yo lo llamé sombreado; la altitud del sol en grados por arriba del horizonte, el azimut del sol en grados al Este del Norte y la exageración, los cuales dejé lo que pone por defecto. Dar en Ejecutar y al terminar en el botón Ver salida para agregar automáticamente la capa resultante a QGIS.

Creando el sombreado

Creando el sombreado

Listo ahora agregar un poco de transparencia para obtener el resultado final como se muestra en la imagen.

Delimitación de la Cuenca de Metztitlán

Delimitación de la Cuenca de Metztitlán

Generar corrientes

Para generar corrientes superficiales se utiliza la capa corrientes generada al principio del análisis puesto que la red es mucho más detallada que corrientes2, esta capa es ráster y hay que convertirla a vectorial. Antes de ejecutar la conversión es necesario procesarla por medio de la herramienta r.thin como se muestra en la imagen:

Adelgazando la capa ráster con r.thin

Adelgazando la capa ráster con r.thin

La capa de salida se llama rios misma que se convierte a vectorial con el módulo r.to.vect.line de GRASS. El procedimiento únicamente pide el nombre de la capa de salida que en este ejemplo de llama escurrimientos.

Generando escurrimientos superficiales

Generando escurrimientos superficiales

Cuando termine, se tendrán escurrimientos generados con un área de captación de 10 ha, para obtener menor o mayor detalle se puede repetir el proceso, cambiando el área mínima de la cuenca por generar.

Corrientes generadas

Corrientes generadas

Finalmente resta guardar el proyecto llendo al menú Archivo > Guardar proyecto como … y guardarlo en el directorio y con el nombre que se desee.

Conclusiones

Con este ejemplo pretendí hacer una pequeña demostración de la eficiencia y calidad que tienen las herramientas Open Source que existen para el manejo de sistemas de información geográfica, con las que se pueden obtener muy buenos resultados.

En mi opinión, en este pequeño «artículo» se pudo notar la potencia que tiene la aplicación GRASS por medio de sus módulos que hacen una gran cantidad de tareas y que además las hacen bien, sin embargo el uso de este paquete podría resultar complicado para usuarios principiantes que vienen de usar software privativo, por ello una buena opción es manejar los módulos de GRASS por medio de QGIS para facilitar la tarea.

Por último resta decir como profesionistas no podemos quejarnos de las herramientas libres que se ofrecen puesto que resultan bastante buenas, incluso algunas son mucho mejores que las soluciones de software privativo además, en mi opinión personal, académicamente es más conveniente usar aplicaciones en las que se pueda tener acceso al código fuente porque se puede saber exactamente que algoritmos de cálculo o modelación se usan, aparte de la ventaja de no tener que pagar costosas licencias por usar determinados paquetes de software.

Delimitación final de la Cuenca de Metztitlán

Delimitación final de la Cuenca de Metztitlán

¡Saludos y espero les sirva!

Fuentes:

http://earth.unibuc.ro/tutoriale/bazin-hidrografic-prin-QGIS-GRASS/
Manual de GRASS

NOTA: La cuenca no está completa pero sirve como ejemplo para la realización de la delimitación.

Instalando GRASS y QuantumGIS en Arch Linux

Bueno una de las razones por las que decidí dejar Slackware y usar una distribución que tuviera resolución de paquetes al momento de instalar aplicaciones fue por que frecuentemente tenía que estar instalando aplicaciones «robustas» atascadas de dependencias, muchas opcionales pero útiles al final, como GRASS y QuantumGIS (QGIS). Hace unas semanas instalé ambas aplicaciones en ArchLinux y el proceso fue sorprendentemente rápido para mi.

Primero hay que instalar GRASS puesto que yo lo utilizo como un complemento de QuantumGIS por medio del plugin grass-qgis. Para instalar GRASS solo hay que utilizar pacman de la manera siguiente:

# pacman -S grass

Lo cual instalará la versión 6.4 de GRASS.

GRASS instalado en GNU/Linux

GRASS instalado en GNU/Linux

Para QuantumGIS se utliza yaourt puesto que los repositorios están en AUR, pero antes hay que resolver el problema de una dependencia llamada qwt ya que QGIS funciona con la versión 5 y en mi sistema está la versión 6.
Primero eliminar la versión instalada:

# pacman -Rn qwt

Descargar el tarball de aquí dando clic en el link “tarball” y guardándolo, el archivo se llamará qwt5.tar.gz luego hay que descomprimirlo y se crea una carpeta llamada qwt5, esto creará dos archivos dentro de la carpeta y digamos que esos solo son archivos de configuración (ignoro su nombre correcto) lo que significa que no son las fuentes del programa. Entonces hay que descargar las fuentes del programa las cuales vienen en un archivo llamado qwt-5.2.2.tar.bz2, yo las encontré en este sitio, aunque puede que haya otros más convenientes.

Copiar el tarball con las fuentes (el archivo llamado qwt-5.2.2.tar.bz2) al directorio qtw5 creado y se tendrán tres archivos:

PKGBUILD
qwtconfigarchlinux.pri
qwt-5.2.2.tar.bz2

Abrir el terminal y llegar hasta ese directorio con el comando “cd”, en mi caso es así:

$ cd /home/eduardo/descargas/qwt5

Luego ejecutar:

$ makepkg -s

Lo cual creará un archivo con extensión pkg.tar.xz que hay que instalar:

$ sudo pacman -U qwt5-5.2.2-1-i686.pkg.tar.xz

Una vez hecho esto se procede con la instalación de qgis:

$ yaourt -S qgis

QuantumGIS instalado en ArchLinux

QuantumGIS instalado en ArchLinux

Listo ya se tiene instalado QuantumGIS en nuestro sistema.
Un saludo.

Renovando GRASS 6.4 y QGIS 1.7

Bueno, anteriormente ya había escrito algunas entradas de como instalar GRASS 6.4 y QGIS 1.6, y que traté de instalar ambos para usar GRASS con el GUI de QuantumGIS ya que es más amigable y esto me sirve a mi para difundir el uso de Linux en mi universidad donde trabajo. La situación es que los profesores estan completamente acostumbrados al uso de programas como AutoCAD, ArcView, ArcGIS y por supuesto MS Office y Windows, algo gracioso es que las maquinas de los laboratotios de cómputo siempre están llenas de virus y tienen que estar formateando a cada rato, incluso los cursos de programación son con Delphi. Lo anterior no es malo, yo recibí esa preparación durante mi carrera y gracias a ello tengo trabajo, pero mi misión es compartir y dar a conocer entre mis compañeros de trabajo, con alumnos y profesores que existen alternativas a ese tipo de software y ser parte del pequeño grupo de profesores y alumnos del departamento que usan Linux (principalmente Ubuntu) y demás software libre como OpenOffice.org o LibreOffice, de mi parte espero poder difundir el uso de programas tipo CAD en general, QGIS, GRASS y programación en Python. Ok, después de todo el panorama general voy al grano.

Resulta que hace tiempo por razones que aún no puedo entender debido a mis pocos conocimientos en Linux, la aplicación de GRASS dejó de funcionar en mi sistema y no supe como resolver el problema, así que me volví a instalar todo desde cero.

Para activar el uso de GRASS en QGIS por medio del respectivo plugin, tuve que realizar lo siguiente aunque no se si sea exactamente lo que se requiere pero a mi me funcionó (jeje):

La instalación de GRASS la realicé como en mi post anterior y después ejecuté lo siguiente como root, para hacer que las librerías de GRASS queden disponibles para todo el sistema:

# echo /opt/grass/lib >> /etc/ld.so.conf && ldconfig

GRASS 6.4

Ahora viene la instalación de QGIS, la cual realicé como en éste otro post pero descargando los paquetes para la versión 1.7 de SlackBuilds.org. Antes de ejecutar el SlackBuild lo abrí con un editor de texto y lo modifiqué remplazando la siguiente línea:

WITHGRASS=""

por esta:

WITHGRASS="/opt"

Para que el paquete sea creado con GRASS habilitado, /opt es el directorio en donde yo instalé la aplicación GRASS si tú lo instalaste en otro directorio como por ejemplo /usr entonces hay que poner WITHGRASS="/usr" o el directorio que corresponda. Luego hay que ejecutar el SlackBuild e instalar la aplicación con el comando installpkg cuando se haya creado el paquete.

QGIS 1.7 con GRASS plugin

Saludos