Skip to content

Instantly share code, notes, and snippets.

@vviguie
Created September 22, 2021 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vviguie/a7dee5f0c8c1c40732c1c4efdf20bea4 to your computer and use it in GitHub Desktop.
Save vviguie/a7dee5f0c8c1c40732c1c4efdf20bea4 to your computer and use it in GitHub Desktop.
TP EEET modélisation villes
#!/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