131 lines
3.9 KiB
Python
131 lines
3.9 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
|
|
import folium
|
|
import 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
|
|
m = GPSLatitude.values[1].num
|
|
s = GPSLatitude.values[2].num
|
|
|
|
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
|
|
m = GPSLongitude.values[1].num
|
|
s = GPSLongitude.values[2].num
|
|
|
|
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 : ')
|
|
print('Facteur de zoom : {}'.format(facteurZoom))
|
|
|
|
# Ouverture de l'image en mode de lecture binaire
|
|
path = './images/'
|
|
fichiers=os.listdir(path)
|
|
i = 0 #indice des images
|
|
for nom in fichiers:
|
|
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:
|
|
print("Latitude : {}, longitude : {}, date : {}".format(latitude,
|
|
longitude, date))
|
|
except NameError:
|
|
print('Fichier sans données GPS : ',nom)
|
|
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)
|
|
|
|
#création d'un marqueur
|
|
folium.Marker([latitude, longitude],
|
|
popup="<h4>{}</h4> <br> <i>{}</i> <br><br> <img src='{}' width='300'"
|
|
.format(titre,date,adresseImage)).add_to(carte)
|
|
|
|
#création d'un simple cercle
|
|
folium.Circle(
|
|
radius=100,
|
|
location=[latitude, longitude],
|
|
popup='Gallet Park',
|
|
color='crimson',
|
|
fill=False,
|
|
).add_to(carte)
|
|
|
|
#création d'un marqueur en forme de cercle
|
|
folium.CircleMarker(
|
|
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
|
|
#changement d'image
|
|
i = i + 1
|
|
|
|
#création du fichier HTML
|
|
carte.save('ma_carte.html')
|