Saltar al contenido principal
InicioTutorialesPython

GeoPandas Tutorial: Introducción al Análisis Geoespacial

Empieza a utilizar GeoPandas, una de las bibliotecas de Python más populares para el análisis geoespacial.
Actualizado 11 sept 2024  · 15 min leer

Una parte considerable de los datos que se generan cada día son intrínsecamente espaciales. Desde los datos de Observación de la Tierra y los datos GPS hasta los datos incluidos en todo tipo de mapas, los datos espaciales -también conocidos a veces como datos geoespaciales o información geográfica- son datos para los que se asocia una ubicación específica a cada registro. 

Cada punto de datos espaciales puede localizarse en un mapa. Esto puede hacerse utilizando un determinado sistema de referencia de coordenadas, por ejemplo, las coordenadas geográficas, que se basa en los pares habituales de latitud-longitud que utilizamos para especificar dónde está algo en el globo terráqueo. Esto nos permite observar las relaciones espaciales entre los datos. 

Sin embargo, el verdadero poder de los datos geoespaciales consiste en combinar tanto los datos en sí como su ubicación, lo que desbloquea varias oportunidades de análisis sofisticados. La llamada ciencia de datos geoespaciales es un subcampo de la ciencia de datos que se centra en extraer información de los datos geoespaciales aprovechando el poder de los algoritmos espaciales y las técnicas analíticas, como el aprendizaje automático y el aprendizaje profundo. En otras palabras, la ciencia de datos geoespaciales nos ayuda a comprender dónde ocurren las cosas y por qué ocurren allí. 

Hay muchas herramientas adecuadas para la ciencia de datos geoespaciales. Este tutorial se centrará en GeoPandas, un paquete de código abierto para trabajar con datos geoespaciales en Python.

GeoPandas amplía los tipos de datos utilizados por pandas -la herramienta estándar para manipular marcos de datos en Python- para permitir operaciones espaciales sobre tipos geométricos. Dado que GeoPandas se basa en pandas -así como en otros paquetes populares de Python para la ciencia de datos, como matplotlib-, es muy fácil para los profesionales de datos que utilizan Python familiarizarse con la sintaxis de GeoPandas.

Instalar Python GeoPandas

Para utilizar Python GeoPandas, primero tienes que instalarla, como cualquier otra biblioteca de Python.

Es importante señalar que GeoPandas se basa en una pila de bibliotecas geoespaciales de código abierto para ofrecer todo su potencial espacial, como shapely, fiona, pyproj y rtree. Tienes que asegurarte de instalar todas estas dependencias, de lo contrario, GeoPandas podría no funcionar como se espera. 

Para evitar complejidades, GeoPandas recomienda instalar la biblioteca utilizando el gestor de paquetes conda. Esto significa que primero tendrás que instalar Anaconda. Para obtener una guía sobre cómo instalar y utilizar Anaconda, consulta nuestro tutorial.

La ventaja de utilizar el conda es que proporciona binarios preconstruidos para todas las dependencias necesarias y opcionales de GeoPandas para todos los sistemas operativos (Windows, Mac, Linux). Para instalar GeoPandas en la línea de comandos:

>>conda install geopandas

Alternativamente, puedes instalar Anaconda utilizando pip, el instalador de paquetes estándar en Python. Como ya hemos dicho, también tendrás que instalar las dependencias necesarias. Si no estás familiarizado con pip, te recomendamos encarecidamente que leas nuestro Tutorial de Pip Python para la gestión de paquetes. La instrucción que tendrás que ejecutar para instalar GeoPandas con pip es:

>>pip install geopandas 

En cualquier caso, si tienes problemas durante la instalación de GeoPandas, debes consultar la documentación para obtener más información.

Una vez instalado el paquete, ya puedes empezar a utilizar GeoPandas. Sólo tienes que importarlo a tu entorno Python. Ten en cuenta que es muy habitual importar GeoPandas utilizando el alias gpd.

import geopandas as gpd

Operaciones básicas con GeoPandas

En esta sección cubriremos las operaciones más básicas que puedes hacer con GeoPandas. Para ello, te presentaremos algunos conceptos fundamentales del análisis geoespacial, como los tipos de datos espaciales, los formatos de datos espaciales y los sistemas de referencia de coordenadas (SRC).

Lectura y escritura de datos espaciales

Al igual que los pandas necesitan datos de entrada para convertirlos en un marco de datos pandas, GeoPandas lee los datos de entrada (espaciales) y los convierte en el llamado GeoDataFrame. 

Antes de entrar en los múltiples tipos de archivos espaciales que GeoPandas puede leer, es importante distinguir los distintos tipos de datos espaciales. El tipo de datos que tratamos determina las herramientas que debemos utilizar para analizarlos y visualizarlos. 

Básicamente, hay dos tipos principales de datos espaciales:

  1. Datos vectoriales. Describe las características de los lugares geográficos de la Tierra mediante el uso de geometrías discretas, a saber:
    • Punto. Ubicaciones individuales, como un edificio o un coche, con coordenadas X e Y.
    • Línea.  Una serie de puntos conectados que describen cosas como carreteras o arroyos.
    • Polygon. Formado por una línea cerrada que rodea una zona, como las fronteras de un país. Además, cuando un rasgo está formado por varias geometrías, lo llamamos Multipolígono.
  2. Datos rasterizados. Codifica el mundo como una superficie continua representada por una cuadrícula, como los píxeles de una imagen. Cada pieza de la cuadrícula puede ser un valor continuo (como un valor de elevación) o una clasificación categórica (como las clasificaciones de la cobertura del suelo). Ejemplos clásicos son los datos de altitud o las imágenes de satélite.

Datos rasterizados

Fuente: Universidad Estatal de Humboldt

Tanto los datos vectoriales como los ráster suelen ir acompañados de datos no espaciales, también conocidos como atributos. Los datos espaciales pueden tener cualquier número de atributos adicionales que acompañen a la información sobre la ubicación. Por ejemplo, la ubicación de un centro escolar puede asociarse al nombre del centro, al número de alumnos o a la dirección.

GeoPandas está diseñado para trabajar con datos vectoriales, aunque puede asociarse fácilmente con otros paquetes de Python para tratar datos ráster, como rasterio. Para leer datos espaciales, GeoPandas viene con la función geopandas.read_file(). Esta potente función puede leer automáticamente la mayoría de los datos espaciales basados en vectores que se producen.

Algunos de los formatos de datos vectoriales más comunes son:

  • Shapefile. Como norma del sector, los shapefiles son el formato de datos vectoriales más común. Se compone de tres archivos que suelen proporcionarse en un archivo zip:
      • El archivo.shp contiene geometría de formas.
      • El archivo .dbf contiene los atributos de cada geometría,
      • El archivo .shx o archivo de índice de formas ayuda a vincular los atributos a las formas.
  • GeoJSON. Es un formato más reciente para datos geoespaciales publicado en 2016. A diferencia de los shapefiles, GeoJSON es un único archivo, por lo que es más fácil trabajar con él.

En los siguientes ejemplos, utilizaremos la función geopandas.read_file() para leer un archivo GeoJSON alojado en GitHub que contiene datos geoespaciales sobre los distintos distritos de la ciudad de Barcelona. 

url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'

districts = gpd.read_file(url)

districts

Datos del Distrito de Barcelona

Volveremos a este conjunto de datos dentro de un minuto, pero antes tienes que saber cómo volver a escribir un GeoDataFrame en un archivo. Es bastante fácil. Sólo tienes que utilizar GeoDataFrame.to_file() para crear un archivo que contenga los datos espaciales. Por defecto, el formato del nuevo documento será un shapefile, pero puedes cambiarlo con el parámetro "controlador". 

Por ejemplo, guarda el GeoDataFrame del distrito en un archivo geoJSON:

districts.to_file("districts.geojson", driver="GeoJSON")

Explorar GeoDataFrames

Habrás observado que el GeoDataFrame de la sección anterior se parece a un dataframe tradicional de pandas. La similitud tiene sentido, ya que GeoDataFrame es una subclase de pandas.DataFrame. Eso significa que hereda muchos de los métodos y atributos de pandas dataframe. La novedad de GeoDataFrame es que puede almacenar columnas de geometría (también conocidas como GeoSeries) y realizar operaciones espaciales. 

La columna de geometría puede contener cualquier tipo de datos vectoriales, como puntos, líneas y polígonos. Además, es importante tener en cuenta que, aunque un GeoDataFrame puede tener varias GeoSeries, sólo una columna se considera la geometría activa, lo que significa que todas las operaciones espaciales se basarán en esa columna.

GeoDataFrame

Fuente: GeoPandas

Otra característica importante de GeoDataFrames es que cada GeoSerie viene con información CRS asociada. Esta información CRS indica a GeoPandas dónde se encuentran las coordenadas en la Tierra. Esta información es clave para el análisis espacial. Por ejemplo, si necesitas combinar dos conjuntos de datos espaciales, debes asegurarte de que se expresan en el mismo SIR. De lo contrario, no obtendrás el resultado que esperabas.

Hay dos categorías principales de SRI:

  • Coordenadas geográficas. Definen una posición global en grados de latitud y longitud respecto al ecuador y al primer meridiano. Con este sistema, podemos especificar fácilmente cualquier lugar de la Tierra. Se utiliza mucho, por ejemplo, en el GPS. El CRS más popular es EPSG:4326, también llamado WGS84.
  • Coordenadas proyectadas. Aunque la Tierra es redonda, solemos representarla en un mapa de dos dimensiones. Las coordenadas proyectadas expresan las ubicaciones en las dimensiones X e Y, lo que nos permite trabajar con una unidad de longitud, como los metros, en lugar de los grados, lo que hace que el análisis sea más cómodo y eficaz. Sin embargo, pasar de la Tierra tridimensional a un mapa bidimensional provocará inevitablemente distorsiones. Por eso hay distintos enfoques para crear coordenadas proyectadas. Por ejemplo, muchos países han adoptado un SIR proyectado estándar para su geografía particular.

Hay mucho más sobre CRS, pero está fuera del alcance de este tutorial. Un gran recurso para obtener información adicional y ejemplos prácticos es nuestro Curso de Trabajo con Datos Geoespaciales en Python.

En GeoPandas, la información CRS se almacena en el atributo crs:

districts.crs

Geopandas CRS

El GeoDataFrame del distrito está asociado a coordenadas geográficas (EPSG: 4326), pero queremos transformarlo en coordenadas proyectadas, para poder hacer algunos cálculos en metros. Transformémoslo a EPSG:2062, el SIR proyectado estándar para España. Podemos hacerlo con el método Geopandas.to_crs().

districts.to_crs(epsg=2062, inplace=True)

districts.crs

Geopandas_to_crs

Ahora que hemos establecido el CRS proyectado correcto, estamos listos para explorar los atributos de GeoDataFrames.

Explorar los atributos de un conjunto de datos espaciales

GeoPandas hereda varios métodos y atributos útiles del paquete shapely. Vamos a tratar cuatro de ellas.

Area

El atributo área devuelve el área calculada de una geometría. Podemos guardar el área resultante (convertida a km2) en una nueva columna:

districts['area'] = districts.area / 1000000

districts

Distritos con superficie

Centroide

El atributo centroide devuelve el punto central de una geometría. Podemos añadirla a nuestro conjunto de datos, creando así una nueva columna de geometría.

districts['centroid']=districts.centroid

districts

Distritos con centroide

Límite

El atributo de límite dentro del límite de un polígono. 

districts['boundary']=districts.boundary

Distancia

El método de la distancia da la distancia mínima de una geometría a un lugar. Digamos que queremos calcular la distancia desde la famosa iglesia de la Sagrada Familia, situada en el distrito del Eixample, hasta los centroides de todos los distritos de Barcelona, y luego sumar las distancias (en kilómetros) en una nueva columna. 

Sagrada Familia

The Sagrada Familia. Fuente: Wikipedia

En primer lugar, tenemos que crear un punto utilizando la función shapely Point() con las coordenadas deseadas (puedes encontrarlas fácilmente en Google Maps), convertirlo en una GeoSerie con el CRS adecuado y, a continuación, utilizar el método GeoPandas.distance():

from shapely.geometry import Point

sagrada_fam = Point(2.1743680500855005, 41.403656946781304)
sagrada_fam = gpd.GeoSeries(sagrada_fam, crs=4326)
sagrada_fam= sagrada_fam.to_crs(epsg=2062)
districts['sagrada_fam_dist'] = [float(sagrada_fam.distance(centroid)) / 1000 for centroid in districts.centroid]

El conjunto de datos resultante, tras las operaciones espaciales anteriores, tiene el siguiente aspecto:

operaciones espaciales

Trazar con GeoPandas

Las operaciones espaciales que hemos realizado aportan información útil para nuestro estudio. Sin embargo, visualizar tus geometrías en el espacio es una forma estupenda de mejorar tu análisis. Afortunadamente, crear una parcela GeoPandas es superfácil. Sólo tienes que llamar a la función GeoDataFrame.plot(), basada en el paquete matplotlib de Python.

Empecemos con una visualización básica de los distritos de Barcelona. 

ax= districts.plot(figsize=(10,6))

Barcelona Distritos Básico
Podemos hacer que nuestro gráfico GeoPandas sea más informativo coloreando cada distrito. Si ajustas la leyenda a "Verdadero", se crea una leyenda que ayuda a interpretar los colores.

ax= districts.plot(column=district_name', figsize=(10,6), edgecolor='black', legend=True)

Barcelona Districts Colour

Por último, podemos añadir los centroides de los distritos y de la Sagrada Familia a nuestro mapa, así como un título. Igualmente, para hacer la trama más atractiva, podemos utilizar el simpático paquete contextily para añadir un mapa de azulejos de la ciudad real de Barcelona.

import contextily
ax= districts.plot(column='district_name', figsize=(12,6), alpha=0.5, legend=True)
districts["centroid"].plot(ax=ax, color="green")
sagrada_fam.plot(ax=ax,color='black', marker='+')
contextily.add_basemap(ax, crs=districts.crs.to_string())
plt.title('A Beautiful Map of Barcelona')
plt.axis('off')
plt.show()

Mapa de Barcelona

Guay, ¿verdad? Hay mucho más que puedes hacer para crear bellas visualizaciones espaciales. Nuestro curso Visualización de datos espaciales con Python es un gran recurso para llevar tus habilidades de visualización al siguiente nivel.

Relaciones espaciales con GeoPandas

Uno de los aspectos clave de los datos geoespaciales es cómo se relacionan entre sí en el espacio. GeoPandas aprovecha la potencia de los paquetes pandas y shapely para realizar todo tipo de relaciones espaciales entre conjuntos de datos espaciales. En este apartado trataremos algunas de las operaciones más habituales.

Uniones por atributos

Hay dos formas de combinar conjuntos de datos en pandas: uniones por atributos y uniones espaciales. 

Las uniones por atributos nos permiten unir dos GeoDataFrames basándonos en variables no geométricas, igual que una unión normal en pandas. De hecho, la forma de realizar uniones de atributos es mediante el método estándar pandas.merge(). Si te interesa saber más sobre las uniones en pandas, consulta nuestro tutorial Unir marcos de datos en pandas.

Por ejemplo, sería interesante enriquecer nuestro GeoDataFrame con los datos de población de Barcelona en 2022.

pop =pd.read_csv('poblacion_barna_2022.csv', usecols=['Nom_Districte','Nombre'])
pop = pd.DataFrame(pop.groupby('Nom_Districte')['Nombre'].sum()).reset_index()
pop.columns=['district_name','population_22']
districts = districts.merge(pop)
districtsv

Datos de población de Barcelona

Uniones espaciales

En cambio, las uniones espaciales permiten fusionar dos GeoDataFrames basándose en sus relaciones espaciales. 

Por ejemplo, identifiquemos los distritos en los que se encuentran los carriles bici de Barcelona.

url = 'https://opendata-ajuntament.barcelona.cat/resources/bcn/CarrilsBici/CARRIL_BICI.geojson'
bike_lane = gpd.read_file(url)
bike_lane = bike_lane.loc[:,['ID','geometry']]
bike_lane.to_crs(epsg=2062, inplace=True)

Identificación y geometría

Barcelona Bike Lanes

En GeoPandas, la operación de unión espacial está disponible como función sjoin(). El primer argumento que especificamos es el GeoDataFrame al que queremos añadir información, y el segundo argumento es el GeoDataFrame que contiene la información que queremos añadir. A continuación, tenemos que especificar el tipo de unión. Por último, el parámetro "predicado" indica a GeoPandas qué relación espacial queremos utilizar para emparejar ambos conjuntos de datos. Algunas de las relaciones más habituales son "intersecta", "contiene" y "dentro de".

En nuestro ejemplo, utilizaremos el predicado "interseca". Dos objetos geométricos se intersecan si tienen algún límite o punto interior en común. 

lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts

Interseca

Observa que el GeoDataFrame resultante tiene más filas que el GeoDataFrame carril_bici. Esto se debe a que un carril bici puede estar situado en más de un distrito. 

Por último, podemos agrupar nuestro conjunto de datos para obtener el número de carriles bici por distritos:

lanes_districts.groupby('district_name').size()

Agrupación Lanesby

GeoPandas Operaciones de superposición

Por último, las superposiciones espaciales te permiten comparar dos GeoDataFrames que contengan geometrías poligonales o multipoligonales y crear un nuevo GeoDataFrame con las nuevas geometrías que representen la combinación espacial y las propiedades fusionadas. La imagen siguiente muestra las distintas posibilidades:

Gemometría multipoligonal

Fuente: GeoPandas

Imagen El Ayuntamiento de Barcelona quiere construir nuevos parques locales para luchar contra la contaminación y promover el bienestar de la comunidad. Una idea preliminar es crear grandes parques redondos a menos de 500 metros del centro de cada distrito. Podemos simularlo creando un búfer basado en el centroide de cada distrito.  

parks = gpd.GeoDataFrame(districts.centroid.buffer(500), geometry=0)

parks.plot()

centroide de cada distrito

Ahora estamos preparados para realizar algunas operaciones de superposición. Por ejemplo, si queremos ver sólo las zonas de los distritos donde se ubicarían los parques, podemos utilizar el método GeoPandas.overlay():

parks_intersection = districts.overlay(parks, how='intersection')
ax = parks_intersection.plot(alpha=0.5, edgecolor='black', column='district_name')

Geopandas Overlay

O, si queremos ver los distritos sin la zona ocupada por los parques proyectados, podemos cambiar el parámetro "cómo" para realizar otra operación de superposición.

parks_difference = districts.overlay(parks, how='difference')
ax = parks_difference.plot(alpha=0.5, edgecolor='black', column='district_name')

Geopandas Overlay 2

Conclusión

Esperamos que te haya gustado este tutorial de GeoPandas. El análisis espacial es uno de los ámbitos más interesantes de la ciencia de datos, ya que ofrece infinitas oportunidades para enriquecer tu análisis con información basada en la ubicación. Hay muchas herramientas para el análisis espacial, pero si ya estás familiarizado con Python, GeoPandas es un buen lugar para empezar. 

¿Dispuesto a continuar tu formación geoespacial? ¡Te tenemos cubierto! Consulta nuestros siguientes materiales y conviértete en un maestro geoespacial:

GeoPandas Preguntas frecuentes

¿Qué es el análisis de datos geoespaciales?

 La ciencia de datos geoespaciales es un subcampo de la ciencia de datos que se centra en extraer información de los datos geoespaciales aprovechando la potencia de los algoritmos espaciales y las técnicas analíticas.

¿Qué es GeoPandas?

GeoPandas es un proyecto de código abierto para facilitar el trabajo con datos geoespaciales en Python.

¿Cuál es la diferencia entre pandas y GeoPandas?

GeoPandas amplía los tipos de datos utilizados por pandas para permitir operaciones espaciales sobre tipos geométricos. GeoPandas utiliza pandas DataFrames para crear el llamado GeoDataFrame.

¿Cómo puedo aprender análisis espacial como programador de R?

Además de los cursos de Python, DataCamp también tiene un montón de cursos espaciales cursos y pistas pistas para programadores de R.

Temas