Skip to content

Commit 15b7dad

Browse files
authored
Finalisation TP geopandas (#33)
1 parent cd19931 commit 15b7dad

File tree

3 files changed

+152
-28
lines changed

3 files changed

+152
-28
lines changed

content/manipulation/03_geopandas_tp.Rmd

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ slug: geopandasTP
2525
library(knitr)
2626
library(reticulate)
2727
knitr::knit_engines$set(python = reticulate::eng_python)
28-
knitr::opts_chunk$set(eval = FALSE)
28+
knitr::opts_chunk$set(eval = FALSE, include = FALSE, echo = FALSE)
2929
```
3030

3131
```{python, include = FALSE}
@@ -40,7 +40,7 @@ os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/W3CRK9/AppData/Local/r-min
4040
Dans cette partie, nous utiliserons la fonction suivante, qui facilite
4141
le téléchargement et le dézippage des données proposées sur `data.gouv`:
4242

43-
```{python}
43+
```{python, echo = TRUE, include = TRUE}
4444
import requests
4545
import tempfile
4646
import zipfile
@@ -58,7 +58,7 @@ def download_unzip(url, dirname = tempfile.gettempdir(), destname = "borders"):
5858

5959
**Exercice 1: lire et explorer la structure de fichiers géographiques**
6060

61-
1. Utiliser la fonction `download_unzip` avec l'url <'https://www.data.gouv.fr/fr/datasets/r/07b7c9a2-d1e2-4da6-9f20-01a7b72d4b12'>
61+
1. Utiliser la fonction `download_unzip` avec l'url <https://www.data.gouv.fr/fr/datasets/r/07b7c9a2-d1e2-4da6-9f20-01a7b72d4b12>
6262
pour télécharger les données communales.
6363
2. Importer le fichier avec la package `geopandas`
6464
(si vous avez laissé les paramètres par défaut,
@@ -74,6 +74,7 @@ transformation de l'espace tridimensionnel terrestre en une surface plane.
7474
6. Réprésenter la carte de Paris : quel est le problème ?
7575

7676
```{python}
77+
url = "https://www.data.gouv.fr/fr/datasets/r/07b7c9a2-d1e2-4da6-9f20-01a7b72d4b12"
7778
download_unzip(url)
7879
communes_borders = gpd.read_file(temporary_location + "/borders/communes-20190101.json")
7980
communes_borders.head()
@@ -114,13 +115,104 @@ arrondissements = gpd.read_file("https://opendata.paris.fr/explore/dataset/arron
114115
arrondissements.plot()
115116
communes_borders.crs == arrondissements.crs
116117
arrondissements = arrondissements.rename(columns = {"c_arinsee": "insee"})
118+
arrondissements['dep'] = "75"
117119
data_paris = communes_borders[~communes_borders.insee.str.startswith("75")].append(arrondissements)
118120
```
119121

120122
```{python}
121-
data_paris['dep'] = data_paris.insee.str[:2]
123+
data_paris['dep'] = data_paris.insee.astype(str).str[:2]
122124
data_paris[data_paris['dep'].isin(['75','92','93','94'])].plot()
123125
```
124126

127+
# Utiliser des données géographiques comme des couches
128+
graphiques
129+
130+
Souvent, le découpage communal ne sert qu'en fond de cartes, pour donner des
131+
repères. En complément de celui-ci, on peut désirer exploiter
132+
un autre jeu de données. On va partir des données de localisation des
133+
stations velib,
134+
disponibles [sur le site d'open data de la ville de Paris](https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/table/) et
135+
requêtables directement par l'url
136+
<https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/download/?format=geojson&timezone=Europe/Berlin&lang=fr>
137+
138+
139+
**Exercice 3: importer et explorer les données velib**
140+
141+
1. Importer les données velib sous le nom station
142+
2. Représenter sur une carte les 100 stations les plus importantes. Vous pouvez également afficher le fonds de carte des arrondissements en ne gardant que les départements de la petite couronne (75, 92, 93, 94).
143+
Cette [page](https://geopandas.org/mapping.html#maps-with-layers) peut vous aider pour afficher plusieurs couches à la fois (nous irons plus loin lors du chapitre XXXX).
144+
3. (optionnel) Afficher également les réseaux de transport en communs, disponibles [ici](https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/map/?location=7,48.69717,2.33167&basemap=jawg.streets). L'url à requêter est
145+
<https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/download/?format=geojson&timezone=Europe/Berlin&lang=fr>
146+
147+
```{python}
148+
url = "https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/download/?format=geojson&timezone=Europe/Berlin&lang=fr"
149+
stations = gpd.read_file(url)
150+
151+
```
152+
153+
```{python}
154+
base = data_paris[data_paris['dep'] == '75'].plot(alpha = 0.2, edgecolor = 'black')
155+
stations.sort_values('capacity', ascending = False).head(50).plot(ax = base, color = 'red', alpha = 0.6)
156+
```
157+
158+
```{python}
159+
url = "https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/download/?format=geojson&timezone=Europe/Berlin&lang=fr"
160+
transports = gpd.read_file(url)
161+
162+
163+
base = data_paris[data_paris['dep'] == '75'].plot(alpha = 0.2, edgecolor = 'black')
164+
stations.sort_values('capacity', ascending = False).head(50).plot(ax = base, color = 'red', alpha = 0.6)
165+
transports[transports['mode'] == "Metro"].plot(ax = base, color = 'black', alpha = 0.3)
166+
```
167+
168+
169+
# Jointures spatiales
170+
171+
Les jointures attributaires fonctionnent comme avec un DataFrame `pandas`. Pour conserver un objet spatial *in fine*, il faut faire attention à utiliser en premier (base de gauche) l'objet `geopandas`. En revanche, l'un des intérêts des objets geopandas est qu'on peut également faire une jointure sur la dimension spatiale.
172+
173+
La documentation à laquelle se référer est [ici](https://geopandas.org/mergingdata.html#spatial-joins).
174+
175+
**Exercice 4: Associer les stations aux communes et arrondissements auxquels ils appartiennent**
176+
177+
1. Faire une jointure spatiale pour enrichir les données de stations d'informations sur l'environnement.
178+
Appeler cet objet `stations_info`
179+
2. Représenter la carte des stations du 19e arrondissement (s'aider de la variable `c_ar`).
180+
Vous pouvez mettre en fond de carte les arrondissements parisiens.
181+
3. Compter le nombre de stations velib et le nombre de places velib par arrondissement ou communes (pour vous aider, vous pouvez compléter vos connaissances avec [ce tutoriel](https://pandas.pydata.org/docs/getting_started/intro_tutorials/06_calculate_statistics.html)). Représenter sur une carte chacune des informations
182+
4. Représenter les mêmes informations mais en densité (diviser par la surface de l'arrondissement ou commune en km2)
183+
184+
```{python}
185+
stations_info = gpd.sjoin(stations, data_paris, op = 'within')
186+
187+
base = data_paris[data_paris.dep == "75"].plot(alpha = 0.2, edgecolor = 'k')
188+
stations_info[stations_info['c_ar'] == 19.0].plot(ax = base, color = 'red', alpha = 0.6)
189+
```
190+
191+
```{python}
192+
base = data_paris[data_paris['c_ar'] == 19.0].plot(alpha = 0.2, edgecolor = 'k')
193+
stations_info[stations_info['c_ar'] == 19.0].plot(ax = base, color = 'red', alpha = 0.6)
194+
transports[transports['mode'] == "Metro"].plot(ax = base, color = 'black', alpha = 0.3)
195+
196+
```
197+
198+
```{python}
199+
stations_agg = stations_info.groupby('insee').agg({'stationcode': 'nunique',
200+
'capacity': 'sum'}).reset_index()
201+
data_paris.merge(stations_agg, how = 'inner', suffixes = [None, '_agg']).plot(column = 'capacity')
202+
data_paris.merge(stations_agg, how = 'inner', suffixes = [None, '_agg']).plot(column = 'stationcode')
203+
```
204+
205+
```{python}
206+
df = data_paris.merge(stations_agg, how = 'inner', suffixes = [None, '_agg'])
207+
cols = ['stationcode','capacity']
208+
df = df[[s + '_density' for s in cols]] = df[cols].div(df.to_crs(2158).area*10**(-6), axis = 0)
209+
df.plot(column = 'capacity_density', cmap = 'RdYlBu_r')
210+
df.plot(column = 'capacity_density', cmap = 'plasma_r')
211+
```
212+
213+
**Exercice 5 (optionnel): Relier distance au métro et capacité d'une station**
125214

215+
1. Relier chaque station velib à la station de transport en commun la plus proche
216+
2. Quelle ligne de transport est à proximité du plus de velib ?
217+
3. Calculer la distance de chaque station à la ligne de métro la plus proche. Faire un nuage de points reliant distance au métro et nombre de places en stations
126218

content/manipulation/03_geopandas_tp.md

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def download_unzip(url, dirname = tempfile.gettempdir(), destname = "borders"):
5151

5252
**Exercice 1: lire et explorer la structure de fichiers géographiques**
5353

54-
1. Utiliser la fonction `download_unzip` avec l'url <'https://www.data.gouv.fr/fr/datasets/r/07b7c9a2-d1e2-4da6-9f20-01a7b72d4b12'>
54+
1. Utiliser la fonction `download_unzip` avec l'url <https://www.data.gouv.fr/fr/datasets/r/07b7c9a2-d1e2-4da6-9f20-01a7b72d4b12>
5555
pour télécharger les données communales.
5656
2. Importer le fichier avec la package `geopandas`
5757
(si vous avez laissé les paramètres par défaut,
@@ -67,23 +67,11 @@ transformation de l'espace tridimensionnel terrestre en une surface plane.
6767
6. Réprésenter la carte de Paris : quel est le problème ?
6868

6969

70-
```python
71-
download_unzip(url)
72-
communes_borders = gpd.read_file(temporary_location + "/borders/communes-20190101.json")
73-
communes_borders.head()
74-
communes_borders.crs
75-
```
7670

7771

7872

79-
```python
80-
communes_borders[communes_borders.insee.str.startswith("12")].plot()
81-
```
8273

8374

84-
```python
85-
communes_borders[communes_borders.insee.str.startswith("75")].plot()
86-
```
8775

8876
En effet, on ne dispose ainsi pas des limites des arrondissements parisiens, ce
8977
qui appauvrit grandement la carte de Paris. On peut les récupérer directement
@@ -106,19 +94,62 @@ la méthode `rename` et faire attention aux types des variables
10694

10795

10896

109-
```python
110-
arrondissements = gpd.read_file("https://opendata.paris.fr/explore/dataset/arrondissements/download/?format=geojson&timezone=Europe/Berlin&lang=fr")
111-
arrondissements.plot()
112-
communes_borders.crs == arrondissements.crs
113-
arrondissements = arrondissements.rename(columns = {"c_arinsee": "insee"})
114-
data_paris = communes_borders[~communes_borders.insee.str.startswith("75")].append(arrondissements)
115-
```
11697

11798

118-
```python
119-
data_paris['dep'] = data_paris.insee.str[:2]
120-
data_paris[data_paris['dep'].isin(['75','92','93','94'])].plot()
121-
```
12299

100+
# Utiliser des données géographiques comme des couches
101+
graphiques
102+
103+
Souvent, le découpage communal ne sert qu'en fond de cartes, pour donner des
104+
repères. En complément de celui-ci, on peut désirer exploiter
105+
un autre jeu de données. On va partir des données de localisation des
106+
stations velib,
107+
disponibles [sur le site d'open data de la ville de Paris](https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/table/) et
108+
requêtables directement par l'url
109+
<https://opendata.paris.fr/explore/dataset/velib-emplacement-des-stations/download/?format=geojson&timezone=Europe/Berlin&lang=fr>
110+
111+
112+
**Exercice 3: importer et explorer les données velib**
113+
114+
1. Importer les données velib sous le nom station
115+
2. Représenter sur une carte les 100 stations les plus importantes. Vous pouvez également afficher le fonds de carte des arrondissements en ne gardant que les départements de la petite couronne (75, 92, 93, 94).
116+
Cette [page](https://geopandas.org/mapping.html#maps-with-layers) peut vous aider pour afficher plusieurs couches à la fois (nous irons plus loin lors du chapitre XXXX).
117+
3. (optionnel) Afficher également les réseaux de transport en communs, disponibles [ici](https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/map/?location=7,48.69717,2.33167&basemap=jawg.streets). L'url à requêter est
118+
<https://data.iledefrance-mobilites.fr/explore/dataset/traces-du-reseau-ferre-idf/download/?format=geojson&timezone=Europe/Berlin&lang=fr>
119+
120+
121+
122+
123+
124+
125+
126+
127+
# Jointures spatiales
128+
129+
Les jointures attributaires fonctionnent comme avec un DataFrame `pandas`. Pour conserver un objet spatial *in fine*, il faut faire attention à utiliser en premier (base de gauche) l'objet `geopandas`. En revanche, l'un des intérêts des objets geopandas est qu'on peut également faire une jointure sur la dimension spatiale.
130+
131+
La documentation à laquelle se référer est [ici](https://geopandas.org/mergingdata.html#spatial-joins).
132+
133+
**Exercice 4: Associer les stations aux communes et arrondissements auxquels ils appartiennent**
134+
135+
1. Faire une jointure spatiale pour enrichir les données de stations d'informations sur l'environnement.
136+
Appeler cet objet `stations_info`
137+
2. Représenter la carte des stations du 19e arrondissement (s'aider de la variable `c_ar`).
138+
Vous pouvez mettre en fond de carte les arrondissements parisiens.
139+
3. Compter le nombre de stations velib et le nombre de places velib par arrondissement ou communes (pour vous aider, vous pouvez compléter vos connaissances avec [ce tutoriel](https://pandas.pydata.org/docs/getting_started/intro_tutorials/06_calculate_statistics.html)). Représenter sur une carte chacune des informations
140+
4. Représenter les mêmes informations mais en densité (diviser par la surface de l'arrondissement ou commune en km2)
141+
142+
143+
144+
145+
146+
147+
148+
149+
150+
**Exercice 5 (optionnel): Relier distance au métro et capacité d'une station**
123151

152+
1. Relier chaque station velib à la station de transport en commun la plus proche
153+
2. Quelle ligne de transport est à proximité du plus de velib ?
154+
3. Calculer la distance de chaque station à la ligne de métro la plus proche. Faire un nuage de points reliant distance au métro et nombre de places en stations
124155

environment.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ dependencies:
1818
- GDAL
1919
- rasterio
2020
- contextily
21+
- rtree

0 commit comments

Comments
 (0)