Affichage et tris de données avec Python

MéthodeAffichage des données sur une carte OpenStreetMap

On se propose d'afficher sur une carte les établissements de l'académie de Lyon à l'aide d'un programme Python.

Pour cela, voici la méthode très simple à suivre :

  • Copier-coller le programme ci-dessous dans l'éditeur Geany (ou un autre environnement de développement pour Python),

  • Enregistrer votre programme avec le nom AffichageCarte.py juste à côté du fichier CSV précédemment crée (ou téléchargé),

  • Compléter la section #CONSTANTES (lignes 10 à 15) :

    • les 3 premières valeurs à rentrer permettront de centrer la carte sur l'académie de Lyon,

    • Vous pouvez vous aider du site web https://www.openstreetmap.org/ qui fournit une URL[1] centrée sur la carte de la sorte : https://www.openstreetmap.org/#map=NIVEAU_ZOOM/LATITUDE/LONGITUDE

    • Bien lire les commentaires dans le programme qui sont derrière #

  • Une fois les 6 constantes complétées, lancer l'exécution du programme Python à l'aide de la touche F5,

  • Répondez à la question puis valider,

  • La navigateur Firefox devrait afficher la carte avec des marqueurs...

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
4
## Import des modules utiles au bon fonctionnement du programme Python
5
6
import folium, os, webbrowser, csv
7
8
## CONSTANTES
9
10
Latitude_centre =     		#exemple 49.5
11
Longitude_centre =    		#exemple 1.5
12
Zoom_depart =              	#sur openstreetmap.org, le nombre entier après map=
13
Fichier_html = 'xxxx.html'  	#nom du fichier html généré avec l'extension .html
14
Fichier_csv = 'yyyy.csv'        #nom de votre fichier CSV avec l'extension .csv
15
Separateur = '?'                #le séparateur utilisé dans votre fichier CSV
16
17
## FONCTIONS
18
19
def carte(Carte, Fichier_csv, Fichier_html, Separateur):
20
    """Fonction qui réalise une carte au format HTML avec des tuiles OpenStreeMap
21
    Elle est centrée sur la latitude et longitude définie dans les constantes
22
    Elle est affichée avec le zoom défini dans les constantes
23
    Elle utilise le fichier CSV défini dans les constantes et affiche tous les enregistrements du fichier
24
    Elle crée le fichier HTML défini dans les constantes
25
    Elle utilse le séparateur défini dans les constantes""" 
26
    with open(Fichier_csv, newline='') as fichier:
27
        lecture = csv.DictReader(fichier, delimiter= Separateur)
28
        MesEtabs = list(lecture)        #Je transforme en liste pour manipuler les établissements
29
        for etab in MesEtabs:
30
            if etab['latitude'] != '':   #Si le champ lat ou long n'est pas vide
31
                latitude = float(etab['latitude'])   #Transformation en float de la latitude
32
                longitude = float(etab['longitude'])
33
                folium.Marker(  location=[latitude, longitude],
34
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
35
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
36
                                    icon=folium.Icon(icon="home", color="green"),              #Icone home dans le marqueur
37
                                    ).add_to(Carte)
38
    Carte.save(Fichier_html)
39
40
41
def carte_triee(Carte, Fichier_csv, Fichier_html, Separateur):
42
    """Fonction qui réalise une carte au format HTML avec des tuiles OpenStreeMap
43
    Elle est centrée sur la latitude et longitude définie dans les constantes
44
    Elle est affichée avec le zoom défini dans les constantes
45
    Elle utilise le fichier CSV défini dans les constantes et affiche les lycées en vert et les collèges en bleu
46
    Elle crée le fichier HTML défini dans les constantes
47
    Elle utilse le séparateur défini dans les constantes""" 
48
    with open(Fichier_csv, newline='') as fichier:
49
        lecture = csv.DictReader(fichier, delimiter= Separateur)
50
        MesEtabs = list(lecture)        #Je transforme en liste pour manipuler les établissements
51
        for etab in MesEtabs:
52
            if etab['latitude'] != '':   #Si le champ lat ou long n'est pas vide
53
                latitude = float(etab['latitude'])   #Transformation en float de la latitude
54
                longitude = float(etab['longitude'])
55
                if etab['Type_etablissement'] == 'Lycée':
56
                    folium.Marker(  location=[latitude, longitude],
57
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
58
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
59
                                    icon=folium.Icon(icon="home", color="green"),              #Icone home dans le marqueur
60
                                    ).add_to(Carte)
61
                elif etab['Type_etablissement'] == 'Collège':
62
                    folium.Marker(  location=[latitude, longitude],
63
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
64
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
65
                                    icon=folium.Icon(icon="home", color="blue"),              #Icone home dans le marqueur
66
                                    ).add_to(Carte)
67
                else: #EREA
68
                    folium.Marker(  location=[latitude, longitude],
69
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
70
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
71
                                    icon=folium.Icon(icon="home", color="purple"),              #Icone home dans le marqueur
72
                                    ).add_to(Carte)
73
    Carte.save(Fichier_html)
74
75
76
## PROGRAMME PRINCIPAL
77
78
reponse = input("""Quelle carte souhaitez-vous consulter ?\n
79
    - une carte avec tous les établissements (taper 1),
80
    - une carte avec la distinction collèges et les lycées (taper 2) ?\n
81
    Réponse : """)
82
83
if reponse == '1':
84
    MaCarte = folium.Map(location=(Latitude_centre, Longitude_centre), zoom_start= Zoom_depart)
85
    carte(MaCarte, Fichier_csv, Fichier_html, Separateur)
86
else:
87
    MaCarte = folium.Map(location=(Latitude_centre, Longitude_centre), zoom_start= Zoom_depart)
88
    carte_triee(MaCarte, Fichier_csv, Fichier_html, Separateur)
89
    
90
91
webbrowser.open('file://' + os.path.realpath(Fichier_html))        #Ouverture automatique du fichier HTML
92

Vous pouvez relancer le programme pour afficher la 2ème carte.

N'hésitez pas à analyses les marqueurs pour voir ce qu'ils affichent...

SimulationAnalyse du code Python et modification de la carte

Nous souhaitons changer les couleurs des marqueurs.

La documentation nous précise cela :

The color of the marker. You can use:

[‘red’, ‘blue’, ‘green’, ‘purple’, ‘orange’, ‘darkred’, ’lightred’, ‘beige’, ‘darkblue’, ‘darkgreen’, ‘cadetblue’, ‘darkpurple’, ‘white’, ‘pink’, ‘lightblue’, ‘lightgreen’, ‘gray’, ‘black’, ‘lightgray’]

Changer la couleur des marqueurs avec vos couleurs préférées !

Fondamental

Faites valider par votre enseignant !

SimulationTri des données avec Python

La fonction Python carte_triee() permet de trier les collèges et les lycées. À présent, vous allez trier sur le nom de la commune.

Trouver le descripteur de votre fichier CSV qui permet de trouver le nom de la commune de chaque établissement puis réaliser cette carte ci-contre

  • marqueurs verts pour les établissements de la commune de Lyon,

  • marqueurs bleus pour les établissements de la commune de Villeurbanne,

  • marqueurs violets pour tous les autres...

Carte triée par communeInformations[2]

Simulation

On souhaite à présent afficher uniquement les établissements ayant une section sport ou européenne (ou les 2). Modifier la fonction carte() en conséquence.

Fondamental

Faites valider par votre enseignant !

ComplémentPour aller plus loin !

Améliorer votre carte en :

  • ajoutant des informations dans la pop-up,

  • modifiant les icônes en utilisant cette bibliothèque (actuellement, nous utilisons 'home'),

  • affichant uniquement des établissements de plus de 600 élèves, quel est le problème rencontré ?

  • à vous de trouver d'autres illustrations d'affichage des données avec Python...