131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
''' Programme de placement de tags images sur un fond OpenStreetMap
|
|
On place des images géotaguées dans un répertoire
|
|
Le programme en extrait les coordonnées GPS et la date
|
|
Il crée des tags avec comme titre le nom des fichiers et la date
|
|
et les place sur le fond de carte aux coordonnées GPS
|
|
'''
|
|
|
|
#importation des module
|
|
import os(*@\label{ligne:lemoduleos}@*)
|
|
import folium(*@\label{ligne:modulefolium}@*)
|
|
import exifread(*@\label{ligne:exifread}@*)
|
|
|
|
def lalatitude(ref,GPSLatitude):
|
|
'''
|
|
Convertit les coordonnées GPS EXIF en degrés à virgule flottante
|
|
:param ref, GPSLongitude:
|
|
:type ref: string, GPSLongitude: exifread.utils.Ratio
|
|
:rtype: float
|
|
'''
|
|
|
|
d = GPSLatitude.values[0].num(*@\label{ligne:num1}@*)
|
|
m = GPSLatitude.values[1].num
|
|
s = GPSLatitude.values[2].num(*@\label{ligne:num2}@*)
|
|
|
|
if ref == 'N':
|
|
latitude = d + (m / 60.) + (s / 3600.)
|
|
elif ref == 'S':
|
|
latitude = -1*(d + (m / 60.0) + (s / 3600.0))
|
|
else:
|
|
print('La latitude est fausse !')
|
|
return latitude
|
|
|
|
def lalongitude(ref,GPSLongitude):
|
|
'''
|
|
Convertit les coordonnées GPS EXIF en degrés à virgule flottante
|
|
:param ref, GPSLongitude:
|
|
:type ref: string, GPSLongitude: exifread.utils.Ratio
|
|
:rtype: float
|
|
'''
|
|
|
|
d = GPSLongitude.values[0].num(*@\label{ligne:num3}@*)
|
|
m = GPSLongitude.values[1].num
|
|
s = GPSLongitude.values[2].num(*@\label{ligne:num4}@*)
|
|
|
|
if ref == 'W':
|
|
longitude = -1*(d + (m / 60.0) + (s / 3600.0))
|
|
elif ref == 'E':
|
|
longitude = d + (m / 60.0) + (s / 3600.0)
|
|
else:
|
|
print('La longitude est fausse !')
|
|
return longitude
|
|
|
|
# Récupération du facteur de zoom
|
|
print('Facteur de zoom (nombre entier) :\n\
|
|
9 : grande zone\n\
|
|
11 : zone\n\
|
|
13 : village ou ville\n\
|
|
16 : petite route')
|
|
facteurZoom = input('Veuillez entrer le facteur de zoom : ')(*@\label{ligne:input}@*)
|
|
print('Facteur de zoom : {}'.format(facteurZoom))
|
|
|
|
# Ouverture de l'image en mode de lecture binaire
|
|
path = './images/'
|
|
fichiers=os.listdir(path)(*@\label{ligne:listdir}@*)
|
|
i = 0 #indice des images(*@\label{ligne:compteurimages}@*)
|
|
for nom in fichiers:(*@\label{ligne:boucleprincipale}@*)
|
|
print("{} : {}".format(i,nom))
|
|
|
|
adresseImage = "./images/"+nom
|
|
titre = nom.split('.')[0]
|
|
f = open(adresseImage, 'rb')
|
|
|
|
# Récupération des tags EXIF
|
|
tags = exifread.process_file(f, details=False)
|
|
|
|
for tag in tags.keys():
|
|
if tag in ('GPS GPSLatitudeRef',
|
|
'GPS GPSLatitude',
|
|
'GPS GPSLongitudeRef',
|
|
'GPS GPSLongitude',
|
|
'Image ImageDateTime'):
|
|
latitude = lalatitude(tags['GPS GPSLatitudeRef'].values,
|
|
tags['GPS GPSLatitude'])
|
|
longitude = lalongitude(tags['GPS GPSLongitudeRef'].values,
|
|
tags['GPS GPSLongitude'])
|
|
date = tags['EXIF DateTimeOriginal']
|
|
|
|
try:(*@\label{ligne:try1}@*)
|
|
print("Latitude : {}, longitude : {}, date : {}".format(latitude,
|
|
longitude, date))(*@\label{ligne:try2}@*)
|
|
except NameError:(*@\label{ligne:except}@*)
|
|
print('Fichier sans données GPS : ',nom)
|
|
else:(*@\label{ligne:else}@*)
|
|
#création de l'objet Python carte, centrée sur les coordonnées
|
|
#latitude et longitude de la première image
|
|
|
|
if i == 0:
|
|
carte = folium.Map(location=[latitude, longitude],zoom_start=facteurZoom)(*@\label{ligne:carte}@*)
|
|
|
|
#création d'un marqueur
|
|
folium.Marker([latitude, longitude],(*@\label{ligne:markgoutte}@*)
|
|
popup="<h4>{}</h4> <br> <i>{}</i> <br><br> <img src='{}' width='300'"
|
|
.format(titre,date,adresseImage)).add_to(carte)(*@\label{ligne:gouttepopup}@*)
|
|
|
|
#création d'un simple cercle
|
|
folium.Circle(
|
|
radius=100,
|
|
location=[latitude, longitude],
|
|
popup='Gallet Park',(*@\label{ligne:cerclepopup}@*)
|
|
color='crimson',
|
|
fill=False,
|
|
).add_to(carte)
|
|
|
|
#création d'un marqueur en forme de cercle
|
|
folium.CircleMarker((*@\label{ligne:markcerclepopup}@*)
|
|
location=[latitude, longitude],
|
|
radius=50,
|
|
popup=titre,
|
|
color='#3186cc',
|
|
fill=True,
|
|
fill_color='#3186cc'
|
|
).add_to(carte)
|
|
|
|
#dereferencement des variables pour lever l'exception
|
|
del latitude, longitude(*@\label{ligne:deref}@*)
|
|
#changement d'image
|
|
i = i + 1
|
|
|
|
#création du fichier HTML
|
|
carte.save('ma_carte.html')(*@\label{ligne:sauvegarde}@*)
|