TP géolocalisation

Pour faire ce TP, Python doit être installé sur votre machine. Si ce n’est pas le cas, faites le : installation de Python.

Pour ce TP, nous allons utiliser la bibliothèque Folium.   (La documentation : https://python-visualization.github.io/folium/quickstart.html )

Pour commencer, il faut installer cette bibliothèque. Pour cela, dans la barre de recherche Windows (en bas à gauche), tapez cmd et entrée.

cmd

Dans l’austère  fenêtre qui s’ouvre tapez la ligne suivante : pip install folium

pip install folium

Si la commande « pip » n’est pas reconnu c’est qu’à l’installation de Python vous avez oublié de cocher « Add to PATH » ou « Ajouter aux variables d’environnement ». RIP.

Une source d’erreur courante est d’avoir plusieurs versions de Python qui cohabitent. De même, si vous utilisez un environnement de type WinPython, pensez à faire le pip install dans le « WinPython Command Prompt.exe » de Winpython.

C’est important, à l’installation de Python d’avoir coché ça :

Première carte

Créez un dossier nommé TP_geo et vous travaillerez dans ce dossier. Très bien, nous pouvons commencer.

Tapez le code suivant dans votre éditeur Python :

import folium

GYMNASE = [48.583676934977, 7.7480744317593]

carte = folium.Map(location=GYMNASE)
carte.save('carte.html')

Enregistrez votre fichier dans le dossier crée précédemment, appelé votre fichier TP_geo.py.

Si vous allez voir dans votre dossier vous trouvez un fichier carte.html et si vous l’ouvrez, une jolie carte !

Première carte

Premières améliorations

On remarque que le niveau de zoom n’est pas forcément satisfaisant et que de devoir aller ouvrir le fichier html à la main ne l’est pas non plus.

Pour le niveau de zoom, il suffit d’utiliser le paramètre « zoom_start » et modifier le code précédent :

import folium

GYMNASE = [48.583676934977, 7.7480744317593]

carte = folium.Map(location=GYMNASE, zoom_start=17)
carte.save('carte.html')

Pour l’ouverture automatique de de la carte nous allons utiliser la bibliothèque os.

import folium
import os

GYMNASE = [48.583676934977, 7.7480744317593]

carte = folium.Map(location=GYMNASE, zoom_start=17)
fichier = 'carte.html'
carte.save(fichier)


####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

Vous pouvez essayer de modifier le niveau de zoom et d’indiquer les coordonnées géographiques de votre domicile plutôt que de votre lycée.

Les marqueurs

Pour ajouter un marqueur il faut procéder ainsi :

import folium
import os

GYMNASE = [48.583676934977, 7.7480744317593]

carte = folium.Map(location=GYMNASE, zoom_start=17)
folium.Marker(GYMNASE,popup="Le Gymnase").add_to(carte)
fichier = 'carte.html'
carte.save(fichier)

####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

Le marqueur par défaut :

Marqueur

A vous maintenant !

Exercice

Modifiez le code précédent pour également ajouter un marqueur sur votre domicile.

Solution

import folium
import os

GYMNASE = [48.583676934977, 7.7480744317593]
DOMICILE = [48.556282, 7.750382] # Oui, c'est chez moi :)
carte = folium.Map(location=GYMNASE, zoom_start=13)
folium.Marker(GYMNASE,popup="Le Gymnase").add_to(carte)
folium.Marker(DOMICILE,popup="Home").add_to(carte)
fichier = 'carte.html'
carte.save(fichier)

####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

On peut personnaliser les marqueurs, voici un exemple de personnalisation :

import folium
import os


GYMNASE = [48.583676934977, 7.7480744317593]
DOMICILE = [48.556282, 7.750382] # Oui, c'est chez moi :)

fichier = 'carte.html'

carte = folium.Map(
    location=GYMNASE,
    zoom_start=13,
    )
# Changement de couleur du marqueur
folium.Marker(
    GYMNASE,
    popup="Le Gymnase",
    icon=folium.Icon(color='green')
    ).add_to(carte)
# Changement de couleur du marqueur et changement d'icone
folium.Marker(
    DOMICILE,
    popup="Home",
    icon=folium.Icon(color='red', icon='glyphicon-heart')
    ).add_to(carte)

#  On save
carte.save(fichier)

####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

voici la liste des icônes disponibles : https://www.w3schools.com/icons/bootstrap_icons_glyphicons.asp

Périmètre de confinement

Sachant que le périmètre de confinement est de 1 km, nous allons tracer un cercle englobant la zone dans le périmètre autorisé.

Pour tracer un cercle :

folium.Circle(GYMNASE,radius = 200, fill=True, color='red' ).add_to(carte)

Attention, il existe également CircleMarker qui trace un cercle dont le rayon est donnée en pixel, pratique pour obtenir un cercle dont la taille ne dépend pas du zoom.

périmètre de confinement

Exercice

Ecrivez un programme qui affiche la zone de 1 km autorisée autour de votre domicile.

Solution

import folium
import os


GYMNASE = [48.583676934977, 7.7480744317593]
DOMICILE = [48.556282, 7.750382] # Oui, c'est chez moi :)
carte = folium.Map(location=GYMNASE, zoom_start=13)
folium.Marker(GYMNASE,popup="Le Gymnase").add_to(carte)
folium.Marker(DOMICILE,popup="Home").add_to(carte)
folium.Circle(DOMICILE,radius = 1000,fill=True, color='red' ).add_to(carte)
fichier = 'carte.html'
carte.save(fichier)

####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

On remarque que pendant le confinement, je ne peux pas aller à Auchan Baggersee à pieds.

Itinéraires

(cette partie est destinée aux élèves de première et de terminale, mais pas interdite aux élèves de seconde)

Dans cette partie nous parlerons de graphe, notion effleurée en SNT dans le thème réseaux sociaux.
Vous trouverez ici d’excellentes vidéos sur les graphes : A la découverte des graphes pour commencer, les bases : « Graphes: introduction et notion de base »

Nous allons utiliser la bibliothèque pyroutelib3, donc… pip install pyroutelib3. (Toujours cmd et entrée dans la recherche Windows)

Nous allons calculer le trajet de votre domicile, jusqu’au lycée.

Voici le code :

from pyroutelib3 import Router

# le moyen de transport car, cycle, foot, horse, tram, train
router = Router("foot")

depart = router.findNode(48.583676934977, 7.7480744317593)
arrivee = router.findNode(48.556282,  7.750382)

# On vérifie qu'il existe bien une route entre ces deux points
status, route = router.doRoute(depart, arrivee)

#Si la route existe
if status == 'success':
    route_coordonnees = list(map(router.nodeLatLon, route))

Le scripte met quelques secondes à s’exécuter (peut-être quelques minutes sur votre ordinateur et si vous habitez loin du lycée)

A la fin de ce script la variable route_coordonnees contient une liste de coordonnées (57 dans mon cas).

N’hésitez pas à tester, par exemple à cheval ou en voiture !

Maintenant, en utilisant les premières partie de ce TP nous allons afficher ce trajet. C’est quand même plus sympa !

On peut joindre l’ensemble des points du trajet avec la méthode PolyLine

from pyroutelib3 import Router
import folium
import os

GYMNASE = [48.583676934977, 7.7480744317593]
fichier = 'carte.html'
carte = folium.Map(
    location=GYMNASE,
    zoom_start=13,
    )
# le moyen de transport car, cycle, foot, horse, tram, train
router = Router("foot")

depart = router.findNode(48.583676934977, 7.7480744317593)
arrivee = router.findNode(48.556282,  7.750382)

# On vérifie qu'il existe bien une route entre ces deux points
status, route = router.doRoute(depart, arrivee)

#Si la route existe
if status == 'success':
    route_coordonnees = list(map(router.nodeLatLon, route))
  
# tracé d'une ligne reliant les coordonnées
folium.PolyLine(
    route_coordonnees,
    color="blue",
    weight=2.5,
    opacity=1
    ).add_to(carte)

#  On save
carte.save(fichier)

####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

ou afficher un marqueur à chaque coordonnée du trajet avec l’aide d’une boucle :

from pyroutelib3 import Router
import folium
import os

GYMNASE = [48.583676934977, 7.7480744317593]
fichier = 'carte.html'
carte = folium.Map(
    location=GYMNASE,
    zoom_start=13,
    )
# le moyen de transport car, cycle, foot, horse, tram, train
router = Router("foot")

depart = router.findNode(48.583676934977, 7.7480744317593)
arrivee = router.findNode(48.556282,  7.750382)

# On vérifie qu'il existe bien une route entre ces deux points
status, route = router.doRoute(depart, arrivee)

#Si la route existe
if status == 'success':
    route_coordonnees = list(map(router.nodeLatLon, route))

# Boucle pour afficher un point à chaque coordonnée
for point in route_coordonnees:
    folium.CircleMarker(
        point,
        radius= 2,
        popup=str(point),
        color='blue',
        fill=True,
        fill_color='blue'
        ).add_to(carte)
    
#  On save
carte.save(fichier)

####################################
# Ouverture automatique de la carte#
####################################

# On cherche le nom du repertoir courant
rep_cour = os.getcwd()
# On lance le navigateur
# On peut aussi faire start firefox (désolé pour l'utilisatrice de ie)
commande = 'start chrome file://'+rep_cour +'/'+ fichier
os.popen(commande)

Exercices : (à rajouter)

Stratégie algorithmique

ça, nous le verrons dans le TP : Dijkstra vs A*