Untitled
unknown
plain_text
a year ago
3.1 kB
8
Indexable
#!/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'")
Editor is loading...
Leave a Comment