Cartographie-informatique/codes/carteLelbc3.py

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}@*)