Created
September 22, 2021 09:40
-
-
Save vviguie/a7dee5f0c8c1c40732c1c4efdf20bea4 to your computer and use it in GitHub Desktop.
TP EEET modélisation villes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2 | |
# -*- coding: utf-8 -*- | |
"""Exemple de script pour l'analyse des résultats de NEDUM""" | |
import matplotlib.pyplot as plt | |
import numpy as np | |
import pandas as pd | |
import geopandas | |
import contextily as ctx | |
from shapely.geometry import Point #pour faire des cartes | |
################################## | |
#%% Importation des données | |
################################## | |
outNedum = pd.read_csv('output_NEDUM.csv', sep = ',') | |
# transformatio en geodataframe (pour afficher comme une carte) | |
geometry = [Point(xy) for xy in zip(outNedum['X'], outNedum['Y'])] | |
outNedum_gdf = geopandas.GeoDataFrame(outNedum, geometry=geometry) | |
# on fixe le bon système de coordonnées | |
# CRS = coordinate reference system (cf. https://en.wikipedia.org/wiki/Spatial_reference_system) | |
# le CRS 2154 c'est le système de référence de l'IGN pour les cartes autour de Paris | |
outNedum_gdf.crs = "EPSG:2154" | |
# on convertit dans le système de coordonnées utilisé par Google Map | |
outNedum_gdf=outNedum_gdf.to_crs(epsg=3857) | |
################################## | |
#%% Exemples de courbes et de cartes | |
################################## | |
#%% 1. Courbe des loyers en fonction de la distance | |
#pour fermer les autres figures | |
plt.close('all') | |
#coordonnées du centre de Paris | |
X_centre_Paris=653750 | |
Y_centre_Paris=6862350 | |
outNedum['distance_centre'] = np.sqrt((outNedum['X']-X_centre_Paris) ** 2 + (outNedum['Y']-Y_centre_Paris) ** 2)/1000 | |
plt.scatter(outNedum['distance_centre'],outNedum['simul_2030_sc1_BAU_loyer']) | |
#%% 2. Carte de la construction | |
#pour fermer les autres figures | |
plt.close('all') | |
#'-logement' est en nombre de m2 construits par nombre de km2 au sol | |
# Attention, pour avoir le Coefficient d'Occupation des Sols, il faut diviser par 10^6 | |
plt.figure() | |
plt.scatter(outNedum['X'], outNedum['Y'],20, outNedum['simul_2030_sc3_ZI_logement'] * outNedum['coeff_land']) #construction | |
plt.colorbar() | |
#%% 3. Pour tracer une carte avec un fond de carte | |
# fonction qui trace une carte | |
def carto(variable=outNedum['coeff_land'],X=outNedum['X'],Y=outNedum['Y']): | |
# creation d'un geodataframe (pour afficher comme une carte) | |
# 1. on cree les infos spatiales | |
geometry = [Point(xy) for xy in zip(X, Y)] | |
# 2. on cree le dataframe a transformer en geodataframe | |
data_frame_temp=pd.concat([X,Y,pd.Series(variable)], axis=1) | |
# 3. on le convertit en geodataframe | |
geodata_frame_temp = geopandas.GeoDataFrame(data_frame_temp, geometry=geometry) | |
# on fixe le bon système de coordonnées | |
# CRS = coordinate reference system (cf. https://en.wikipedia.org/wiki/Spatial_reference_system) | |
# le CRS 2154 c'est le système de référence de l'IGN pour les cartes autour de Paris | |
geodata_frame_temp.crs = "EPSG:2154" | |
# on convertit dans le système de coordonnées utilisé par Google Map et Open Street Map (nécessaire pour ajouter automatiquement un fond de crte) | |
geodata_frame_temp=geodata_frame_temp.to_crs(epsg=3857) | |
# on trace la carte | |
ax=geodata_frame_temp.plot(column=geodata_frame_temp.columns[2], | |
alpha=0.5, | |
edgecolor="None", | |
legend=True, | |
marker='o', | |
s=20) | |
# on ajoute un fond de carte: le fond Stamen Toner (https://wiki.openstreetmap.org/wiki/Stamen) | |
ctx.add_basemap(ax, | |
source=ctx.providers.Stamen.Toner, | |
alpha=0.8 | |
) | |
# ax.set_axis_off() | |
return ax | |
#pour fermer les autres figures | |
plt.close('all') | |
carto(outNedum['simul_2030_sc3_ZI_logement'] * outNedum['coeff_land']) | |
#%% 4. Si jamais on veut enregistrer la dernière figure affichée | |
plt.savefig("nom_de_la_figure.png", dpi=200) | |
################################## | |
#%% Calcul de la densité de population | |
################################## | |
# Attention, il faut multiplier par 'coeff_land' qui représente la part du pixel qui est urbanisable | |
sc1_densite_pop = outNedum['simul_2030_sc1_BAU_logement'] * outNedum['coeff_land'] / outNedum['simul_2030_sc1_BAU_taille'] #en ménages / km2 | |
################################## | |
#%% Calcul des émissions totales de la ville | |
################################## | |
#Les variables 'emissions' donnent la quantité d'émissions pour un ménage vivant dans le carreau (en gCO2 / an) | |
sc1_emission_tot = np.sum( sc1_densite_pop * outNedum['simul_2030_sc1_BAU_emissions']) / np.sum(sc1_densite_pop) /1000 #en moyenne par ménage en kgCO2 | |
################################## | |
#%% Calcul de la surface urbanisée | |
################################## | |
borne_urba = 100000 #en dessous de cette densité de construction on considère qu'on n'est plus en ville | |
sc1_surface_urba = np.sum(outNedum['coeff_land']*(outNedum['simul_2030_sc1_BAU_logement']>borne_urba)) #en km2 | |
################################## | |
#%% Scénario 3: zone inondable | |
################################## | |
#'part_inond' représente la part de la surface constructible qui est située en zone inondable | |
carto(outNedum['part_inond']) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment