Ceci est une ancienne révision du document !
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 1 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 172
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214
Table des matières
Etiqueter des photos selon des métadonnées GPS
En cours…
Dans ce TD on fournit
- une liste de photos de Paris 13, géolocalisées mais avec un nom aléatoire,
- des fichiers de données concernant les rues de Paris 13
Il s'agit de renommer automatiquement les photos en fonction de la rue où elles ont été prises.
Nous souhaitons, pour chaque fichier image,
- lire les métadonnées GPS du fichier,
- chercher la rue la plus proche,
- modifier le nom du fichier image pour qu'il prenne le nom de la rue correspondante.
Acquisition des métadonnées GPS
Nous allons utiliser la bibliothèque PIL.
from PIL import Image
from PIL.ExifTags import GPSTAGS, TAGS
# Exemple de l'ouverture d'une image de nom '1.jpg'
with Image.open('1.jpg') as image:
metadata = image._getexif()
# metadata est dictionnaire avec clé peu explicites,
# grâce à TAGS on renomme ces clés
labeled_metadata = {TAGS.get(key):val for key, val in metadata.items()}
# labeled_metadata contient une clé GPSInfo qui elle aussi
# a des clés peu compréhensible. On peut réétiqueter :
gps = {GPSTAGS.get(key,key):value for key, value in labeled_metadata['GPSInfo'].items()}
# maintenant gps contient des données exploitables
Exemple de résultat dans gps :
{
'GPSLatitude': ((55, 1), (52, 1), (20922, 679)),
'GPSLongitudeRef': 'E',
'GPSLongitude': ((37, 1), (50, 1), (77312, 2183)),
'GPSLatitudeRef': 'N',
'GPSVersionID': b'\x02\x03\x00\x00'
}
Conversion des données GPS en degrés ordinaire
Prenons le résultat précédent, en ce qui concerne la latitude. Pour la latitude, on trouve la donnée ((55, 1), (52, 1), (20922, 679)). Il faut comprendre qu'il s'agit d'un angle de $\frac{55}{1}$ degrés et $\frac{52}{1}$ minutes et $\frac{20922}{679}$ secondes d'arc.
Vous devez donc prévoir une fonction faisant la conversion vers l'angle correspondant qui serait ici : $$angle = \frac{55}{1} + \frac{52}{1} \times \frac{1}{60} + \frac{20922}{679} \times \frac{1}{3600}$$
Il faut aussi prévoir un signe. Dans l'exemple, gps["GPSLatitudeRef"] == "N". C'est donc une latitude Nord, dans ce cas l'angle est compté en plus. Dans le cas Sud, il aurait fallu compter l'angle négativement.
Pour la longitude, le côté positif est "E" et le côté négatif est "W".
Recherche de la rue la plus proche
Vous disposez de deux fichiers.
paris13.nodes.csv Résumé
| id | lat | lng |
|---|---|---|
| 0 | 48.8263456 | 2.3614982 |
| 1 | 48.826185 | 2.3572626 |
| 2 | 48.8260749 | 2.3552177 |
| 3 | 48.8258123 | 2.3503781 |
| 4 | 48.8257548 | 2.3465866 |
Ce fichier donne des nœuds correspondant à des points sur la carte. Cette nœud sont identifié par un entier id.
paris13.edges.csv Résumé
| source | dest | longueur | type | vmax | deuxsens | nom |
|---|---|---|---|---|---|---|
| 83 | 6609 | 6.27 | tertiary | 30 | 0 | Rue Nationale |
| 6609 | 4033 | 3.62 | tertiary | 30 | 0 | Rue Nationale |
| 4033 | 6611 | 5.72 | tertiary | 30 | 0 | Rue Nationale |
| 6611 | 2460 | 4.5 | tertiary | 30 | 0 | Rue Nationale |
| 10231 | 21 | 18.69 | secondary | 30 | 0 | Avenue des Gobelins |
Il s'agit de routes.
sourceetdestcorrespondent àiddans l'autre fichier.- Les longueurs sont données en mètres.
deuxsens = 1quand la voie est à double sens,0pour un sens unique.
Calcul d'une distance point segment
Calcul de distance : Considérants deux nœuds aux coordonnées A(lat1,lng1), B(lat2,lng2) reliés par une rue [AB]. Considérons aussi le point M(lat, lng). On veut définir la distance entre M et [AB].
Pour cela on commence par déterminer la position du point N, projection de M sur (AB). Il nous faut les quantités :
lngAB = lngB - lngA, latAB = latB - latA, lngAM = lngM - lngA et latAM = latM - latA.
On calcule ensuite a = (lngAM*latAB - latAM*lngAB)/(latAB2 + lngAB2) ce qui permet d'obtenir lngN = lngM - a*latAB et latN = latM + a*lngAB.
Une fois que N est connu, on essaie de savoir dans quel cas on est : N1, N2 ou N3.
On calcule donc t = (lngN - lngA)/lngAB if lngAB != 0 else (latN - latA)/latAB.
- Si
t ⇐ 0, la distance recherchée estAM, - si
0 < t < 1, la distance recherchée estMN, - si
1 ⇐ t, la distance recherchée estBM.
Enfin, pour calculer la distance entre deux points F et G, la formule est :
$$FG = R \arccos(\sin(latitude_F) \sin(latitude_G) + \cos(longitude_F - longitude_G) \cos(latitude_F) \cos(latitude_G))$$
Système de fichier
Vous devez parcourir le dossier à la recherche des fichiers *.jpg et après traitement vous devez les renommer. Voici comment faire :
import os
# renommer :
os.rename('ancien_nom.jpg', 'nouveau_nom.jpg')
# lister les fichiers *.jpg du répertoire courant
fichiers = [f for f in os.listdir('./') if f.endswith('.jpg')]

