Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
3.1 kB
2
Indexable
Never
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 21 13:36:49 2024

@author: nelson
"""

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)

# Añadir una columna para la puntuación al GeoDataFrame de puntos
puntos['num_zonas_verdes'] = puntos.geometry.apply(lambda geom: contar_zonas_verdes(geom, parques_gdf))
puntos['puntuacion'] = (puntos['num_zonas_verdes'] / max_zonas_verdes) * 10

# 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 = row['num_zonas_verdes']
    color = colormap(num_zonas_verdes)
    puntuacion = row['puntuacion']
    
    # 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')

# Guardar el GeoDataFrame como un archivo GeoJSON con todas las decimales en las coordenadas
puntos.to_csv('Puntuacion_Zonas_Verdes.csv')



print("Mapa guardado en 'mapa_con_ZonasVerdes.html'")
print("GeoDataFrame guardado en 'Puntuacion_Zonas_Verdes.geojson'")
Leave a Comment