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 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...

#!/usr/bin/env python
# -*- coding: utf-8 -*-
## Import des modules utiles au bon fonctionnement du programme Python
import folium, os, webbrowser, csv
## CONSTANTES
Latitude_centre =     		#exemple 49.5
Longitude_centre =    		#exemple 1.5
Zoom_depart =              	#sur openstreetmap.org, le nombre entier après map=
Fichier_html = 'xxxx.html'  	#nom du fichier html généré avec l'extension .html
Fichier_csv = 'yyyy.csv'        #nom de votre fichier CSV avec l'extension .csv
Separateur = '?'                #le séparateur utilisé dans votre fichier CSV
## FONCTIONS
def carte(Carte, Fichier_csv, Fichier_html, Separateur):
    """Fonction qui réalise une carte au format HTML avec des tuiles OpenStreeMap
    Elle est centrée sur la latitude et longitude définie dans les constantes
    Elle est affichée avec le zoom défini dans les constantes
    Elle utilise le fichier CSV défini dans les constantes et affiche tous les enregistrements du fichier
    Elle crée le fichier HTML défini dans les constantes
    Elle utilse le séparateur défini dans les constantes""" 
    with open(Fichier_csv, newline='') as fichier:
        lecture = csv.DictReader(fichier, delimiter= Separateur)
        MesEtabs = list(lecture)        #Je transforme en liste pour manipuler les établissements
        for etab in MesEtabs:
            if etab['latitude'] != '':   #Si le champ lat ou long n'est pas vide
                latitude = float(etab['latitude'])   #Transformation en float de la latitude
                longitude = float(etab['longitude'])
                folium.Marker(  location=[latitude, longitude],
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
                                    icon=folium.Icon(icon="home", color="green"),              #Icone home dans le marqueur
                                    ).add_to(Carte)
    Carte.save(Fichier_html)
def carte_triee(Carte, Fichier_csv, Fichier_html, Separateur):
    """Fonction qui réalise une carte au format HTML avec des tuiles OpenStreeMap
    Elle est centrée sur la latitude et longitude définie dans les constantes
    Elle est affichée avec le zoom défini dans les constantes
    Elle utilise le fichier CSV défini dans les constantes et affiche les lycées en vert et les collèges en bleu
    Elle crée le fichier HTML défini dans les constantes
    Elle utilse le séparateur défini dans les constantes""" 
    with open(Fichier_csv, newline='') as fichier:
        lecture = csv.DictReader(fichier, delimiter= Separateur)
        MesEtabs = list(lecture)        #Je transforme en liste pour manipuler les établissements
        for etab in MesEtabs:
            if etab['latitude'] != '':   #Si le champ lat ou long n'est pas vide
                latitude = float(etab['latitude'])   #Transformation en float de la latitude
                longitude = float(etab['longitude'])
                if etab['Type_etablissement'] == 'Lycée':
                    folium.Marker(  location=[latitude, longitude],
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
                                    icon=folium.Icon(icon="home", color="green"),              #Icone home dans le marqueur
                                    ).add_to(Carte)
                elif etab['Type_etablissement'] == 'Collège':
                    folium.Marker(  location=[latitude, longitude],
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
                                    icon=folium.Icon(icon="home", color="blue"),              #Icone home dans le marqueur
                                    ).add_to(Carte)
                else: #EREA
                    folium.Marker(  location=[latitude, longitude],
                                    tooltip=etab['Nom_etablissement'],                     #Au survol, nom de l'établissement
                                    popup=f"{etab['Nom_etablissement']} à {etab['Nom_commune']}", #J'affiche le nom de l'établissement et la commune
                                    icon=folium.Icon(icon="home", color="purple"),              #Icone home dans le marqueur
                                    ).add_to(Carte)
    Carte.save(Fichier_html)
## PROGRAMME PRINCIPAL
reponse = input("""Quelle carte souhaitez-vous consulter ?\n
    - une carte avec tous les établissements (taper 1),
    - une carte avec la distinction collèges et les lycées (taper 2) ?\n
    Réponse : """)
if reponse == '1':
    MaCarte = folium.Map(location=(Latitude_centre, Longitude_centre), zoom_start= Zoom_depart)
    carte(MaCarte, Fichier_csv, Fichier_html, Separateur)
else:
    MaCarte = folium.Map(location=(Latitude_centre, Longitude_centre), zoom_start= Zoom_depart)
    carte_triee(MaCarte, Fichier_csv, Fichier_html, Separateur)
    
webbrowser.open('file://' + os.path.realpath(Fichier_html))        #Ouverture automatique du fichier HTML

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 commune

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...