import geopandas as gpd
= gpd.read_file('datasets/barrios.gml')
datos_barrios 1) datos_barrios.head(
gml_id | MSLINK | BARRIO | OBSERVACIO | geometry | |
---|---|---|---|---|---|
0 | barrios.1 | 28 | VICTORIA WALSH | Mod Lím Or | POLYGON ((-60.68993 -32.96495, -60.68973 -32.9... |
UNIDAD 4 - Parte 3
El atributo que distingue a los datos georreferenciados de otros tipos de datos es que contienen información sobre ubicaciones exactas sobre la superficie de nuestro planeta.
Para poder ubicar puntos o regiones sobre la superficie de la Tierra, es preciso conocer cómo es su forma y dimensiones. Este es el campo de estudio de la ciencia conocida como geodesia.
A continuación, definiremos algunos conceptos básicos para poder construir visualizaciones de este tipo de datos.
Una manera de modelar la superficie de la Tierra sería considerarla como una esfera. En este caso, los cálculos de profundidad y distancias serían fáciles porque las ecuaciones son conocidas.
Sin embargo, la Tierra no es una esfera perfecta.
La rotación terrestre hace que la velocidad en el Ecuador sea mayor que en los polos, y esto deforma a nuestro planeta, haciendo que sea más “alargado” en la zona ecuatorial y más “achatado” en las zonas polares (el radio de la Tierra no es constante a lo largo de su superficie).
El elipsoide una forma geométrica que se adapta mejor a la forma real de la Tierra. Por lo tanto, permite una mejor idealización de su superficie y posibilita un mejor ajuste.
El elipsoide es una forma tridimensional creada a partir de la rotación de una elipse de dos dimensiones.
En el caso de la Tierra, el semieje mayor es el radio desde el centro de la Tierra hasta el Ecuador, mientras que el semieje menor es el radio desde el centro de la Tierra hasta el Polo.
Existen diversos elipsoides propuestos para modelar la superficie de la Tierra, los cuales se diferencian por las longitudes de los semiejes. Acá se resumen algunos de ellos:
Elipsoide | Semieje mayor (m) | Semieje menor (m) |
---|---|---|
Australian National | 6378160.000 | 6356774.719 |
Clarke 1866 | 6378206.400 | 6356583.800 |
Bessel 1841 | 6377397.155 | 6356078.963 |
Fischer 1968 | 6378150.000 | 6356768.337 |
International 1924 (Hayford) | 6378388.000 | 6356911.946 |
GRS 1980 | 6378137.000 | 6356752.314 |
WGS 84 | 6378137.000 | 6356752.314 |
Los elipsoides se clasifican, en términos generales, en dos grupos:
Elipsoides locales: se adaptan mejor a una zona específica de la Tierra.
Elipsoides globales o generales: son aquellos en los que coinciden tanto el centro de gravedad terrestre con el del elipsoide, como el plano ecuatorial terrestre con el del elipsoide.
El elipsoide más comúnmente usado actualmente, y a nivel global, es el World Geodetic System 1984 (WGS 84), ya que es la superficie de referencia para el Sistema de Posicionamiento Global (GPS).
El geoide reproduce el hecho de que la masa de la Tierra no es uniforme en todos los puntos y, por consiguiente, tampoco la fuerza gravitatoria.
Dado que la masa de la Tierra no es uniforme en todos los puntos y la dirección de gravedad cambia, el geoide no es una superficie regular como el elipsoide, sino que presenta una forma irregular, con protuberancias y depresiones.
Cuando se trabaja con un elipsoide general, éste se sitúa de tal modo que tanto la posición de su centro de gravedad como su plano ecuatorial coincidan con los terrestres.
Cuando el elipsoide es local, estas propiedades no han de cumplirse necesariamente, y el elipsoide a solas resulta insuficiente ya que carecemos de información sobre su posicionamiento con respecto a la superficie terrestre.
Surge así el concepto de datum.
El datum es un sistema de referencia. Proporciona un modelo que permite a las personas medir ubicaciones en la superficie de la Tierra en relación con un elipsoide particular que se ajusta apropiadamente a la región en la que se realizan las mediciones, en un momento particular.
Hay muchos datums de referencia diferentes y todos tienen un nombre único. En términos generales, se los puede clasificar en datums globales o geocéntricos y datums locales, en función de si se utilizan como referencia en todo el mundo o si están diseñados para alguna región en particular.
Un ejemplo de la primera clase es el datum global WGS 84, establecido por el Departamento de Defensa de Estados Unidos y utilizado en el GPS.
Ejemplos de datums locales son Campo Inchauspe (nacional), Chos Malal y Tapi Aike, concebidos a partir de la necesidad de generación de cartografía en nuestro país.
Dado que un datum local alinea tan estrechamente su esferoide a una área determinada de la superficie de la Tierra, no es adecuado para su uso fuera del área para la que se diseñó.
A la hora de trabajar con datos georreferenciados es fundamental conocer su sistema de coordenadas de referencia (CRS) (ya veremos cómo consultar esta información).
Esto nos sirve, por ejemplo, para saber las unidades con las que estamos trabajando, o si podemos unir espacialmente a dos datasets, ya que no podemos realizar esta operación si tienen diferentes CRS.
El sistema de coordenadas geográficas es un sistema de coordenadas esféricas mediante el cual un punto se localiza con dos valores angulares: la latitud (\(\phi\)) y la longitud (\(\lambda\)).
Si bien el sistema de coordenadas esféricas (o elipsoidales) es útil y potente, estamos más acostumbrados a la utilización de sistemas cartesianos, en los cuales la posición de un punto se define mediante un par de coordenadas X e Y.
Además, si necesitamos crear una representación visual de la información cartográfica, lo habitual es hacerlo en una superficie plana.
Proyección cartográfica: proceso de asignar una coordenada plana a cada punto de la superficie de la Tierra.
Una proyección cartográfica es la correspondencia matemática biunívoca entre los puntos de una esfera o elipsoide y sus transformados en un plano.
Las proyecciones se clasifican según la superficie sobre la que se proyectan los puntos. Si bien existen otras superficies, las más habituales son: el plano, el cono y el cilindro.
La superficie desarrollable es un cono, el cual se sitúa generalmente tangente o secante en dos paralelos a la superficie del elipsoide.
En este último caso, la distorsión se minimiza en las áreas entre dichos paralelos, haciéndola útil para representar franjas que no abarquen una gran distancia en latitud, pero poco adecuada para representación de grandes áreas. Ejemplos: Proyección Cónica Equiárea de Albers y Proyección Conforme Cónica de Lambert.
Son aquellas que proporcionan la apariencia de un rectángulo, que puede ser visto como una superficie cilíndrica “desenrollada”.
Al proyectar, tanto los meridianos como los paralelos se convierten en líneas paralelas, aunque la distancia entre estos últimos no es constante. Ejemplos: Proyección Conforme de Mercator y Proyección Equivalente de Lambert.
Consisten en proyectar una parte de la Tierra sobre un plano tangente a la esfera en un punto seleccionado. El punto de contacto puede ser el Polo Norte, el Polo Sur, un punto en el Ecuador o cualquier punto intermedio.
Es una librería de Python de código abierto que proporciona soporte para el trabajo con datos georreferenciados sobre la base de objetos Pandas.
GeoPandas
utiliza geometrías espaciales para representar diferentes tipos de objetos geográficos.
GeoPandas
utiliza geometrías espaciales para representar diferentes tipos de objetos geográficos. Estos son los más comunes:
POINT
(Punto): representa una ubicación individual en el espacio geográfico, definido por una coordenada de latitud y longitud. Ejemplos: ubicación de un sensor de monitoreo ambiental, una ciudad, un efector de salud, etc.
LINESTRING
(Línea): es una secuencia de puntos conectados que forman una línea. Representa objetos lineales, como rutas, calles, ríos o límites geográficos.
POLYGON
(Polígono): es un área cerrada formada por una secuencia de puntos conectados. Representa una superficie o área geográfica, como una parcela de terreno, un lago, una provincia o un país.
MULTIPOLYGON
(Polígono): es una geometría que agrupa múltiples POLYGON
que están relacionados entre sí, pero que no necesariamente son contiguos. Por ejemplo: conjunto de islas en un archipiélago, múltiples departamentos que conforman una provincia, múltiples provincias/estados que conforman un país, etc.
GeoPandas
facilita la lectura de archivos geoespaciales, como Shapefiles, GML o GeoJSON, que contienen datos geográficos. La información sobre las geometrías de los objetos (como puntos, líneas o polígonos) se suele almacenar en una columna especial llamada geometry
.
Para leer cualquiera de estos archivos, podemos utilizar el método gpd.read_file()
.
Para ejemplificar, trabajaremos con los datasets barrios.gml
y geo_salud.gml
, que se encuentran dentro de los datos abiertos de la Municipalidad de Rosario y contienen información relacionada a los barrios de la ciudad y a los centros de salud, respectivamente.
Ambos archivos se encuentran en formato GML, acrónimo inglés de Geography Markup Language (Lenguaje de Marcado Geográfico), el cual se trata de un sublenguaje de XML utilizado para el modelado, transporte y almacenamiento de información geográfica.
Exploremos el primero de estos archivos:
gml_id | MSLINK | BARRIO | OBSERVACIO | geometry | |
---|---|---|---|---|---|
0 | barrios.1 | 28 | VICTORIA WALSH | Mod Lím Or | POLYGON ((-60.68993 -32.96495, -60.68973 -32.9... |
¿Qué tipo de elemento contiene la columna geometry
?
<class 'geopandas.geodataframe.GeoDataFrame'>
RangeIndex: 51 entries, 0 to 50
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 gml_id 51 non-null object
1 MSLINK 51 non-null int64
2 BARRIO 51 non-null object
3 OBSERVACIO 51 non-null object
4 geometry 51 non-null geometry
dtypes: geometry(1), int64(1), object(3)
memory usage: 2.1+ KB
Observar que el objeto datos_barrios
es un objeto de tipo GeoDataFrame
y que éste contiene una columna de tipo geometry
, en la que se encuentra la información geoespacial.
Podemos hacer un mapa utilizando el método plot
sobre el objeto GeoDataFrame
:
Podemos representar sólo las divisiones entre barrios con el método boundary.plot
:
Importamos ahora el archivo geo_salud.gml
y exploramos su contenido:
fid | id | name | codigo_calle | calle | altura | bis | direccion | etiquetas | subtipo | ... | titular | estado | tipo_geometria | ultima_actualizacion | contactos | atencion | descripcion | piso | multimedia | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | F0 | 1220 | Hospital Provincial | 21950 | ALEM LEANDRO N | 1450 | 0 | ALEM LEANDRO N 1450 | Salud, Datos útiles | LUGAR | ... | Provincial | Publicado | Punto | 01/08/2017 09:35 | Teléfono: 4801402. | None | None | None | None | POINT (-60.63051 -32.95626) |
1 rows × 25 columns
¿Qué tipo de elemento contiene la columna geometry
?
🤔 ¿Cómo podemos hacer para agregar, al gráfico anterior, información acerca del tipo de efector de salud (Municipal/Nacional/Privado/Provincial)?
Tener en cuenta que, en la base datos_centros_salud
, esta información se encuentra en la columna titular
.
# Crea el mapa base con los límites de los barrios
graf_base = datos_barrios.plot(edgecolor = 'black', color = 'lightgrey', linewidth = 1)
# Superpone los puntos de los centros de salud en el mapa base coloreándolos según categoría en 'titular'
datos_centros_salud.plot(ax = graf_base, markersize = 20, column = 'titular')
Mejoremos un poquito el gráfico anterior:
Agreguemos la leyenda seteando el parámetro legend = True
.
Configuremos la paleta cmap = 'viridis'
.
Agreguemos un título a la leyenda y ajustemos manualmente su posición en el gráfico a través del parámetro legend_kwds = dict(title = 'Efector', bbox_to_anchor = (1.4, 1))
.
Representemos sólo los límites de cada barrio, sin relleno, para que los puntos se visualicen mejor.
# Crea el mapa base con los límites de los barrios
graf_base = datos_barrios.boundary.plot(edgecolor = 'black', linewidth = 0.8)
# Superpone los puntos de los centros de salud en el mapa base coloreándolos según categoría en 'titular'
datos_centros_salud.plot(ax = graf_base, markersize = 20, column = 'titular', legend = True, cmap = 'viridis', legend_kwds = dict(title = 'Efector', bbox_to_anchor = (1.4, 1)))
Importaremos ahora el archivo cultivos_por_dpto_mapa.json
, que contiene datos acerca de la superficie cultivada en cada uno de los departamentos de la provincia de Córdoba:
id | nombre | sup_cultivada | sup_trigo | porc_trigo | sup_maiz | porc_maiz | sup_soja | porc_soja | sup_mani | porc_mani | sup_sorgo | porc_sorgo | sup_tr_mz | porc_tr_mz | sup_tr_sj | porc_tr_sj | sup_dpto | geometry | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | cultivos_por_dpto_mapa.1 | JUAREZ CELMAN | 542086 Has | 710 Has | 0.1 % | 139802 Has | 25.8 % | 241694 Has | 44.6 % | 58191 Has | 10.7 % | 1394 Has | 0.3 % | 25814 Has | 4.8 % | 74481 Has | 13.7 % | 792949 Has | MULTIPOLYGON (((4416979.546 6325867.470, 44168... |
El objetivo es construir un mapa para representar visualmente la cantidad de hectáreas sembradas por departamento (columna sup_cultivada
). Para ello, primero debemos extraer el número, separándolo de la unidad “Has”:
datos_cultivos['sup_cultivada_has'] = datos_cultivos['sup_cultivada'].str.extract(r'(\d+)').astype('int')
datos_cultivos.head(1)
id | nombre | sup_cultivada | sup_trigo | porc_trigo | sup_maiz | porc_maiz | sup_soja | porc_soja | sup_mani | porc_mani | sup_sorgo | porc_sorgo | sup_tr_mz | porc_tr_mz | sup_tr_sj | porc_tr_sj | sup_dpto | geometry | sup_cultivada_has | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | cultivos_por_dpto_mapa.1 | JUAREZ CELMAN | 542086 Has | 710 Has | 0.1 % | 139802 Has | 25.8 % | 241694 Has | 44.6 % | 58191 Has | 10.7 % | 1394 Has | 0.3 % | 25814 Has | 4.8 % | 74481 Has | 13.7 % | 792949 Has | MULTIPOLYGON (((4416979.546 6325867.470, 44168... | 542086 |
Representemos dicha información con el método plot
:
Con el método crs
accedemos al Sistema de Coordenadas de Referencia del GeoDataFrame:
<Projected CRS: EPSG:22174>
Name: POSGAR 98 / Argentina 4
Axis Info [cartesian]:
- X[north]: Northing (metre)
- Y[east]: Easting (metre)
Area of Use:
- name: Argentina - between 64°30'W and 61°30'W, onshore.
- bounds: (-64.5, -54.91, -61.5, -21.99)
Coordinate Operation:
- name: Argentina zone 4
- method: Transverse Mercator
Datum: Posiciones Geodesicas Argentinas 1998
- Ellipsoid: GRS 1980
- Prime Meridian: Greenwich
El CRS EPSG:22174 es proyectado, lo que significa que sus coordenadas están en metros (norte y este).
Para representar las coordenadas adecuadamente, debemos reproyectar los datos a un CRS geográfico, como EPSG:4326 o WGS 84, que usa latitud y longitud en grados.
Rehacemos el mapa:
Folium
es una biblioteca de Python diseñada para facilitar la visualización de datos geoespaciales en mapas interactivos que se pueden visualizar en navegadores web.
Basada en la poderosa biblioteca Leaflet.js, Folium permite crear mapas de una manera sencilla y personalizarlos con una variedad de capas, marcadores y herramientas de análisis espacial.
Un mapa cloropleth es una representación gráfica de datos en un mapa donde las áreas geográficas están coloreadas o sombreadas en función de la intensidad o el valor de un atributo específico.
Este tipo de visualización es particularmente útil para mostrar variaciones en datos cuantitativos, como tasas de población, distribución de ingresos, niveles de educación o cualquier otra métrica que se pueda asociar a diferentes regiones.