Untitled

 avatar
unknown
plain_text
a year ago
3.3 kB
8
Indexable
import folium
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
import matplotlib.pyplot as plt

# Cargar los puntos georreferenciados desde el archivo GeoJSON
puntos = gpd.read_file('hundredpoints.geojson')

# Cargar la base de datos de parques y jardines con la codificación UTF-8
parques = pd.read_csv('centroides_zonas_verdes.csv', encoding='utf-8')
parques_gdf = gpd.GeoDataFrame(parques, 
                               geometry=gpd.points_from_xy(parques['longitud'], parques['latitud']),
                               crs="EPSG:4326")

# Crear un mapa centrado en la primera ubicación del GeoJSON
mapa = folium.Map(location=[puntos.geometry.y.mean(), puntos.geometry.x.mean()], zoom_start=13)

# Función para contar las zonas verdes en un radio de 750 m
def contar_zonas_verdes(punto, parques, radio=750):
    # Convertir el radio a grados (aproximadamente)
    buffer = punto.buffer(radio / 111320)  # 1 grado ~ 111.32 km en el ecuador
    zonas_verdes = parques[parques.intersects(buffer)]
    return len(zonas_verdes)

# Encontrar el número máximo de zonas verdes alrededor de los puntos para normalizar los colores y la puntuación
max_zonas_verdes = puntos.geometry.apply(lambda geom: contar_zonas_verdes(geom, parques_gdf)).max()

# Crear una paleta de colores
colormap = folium.LinearColormap(colors=['red', 'yellow', 'green'], vmin=0, vmax=max_zonas_verdes)

# Preparar una lista para los resultados
resultados = []

# Añadir los puntos georreferenciados al mapa con colores basados en el número de zonas verdes
for idx, row in puntos.iterrows():
    num_zonas_verdes = contar_zonas_verdes(row.geometry, parques_gdf)
    color = colormap(num_zonas_verdes)
    
    # Calcular la puntuación normalizada de 0 a 10
    puntuacion = (num_zonas_verdes / max_zonas_verdes) * 10
    
    # Añadir los resultados a la lista
    resultados.append({'longitud': row.geometry.x, 'latitud': row.geometry.y, 'puntuacion': round(puntuacion, 2), 'Numero de Zonas Verdes': num_zonas_verdes})
    
    # Añadir un círculo alrededor del punto
    folium.Circle(
        location=[row.geometry.y, row.geometry.x],
        radius=750,  # Radio de 750 m
        color=None,
        fill=True,
        fill_color=color,
        fill_opacity=0.2,
        popup=f'Zonas Verdes: {num_zonas_verdes}\nPuntuación: {round(puntuacion, 2)}',
        opacity=0
    ).add_to(mapa)
    
    # Añadir el marcador del punto
    folium.CircleMarker(
        location=[row.geometry.y, row.geometry.x],
        radius=4,
        color='black',
        fill=True,
        fill_color='black',
        fill_opacity=1,
        popup=f'Zonas Verdes: {num_zonas_verdes}\nPuntuación: {round(puntuacion, 2)}'
    ).add_to(mapa)

# Añadir la escala de colores al mapa
colormap.add_to(mapa)

# Guardar el mapa en un archivo HTML
mapa.save('mapa_con_ZonasVerdes.html')

# Crear un DataFrame con los resultados y guardarlo como un archivo CSV
resultados_df = pd.DataFrame(resultados)
resultados_df.to_csv('Puntuacion_Zonas_Verdes.csv', index=False, encoding='utf-8')

print("Mapa guardado en 'mapa_con_ZonasVerdes.html'")
print("Resultados guardados en 'Puntuacion_Zonas_Verdes.csv'")


Editor is loading...
Leave a Comment