es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agrupación espacial a partir de un marco de datos espaciales utilizando geopandas (Python)

Quiero realizar una agregación espacial (utilizando la mediana como función de agregación) a partir de un archivo CSV que contiene valores de contaminantes medidos en posiciones longitud y latitud.

El mapa resultante debería ser algo como:

Imagen del mapa

Pero aplicado a la extensión de una ciudad.
En este sentido, encontré este tutorial que se acerca a lo que quiero hacer, pero no logré obtener el resultado deseado.
Creo que me falta entender cómo usar correctamente la función “disolve” y graficar los datos resultantes (preferiblemente utilizando “Folium”).
¿Tienen algún ejemplo útil de código?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para la agrupación espacial utilizando Python

    Para realizar la agrupación espacial utilizando Python, primero necesitamos importar las bibliotecas necesarias. Estas serán geopandas, pandas, numpy y folium para esta tarea.

    import geopandas as gpd
    import pandas as pd
    import numpy as np
    import folium
    

    A continuación, necesitamos leer el archivo CSV que contiene los valores de los contaminantes medidos en las posiciones long y lat. Podemos leer el archivo CSV utilizando pandas y crear un objeto geopandas utilizando la función GeoDataFrame.

    # leer archivo CSV y crear objeto geopandas
    data = pd.read_csv('pollutant_data.csv')
    gdf = gpd.GeoDataFrame(data, geometry=gpd.points_from_xy(data.long, data.lat))
    

    Ahora, necesitamos realizar la agrupación espacial utilizando la función dissolve en geopandas. Agrupamos los datos en función de un tamaño de búfer seleccionado y utilizamos la mediana como función de agregación.

    # realizar agrupación espacial utilizando la función dissolve
    tamaño_búfer = 0.01
    tamaño_bin = gdf.buffer(tamaño_búfer).unary_union
    datos_agrupados = gdf.dissolve(by=tamaño_bin, aggfunc='median')
    

    Finalmente, podemos trazar los datos resultantes utilizando folium. Podemos crear un mapa de coropletas, donde cada polígono representa una agrupación espacial y el color representa la concentración de contaminantes.

    # crear mapa de folium
    m = folium.Map(location=[data.lat.median(), data.long.median()], zoom_start=11)
    
    # crear mapa de coropletas
    folium.Choropleth(
        geo_data=datos_agrupados.geometry.__geo_interface__,
        data=datos_agrupados,
        key_on='feature.id',
        columns=['concentración_contaminante'],
        fill_color='YlGnBu',
        fill_opacity=0.7,
        line_opacity=0.2,
        legend_name='Concentración de contaminantes'
    ).add_to(m)
    
    # añadir marcadores para los puntos de datos originales
    for idx, row in data.iterrows():
        folium.CircleMarker(
            location=[row['lat'], row['long']],
            radius=3,
            color='black',
            fill=True,
            fill_color='black',
            fill_opacity=1,
        ).add_to(m)
    
    # mostrar el mapa
    m
    

    Este código generará un mapa de coropletas similar al mostrado en la pregunta, donde cada polígono representa una agrupación espacial y el color representa la concentración de contaminantes. El mapa también incluye marcadores para los puntos de datos originales.

    ¡Espero que esto ayude!

Comments are closed.