GeoPackge o por qué no querrás volver a usar Shapefiles

Este post está orientado principalmente a usuarios y profesionales que utilizan QGIS, ArcGIS o cualquier otro usuario de software de sistemas de información geográfica (SIG).

En el mundo de los SIG, existe un formato de datos espaciales que todo el mundo conoce y que es común a todos los software del mercado, ese formato es el Shapefile.

Ya seas una persona totalmente nueva en SIG o seas un usuario avanzado, habrás usado este formato de datos en algún momento.

Puede que el formato Shapefile te guste o puede que no. Puede también que te resulte indiferente y que no te hayas parado a pensar si existe un formato mejor a la hora de trabajar con datos espaciales.

En este post voy a hablar de los GeoPackges, un formato OGC opensource que es una opción real para reemplazar a los Shapefiles por su enorme versatilidad, sencillez y funcionalidad.

¿Que es un geopackge?

Este formato OGC nació en 2014 y poco a poco ha ido ganando popularidad. Puedes encontrar toda la información que necesites sobre Geopackge aquí, no obstante yo te cuento lo fundamental: GeoPackge se comporta como una base de datos SQLite.

Se puede trabajar de distintas maneras con este formato. Tanto para leer como para generar un GeoPackge, puedes hacerlo desde la línea de comandos usando comandos SQL, desde QGIS o incluso GDAL/OGR. También puedes usar librerías de Python como Geopandas. Esto no es exclusivo de GeoPackge, hasta aquí, se comporta igual que un Shapefile.

¿Entonces, que es lo que convierte a GeoPackge en un formato mejor para almacenar, trabajar y compartir datos espaciales?

Principales diferencias entre GeoPackge y Shapefiles

Un Shapefile y un Geopackge, en esencia, son lo mismo. Un usuario podría «cargar» en QGIS un Shapefile y un GeoPackage, ambos conteniendo datos vectoriales de una cuenca hidrográfica y no apreciar ninguna diferencia in-situ.

Sin embargo, a la hora de trabajar con la tabla de atributos, usar herramientas espaciales o exportar/importar datos a una base de datos espacial, el usuario descubriría que en GeoPackge es mucho más versátil y eficiente que un Shapefile.

En la breve descripción que hemos hecho de GeoPackge no hemos visto nada nuevo con respecto al formato Shapefile, entonces, ¿dónde se encuentra su principal ventaja?

Como he mencionado anteriormente, GeoPackge se comporta como una base de datos SQLite. Por tanto, si estás familiarizado con PostgreSQL/PostGIS sabrás que una base de datos espaciales puede almacenar múltiples tipos de geometrías (entidades vectoriales), rasters, mosaicos, datos tabulares no espaciales, proyectos, metadatos etc.

Capas y formatos que puedes almacenar en un GeoPackage. Fuente: OGC

Un Shapefile únicamente te permite almacenar datos vectoriales de un solo tipo de geometría a la vez y como mínimo, si trabajas con SIG, va a generar 4 archivos (prj, dbf, shp y shx).

Un GeoPackage nos va a permitir almacenar múltiples tipos de geometrías (entre otros formatos espaciales) y todo ello en un solo archivo.

A la izquierda, 15 archivos que se han generado al crear 3 Shapefile. A la derecha, los mismos datos vectoriales dentro de un GeoPackage

Existe una web llamada «Switch from Shapefile» que anima a abandonar el formato Shapefile y da una serie de razones para ello. Basándome en dicha página web y en mi propia experiencia, voy a dejar una serie de pros y contras sobre usar Shapefile y GeoPackage.

Pros y contras sobre el formato shapefile

Pros:

  • Shapefile es un formato muy extendido
  • Lleva tanto tiempo en la industria, que la gente se siente cómoda usándolo, incluso habiendo mejores formatos (más vale malo conocido que bueno por conocer)
  • Todos los software SIG que conozco pueden leer el formato Shapefile
  • Incluso muchos software CAD son capaces de leer este formato
  • Para la mayoría de las tareas SIG del día a día, el formato Shapefile cumple con su función.

Contras:

  • Es un formato multi-archivo, a todo el mundo le ha ocurrido alguna vez que ha recibido un SHP de alguien (un cliente, un compañero) que solamente contenía el archivo «.shp»
  • Para trabajar con SIG, necesitas al menos 4 archivos (prj, shp, dbf y shx). La perdida de alguno de ellos puede hacer que nuestros datos queden inutilizados.
  • Solo permite almacenar datos vectoriales de un único tipo de geometría al mismo tiempo, es decir, no puedes almacenar dentro de un Shapefile un polígono y una línea.
  • Tiene un tamaño restringido a 2 GB y conforme nos acercamos a ese l’imite se vuelve mucho más ineficiente y difícil de manejar
  • No puede almacenar relaciones espaciales.
  • Los nombres de los atributos se encuentran limitados a 10 caracteres. Esto resulta especialmente molesto cuando exportamos Shapefile desde una base de datos espaciales.
  • Los atributos se almacenan en el archivo .dbf que no permite almacenar más de 255 atributos
  • Solo permite 3 tipos de geometrías: punto, línea y polígono. No es muy seguro a la hora de trabajar con multipolígonos.
  • Se comporta muy bien con datos 2D, pero presenta limitaciones a la hora de trabajar con datos 3D.
  • Solo se pueden almacenar 4 tipos de datos: real, entero, fecha y texto (limitado a su vez a 255 caracteres)
  • Por si solo, el formato Shapefile es tan solo un «shape» es decir, una geometría (punto, línea o polígono). Si no lo acompañamos con un archivo prj, el Shapefile no dispondrá de proyección espacial por si solo.

PROS Y CONTRAS SOBRE EL FORMATO GEOPACKGE

Pros:

  • Un GeoPackage se compone de un solo archivo
  • Puede almacenar vectores, rasters, etc.
  • Si trabajas con QGIS, puedes usar GeoPackage para almacenar tus datos espaciales y posteriormente guardar el propio proyecto de QGIS dentro del GeoPackage, como se muestra en la captura inferior.
Proyecto de QGIS almacenado dentro de un GeoPackage
  • Es tan eficiente como una base de datos espacial tipo PostgreSQL y, sin embargo, mucho más ligero y puede funcionar de forma «standalone»
  • Dentro de los datos vectoriales, permite almacenar las siguientes geometrías: puntos, líneas, polígonos, multipuntos, multilínea y multipolígonos.
  • Como tipos de datos, se pueden usar números reales, enteros, enteros (64 bit) texto, JSON, fechas, fechas y hora, objetos binarios (BLOB) y booleanos.
Tipos de datos permitidos en un atributo de un GeoPackge
  • Puede ampliamente superar 2 GB de espacio límite, en principio hasta 140 TB
  • No hay limitación de caracteres en el nombre de atributos, lo que facilita «mapear» los nombres de atributos cuando importamos/exportamos datos desde/hacia otra base de datos espaciales.
  • A la hora de insertar datos desde un GeoPackage a una base de datos y viceversa, es más rápido este formato que el formato Shapefile o GeoJSON.
  • Cuando trabajamos con QGIS, a la hora de hacer uniones, intersecciones, etc., es mucho más eficiente, ya que los datos están espacialmente indexados.

Contras:

Es difícil encontrar puntos negativos al formato GeoPackage. Existen 2 factores que hacen que el GeoPackage por el momento no haya desplazado 100% al formato SHP:

  • Falta de experiencia por parte del usuario: Es un formato relativamente nuevo. Es normal que al principio nos pueda resultar costoso usar un formato nuevo al que no estamos muy acostumbrados, y prefiramos quedarnos en nuestra zona de confort.
  • No todos los software comerciales lo han implementado totalmente: Un ejemplo sería ESRI, aunque se puede usar el formato GeoPackage en ArcMAP y en ArcGIS Pro, no se puede usar 100% su funcionalidad, como se describe en este post.

CONCLUSIÓN

El formato GeoPackage está cada vez más extendido. QGIS incorpora GeoPackage como su formato por defecto a la hora de crear o exportar una nueva capa.

Si no conoces este formato, te invito a que lo pruebes, empieza por algo sencillo, coge cualquier Shapefile que tengas, cárgalo en QGIS y expórtalo en formato GeoPackage.

Después te animo a que añadas más capas dentro del mismo GeoPackage y ejecutes algunos procesos espaciales como uniones, intersecciones, etc.

Te advierto que es posible que después de hacer esto, no quieras volver a usar un Shapefile 🙂

Si ya conocías el formato GeoPackage, espero que hayas encontrado este post interesante y te invito a que comentes cosas que se me hayan escapado o con las que no estés desacuerdo.

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.)

Cómo convertir datos de OSM (Open Street Map) a Shapefile con QGIS

Los sistemas de información geográfica carecen de sentido si no disponemos de datos para trabajar con ellos. En muchas ocasiones, nos encontramos con que tenemos un proyecto o una idea y carecemos de fuentes de descarga de información para desarrollarla. Encontrar estas fuentes a veces resulta una actividad tediosa y fustraste.

En este post vamos a ver una manera de obtener datos en formato shapefile a partir de Open Street Map usando el complemento o plugin de QGIS llamado «OSMdownload».

Antes de nada, si vas a realizar los pasos de este post, te recomiendo que le eches un vistazo a este otro post donde te explico cómo descargarte un complemento para QGIS llamado «Quick Terrain Services» que podrás usar para cargar mapas base en QGIS (entre ellos mapas base de OSM).

¿Qué es OSM?

OSM viene de las siglas en inglés «OpenStreetMap». Se trata de un conjunto de datos open source del que se abastecen páginas web, aplicaciones móviles y distintos software (entre ellos QGIS).

OSM se mantiene gracias a una comunidad de personas dedicadas a la elbaoración de amapas que contribuye al mantenimiento y creación de todo tipo datos a lo largo del mundo, desde carrtereas y railes hasta el mapeo cafés o edificios públicos.

OSM Open Street Map Madrid
Ejemplo de vista de OSM en el Centro de Madrid

Descargar el complemento «OSMDownloader» para QGIS

El complemento OSMDownloader de QGIS es el que nos va a permitir descargar elementos en formato OSM a partir de Open Street Map. Como el resto de los complementos en QGIS, necesitamos acceder al menú de complementos para descargarlo, ya que no viene por defecto en nuestra instalación.

Para este ejemplo, vamos a usar QGIS 3.18 pero podrías usar cualquier otra versión que tengas instalada en tu ordenador. Dirígete al menú principal, en la parte superior y haz clic en complementos > administrar e instalar complementos.

Una vez que se abra la ventana de complementos, teclea «OSMdownload» en la barra de búsqueda y aségurate de que la opción «todos» está seleccionada. Después, haz clic en la parte inferior en «Instalar Complemento»

Gestor de complementos de QGIS

Una vez descargado el complementos, verás una herramienta nueva con forma de rectángulo en el menú principal, en la parte superior.

Herramienta para descargar datos de OSM mediante un rectángulo de selección

Usando OSMDOWNLOADER

Utilizar este complemento de QGIS es bastante sencillo. Para ello imaginemos que queremos obtener un callejero de la ciudad de Águilas. Los pasos serían:

  • Cargar un mapa base de OSM. En este caso, he obtado por usar el complemento de Quick Terrain Services
Cargar datos desde Quick Terrain Services
  • Buscar la zona que queremos descargar
  • Crear un AOI (área de interés) de la zona que queremos obtener datos usando OSMdownloader
AOI usando OSMDownloader
  • Seleccionar una carpeta de descarga. Observa que puedes marcar la casilla de «Load layer after download» para ver la información en QGIS sin necesidad de cargarla una vez descargada.
Selecciona una carpeta de descarga

Una vez descargados los datos, lo único que tenemos que hacer, es covertirlos a formato SHP. Para ello usa la herramienta de selección en QGIS y selecciona aquellos elementos que desees exportar como SHP (o cualquier otro formato!).

Datos descargados directamente de OSM

Cuando ya tengamos los elementos exportados en formato SHP, puedes recurrir a la simbología y superponerlos sobre Google Street Map para comprobar que todo es correcto. También puedes añadir un etiquetado con el nombre de las calles:

Callejero del centro de Aguilas (Murcia)

Como habras podido comprobar, es bastante sencillo obtener datasets de cualquier parte del mundo. Dependiendo del tamaño de la zona, el país o la ciudad, puede que tengas más o menos información disponible.

Por ejemplo, en este otro caso, he seleciconado una zona del Parque Natural de la Sierra de Guadarrama entre Madrid y Castilla León, y podemos ver que nos aparecen desde puntos de interés hasta senderos rurales:

Datos descargados de OSM de la Sierra de Guadarrama

Te animo a que trates de probar la herramienta en alguna zona de tu interés y así podrás comprobar qué datos tienes disponibles.