Cartographie-informatique/codes/creation_carte_umap.py

100 lines
3.6 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, GPSLatitude:
:type ref: string, GPSLongitude: exifread.utils.Ratio
:rtype: float
num signifie numérateur et den dénominateur, car les données
sont sous forme de fractions
'''
d = GPSLatitude.values[0].num/GPSLatitude.values[0].den
m = GPSLatitude.values[1].num/GPSLatitude.values[1].den
s = GPSLatitude.values[2].num/GPSLatitude.values[2].den
# print("Degrés : ",d," Minutes : ",m," Secondes : ",s)
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
num signifie numérateur et den dénominateur, car les données
sont sous forme de fractions
'''
d = GPSLongitude.values[0].num/GPSLongitude.values[0].den
m = GPSLongitude.values[1].num/GPSLongitude.values[1].den
s = GPSLongitude.values[2].num/GPSLongitude.values[2].den
# print("Degrés : ",d," Minutes : ",m," Secondes : ",s)
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
#--------------- Programme principal -----------------------#
description = "Test"
# Ouverture du fichier csv en mode écriture
lefichiercsv = open(r"Tags.csv", "w")
lefichiercsv.write("name,description,Lat,Lon\n")
# 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_reduites/"+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 la ligne du fichier csv
# {{url_du_fichier}}, description, latitude, longitude et date
#lefichiercsv.write("{{{{{}}}}}, {}, {}, {}, {}\n".format(nom,description, latitude,longitude, date))
lefichiercsv.write("{},{} {{{{http://www.cvgg.org/MontRacine/HautGeneveysSagne/{}}}}},{},{}\n".format(nom,description, nom, latitude,longitude))
#dereferencement des variables pour lever l'exception
del latitude, longitude
#changement d'image
i = i + 1
lefichiercsv.close()