Cómo ejecutar geoprocesos sin abrir un programa SIG

En muchas ocasiones, tenemos que ejecutar geoprocesamientos sencillos como crear un buffer o reproyectar un shapefile que no necesariamente requieren de abrir un programa SIG o tener conocimientos de programación para ello.

La mayoría de los geoprocesamientos que usamos a diario pueden ejecutarse desde la línea de comandos de Windows usando GDAL/OGR. Esto resulta de gran utilidad a la hora de crear “batch processing” sin calentarnos la cabeza demasiado.

QUe es “GDAL/OGR”?

Para simplificar, podemos decir que GDAL/OGR es un conjunto de herramientas gratuitas geoespaciales para trabajar con datos ráster (GDAL) y vectoriales (OGR).

No tenemos que pensar que GDAL/OGR es algo diferente a los software GIS. En realidad la mayoría de los software GIS del mercado usan librerías GDAL/OGR, desde QGIS hasta ArcGIS. Para ejecutar OGR/GDAL desde la línea de comandos, necesitas tenerlo instalado en tu ordenador. Cualquiera de las siguientes instalaciones te podría servir:

Una vez conseguido esto, solo necesitaras ejecutar el programa desde la línea de comandos.

“OGR2OGR” desde la linea de comandos

Vamos a ver un ejemplo real. En este caso, vamos a crear un buffer usando ogr2ogr desde la línea de comandos. Recuerda que OGR se usa para geoprocesamientos vectoriales, por tanto no sirve para trabajar directamente con datos ráster.

Para el ejemplo, vamos a usar un SHP descargado del PNOA con la Cuenca Hidrográfica del Segura. Pero podrías usar el que desees:

Usando el SHP de la imagen superior, vamos a crear una serie de buffers y vamos a aprender a leer la tabla de atributos y usar sus categorías.

La sintaxis básica de cualquier comando OGR2OGR sería:

ogr2ogr -f “FORMATO” -sql “SQL” -dialect SQLite “Output.shp” “Input.shp”

Seguir el orden de la sintaxis es importante. Cuando usamos OGR2OGR, el archivo de salida debe nombrarse antes que el archivo de entrada, al contrario que en la mayoría de los programas que podemos ejecutar desde símbolo de sistema.

Crear un buffer con “st_buffer”

En el ejemplo que nos ocupa, vamos a usar la función ST_Buffer de PostGIS sobre el campo de geometría de nuestro SHP para crear el buffer. El objetivo es crear un buffer de 10 metros alrededor de la línea que representa nuestro cauce. El archivo de salida queremos que sea también en formato SHP:

  • Invocamos OGR2OGR desde nuestra instalación de QGIS: “C:\Program Files\QGIS 3.18\bin\ogr2ogr.exe”
  • Para definir el archivo de salida como SHP: -f “ESRI Shapefile”
  • La sintaxis SQL sería: -sql “select ST_Buffer(geometry, 10) from hi_redsecuencia_l_ES070”, donde hi_redsecuencia_l_ES070 es el nombre del SHP.
  • Por último, copiamos la ruta donde queremos el archivo de salida y la ruta del archivo de entrada.

Todo junto quedaría del siguiente modo:

“C:\Program Files\QGIS 3.18\bin\ogr2ogr.exe” -f “ESRI Shapefile” -sql “select ST_Buffer(geometry, 10) from hi_redsecuencia_l_ES070” -dialect SQLite “C:\Users\javi\Downloads\hi_redsecuencia_l_ES070_buf10m.shp” “C:\Users\javi\Downloads\hi_redsecuencia_l_ES070.shp”

Para ejecutar el comando, abre una ventana de símbolo de sistema y copia la sentencia. Después presiona intro. Ahora es el momento de comprobar los resultados. Abrimos QGIS o cualquier otro programa SIG que tengas instalado en tu ordenador. Ahora arrastra el archivo original y el archivo de salida. ¿Qué ha ocurrido?

Buffer de un archivo lineal en grados

No hemos obtenido el resultado que esperábamos. Esto se debe a que el archivo original se encuentra en WGS84, es decir, sus unidades están en grados decimales y no en metros. Para realizar la transformación a ETRS89 UTM zona 30 y poder operar en metros, tenemos dos opciones.

  • Realizar la transformación con QGIS
  • Realizar la transformación usando OGR2OGR al mismo tiempo que creamos el buffer

cambios de proyección: “ST_Transform”

Vamos a usar la segunda opción. Todo lo que necesitas es conocer el código EPSG de tu archivo de tu archivo de salida. Observa en el comando inferior la parte en negrita. Vamos a aplicar ST_Transform sobre la geometría al mismo tiempo que usamos ST_Buffer:

“C:\Program Files\QGIS 3.18\bin\ogr2ogr.exe” -f “ESRI Shapefile” -sql “select ST_Buffer(st_transform(geometry, 25830), 10) from hi_redsecuencia_l_ES070″ -dialect SQLite “C:\Users\javi\Downloads\hi_redsecuencia_l_ES070_25830_buf10m.shp” “C:\Users\javi\Downloads\hi_redsecuencia_l_ES070.shp

Buffer del shapefile que contiene la cuenca hidrográfica del segura

Ahora si hemos obtenido los resultados esperados. El buffer está ahora en metros y nuestro archivo de salida se ha transformado de WGS84 a ETRS89 Zona 30.

Vamos a ir un poco mas allá. Nuestro shapefile contiene una serie de cauces, que son ríos, ramblas, acequias, etc. ¿Podemos crear un buffer en ETRS89 solamente para los ríos?

“ogrinfo” para leer atributos de un Shp

Para ellos lo único que tenemos que hacer es comprobar si la categoría “Ríos” existe en nuestro SHP. Puedes leer la tabla de atributos desde QGIS o bien, puedes hacerlo usando OGRINFO.

Para esta segunda opción, usar el siguiente comando que te ayudará a leer todas las columnas (usamos el *) de una fila de la tabla de atributos (por ello usamos “limit 1”):

“C:\Program Files\QGIS 3.18\bin\ogrinfo.exe” “C:\Users\anton\Downloads\hi_redsecuencia_l_ES070.shp” -dialect sqlite -sql “select * from hi_redsecuencia_l_ES070 limit 1

En este caso, no vamos a crear ningún archivo de salida. Solamente queremos que nos muestre en la consola de símbolo de sistema los atributos de un único elemento del SHP de entrada. Observa que uno de los atributos se llama “nombre”. Parece un buen candidato para contener los nombre de los ríos, ramblas, arroyos, etc., por lo que es posible que nos indique los ríos. Vamos a comprobarlo con el siguiente comando:

“C:\Program Files\QGIS 3.18\bin\ogrinfo.exe” “C:\Users\anton\Downloads\hi_redsecuencia_l_ES070.shp” -dialect sqlite -sql “select distinct(nombre) from hi_redsecuencia_l_ES070

Lo que estamos indicando en el comando superior es que nos muestre todos los elementos DISTINTOS de la tabla de atributos para la columna “NOMBRE”:

la cláusula “where”

El campo nombre contiene lo que buscamos. Vamos ahora a usarlo para filtrar todos los ríos de nuestra tabla de atributos. Vamos a crear un nuevo SHP solamente para los Ríos, con un buffer de 10 metros y para ellos vamos a buscar todos aquellos elementos de la tabla de atributos que contienen la palabra “Ríos” en alguna de su columna “NOMBRE” con “WHERE”:

“C:\Program Files\QGIS 3.18\bin\ogr2ogr.exe” -f “ESRI Shapefile” -sql “select ST_Buffer(st_transform(geometry, 25830), 10) from hi_redsecuencia_l_ES070 where nombre like ‘Río%'” -dialect SQLite “C:\Users\javi\Downloads\hi_redsecuencia_l_ES070_25830_buf10m_rios.shp” “C:\Users\javi\Downloads\hi_redsecuencia_l_ES070.shp” -progress

Buffer de 10 metros solo para los Ríos

El nuevo SHP creado será más pequeño que el buffer original, ya que contiene solamente los Ríos.

Por último, vamos a crear un buffer con distintas dimensiones acorde a su categoría. Por ejemplo, imagina que necesitas tener un polígono con los cauces donde los Ríos tengan 10m de buffer y las ramblas 5 metros. Para esto, podemos usar UNION dentro de nuestra sentencia SQL.

fusionar elementos con “union”

Lo único que necesitas hacer es crear un buffer para cada categoría repitiendo el comando SQL, una vez para Ríos y otra para las ramblas:

“C:\Program Files\QGIS 3.18\bin\ogr2ogr.exe” -f “ESRI Shapefile” -sql “select ST_Buffer(st_transform(geometry, 25830), 10) from hi_redsecuencia_l_ES070 where nombre like ‘Río%’ UNION select ST_Buffer(st_transform(geometry, 25830), 5) from hi_redsecuencia_l_ES070 where nombre like ‘Rambla%'” -dialect SQLite “C:\Users\anton\Downloads\hi_redsecuencia_l_ES070_25830_rios10m_y_ramblas5m.shp” “C:\Users\anton\Downloads\hi_redsecuencia_l_ES070.shp” -progress

Como resultado obtendrás un polígomo como el que se muestra a continuación:

Buffer 10 metros para Ríos y de 5 metros para la Ramblas

Conclusión

Como habrás podido comprobar, hemos sido capaces de crear distintos buffers a partir de un SHP usando OGR2OGR, sin necesidad de abrir un programa SIG.

Tener soltura con OGR2OGR te resultará muy útil en tu actividad profesional a la hora de crear scripts o concatenar procesos respetivos.

Hemos visto un ejemplo de cómo crear un buffer y transformar la proyección, pero OGR2OGR se puede usar también para:

  • Crear o modificar atributos
  • Transformar archivos (por ejemplo de SHP a SQLITE)
  • Importar y exportar datos a una base de datos
  • Realizar operaciones vectoriales (intersecciones, uniones, cambios de geometría, etc.)