En este breve artículo vamos a mostrar de qué manera se pueden acceder y leer archivos GIS con información geográfica mediante Geopandas.
Geopandas es la principal librería de Python para trabajar con datos espaciales. Es una herramienta imprescindible para manipular, transformar, visualizar y analizar conjuntos de datos con componente geográfica.
El punto esencial y básico para empezar a utilizar esta fantástica librería de Python es conocer cómo leer archivos con datos espaciales. Veamos cómo podemos realizar estas tareas con Geopandas.
¿Cómo leer archivos de datos espaciales con Geopandas?
Leer archivos espaciales con Geopandas es equivalente a la creación de un objeto GeoDataFrame de Geopandas que contenga los datos de dicho archivo.
Un objeto GeoDataFrame es una estructura de datos tabular que contiene por lo menos una columna con un objeto (Geoseries) que contiene la geometría.
Si no estás familiarizado con estos conceptos y quieres profundizar al respecto, te invitamos que revises este artículo de introducción a Geopandas que publicamos anteriormente. En él se definen los conceptos de GeoSeries y GeoDataFrame entre otros puntos.
Que Geopandas trabaje mediante un objeto GeoDataFrame permite homogeneizar la estructura de cualquier tipo de dato, para que la librería de Python sea capaz de trabajar con ellos independientemente de su formato de origen.
Así pues, vamos a ver cómo podemos convertir con Geopandas distintos tipos de archivos espaciales o geográficos a un GeoDataFrame con pocas líneas de código.
Cómo leer un Shapefile con Geopandas
Para leer un archivo vectorial de tipo Shapefile, deberemos importar la librería Geopandas y a continuación utilizar el método read_file(), especificando como parámetro el archivo SHP.
Deberemos almacenar el objeto en una variable, que será el objeto GeoDataFrame de Geopandas que contenga los datos del Shapefile leído.
import geopandas as gpd
gdf = gpd.read_file('datos.shp')
La variable ‘gdf’ contiene el objeto GeoDataFrame construido a partir del Shapefile de origen.
Como leer un GeoJSON con Geopandas
La misma sintaxis aplica para archivos de tipo GeoJSON:
import geopandas as gpd
gdf = gpd.read_file('datos.geojson')
Podemos utilizar el siguiente código para obtener los primeros registros del GeoDataFrame creado en base al GeoJSON leído:
print(gdf.head())
Asimismo, podemos ver la estructura de columnas del GeoDataFrame con el siguiente código:
print(gdf.columns)

Cómo leer un Geopackage con Geopandas
Para leer y cargar una capa desde un Geopackage a un GeoDataFrame de Geopandas, la sintaxis es ligeramente distinta.
Esto es debido a que, como debes saber, un Geopackage es un formato basado en una base de datos SQLite espacial, por lo que puede contener más de una capa.
Por ello, es necesario especificar el nombre de la capa que se desea leer mediante el argumento ‘layer’:
import geopandas as gpd
gdf = gpd.read_file('datos.gpkg', layer='nombre_capa')
Es importante tener en cuenta que el nombre de la capa debe coincidir exactamente con el nombre de la capa en el archivo Geopackage, incluyendo mayúsculas y minúsculas
Si no se especifica el argumento ‘layer’, Geopandas leerá todas las capas del archivo Geopackage y devolverá un diccionario de objetos GeoDataFrame.


Cómo leer un KML con Geopandas
Para leer archivos KML con Geopandas será necesario especificar el argumento ‘driver’.
Por lo demás, la sintaxis es muy similar ya que también se hace uso del método read_file() como se muestra a continuación:
import geopandas as gpd
gdf = gpd.read_file('datos.kml', driver='KML')
Si tienes problemas para leer un archivo KML es posible que la razón sea que la librería Fiona no tiene habilitado el driver KML por defecto.
Para habilitarlo, deberás introducir los siguientes comandos en la consola de python:
import fiona
# Listar los drivers disponibles en Fiona con:
fiona.supported_drivers
# Asegurarse que existen en el listado.
# De lo contario deberán habilitarse.
# Habilitar los drivers (según versión):
fiona.drvsupport.supported_drivers['libkml'] = 'rw'
fiona.drvsupport.supported_drivers['LIBKML'] = 'rw'
# O bien:
fiona.drvsupport.supported_drivers['libkml'] = 'rw'
fiona.drvsupport.supported_drivers['LIBKML'] = 'rw'
# Comprobar nuevamente que se ha actualizado el listado:
fiona.supported_drivers

Cómo leer un CSV con Geopandas
Para el caso de archivos CSV, la técnica es ligeramente distinta, dado que no estamos hablando de archivos GIS vectoriales propiamente.
A pesar de que no es un formato de archivo espacial como tal, es interesante conocer de qué manera se puede ingerir un CSV con geometrías en Geopandas ya que a pesar de ello es bastante habitual intercambiar o encontrar información geográfica en este formato.
Para conseguirlo, deberemos ir un poco más allá y apoyarnos en la librería Shapely (sobre la que se construye Geopandas) junto a Geopandas propiamente.
Esto es debido a que necesitamos procesar la columna de geometría (generalmente en formato WKT) para indicar a Geopandas la lectura de dicha información mediante Shapely.
Deberemos indicar los parámetros ‘GEOMETRY_COL’ y ‘encoding’ en el método read_file() de Geopandas:
import geopandas as gpd
from shapely import wkt
# leer el archivo CSV
datos = gpd.read_file('datos.csv', GEOMETRY_COL='geom', encoding='utf-8')
# Convertir la columna geométrica de texto a objetos Shapely
datos['geom'] = datos['geom'].apply(wkt.loads)
# Convertir el DataFrame a un GeoDataFrame
gdf = gpd.GeoDataFrame(datos, geometry='geom')
Deberemos alterar la columna de geometría (originalmente en formato texto -WKT- desde el CSV) con wkt.loads() de Shapely para convertirla a un objeto geométrico que Geopandas pueda procesar.
Finalmente convertimos el DataFrame en un GeoDataFrame de Geopandas ahora que ya tenemos la geometría debidamente convertida.
Una vez conocemos cómo acceder a la geoinformación podemos empezar a realizar tareas más avanzadas destinadas a la transformación de datos es decir, a manipularlos, visualizarlos, analizarlos, combinarlos, etcétera.
Esperamos que este breve artículo sea útil para aprender a leer y cargar datos vectoriales GIS con Geopandas para trabajar con Python.