Suite du paragraphe sur UMAP.

This commit is contained in:
Guyot 2022-08-01 00:47:14 +02:00
parent d92631a7a6
commit 5554d00bea
7 changed files with 361 additions and 4 deletions

130
codes/carteLelbc3.py.bak Normal file
View File

@ -0,0 +1,130 @@
''' 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}@*)

View File

@ -0,0 +1,99 @@
''' 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()

View File

@ -0,0 +1,32 @@
import os (*@\label{creationcarteumap2:ligne:num1}@*)
import exifread(*@\label{creationcarteumap2:ligne:num2}@*)
from creation_carte_umap2_coord import *(*@\label{creationcarteumap2:ligne:num3}@*)
path = './images/'
fichiers=os.listdir(path)
description = "Description de l'image"
lefichiercsv = open(r"Tags.csv", "w")
lefichiercsv.write("name,description,Lat,Lon\n")
i = 0 #indice des images
for nom in fichiers:
adresseImage = "./images_reduites/"+nom
titre = nom.split('.')[0]
f = open(adresseImage, 'rb')
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("{} Fichier traité : {}, Latitude : {}, longitude : {}, date : {}"
.format(i,nom,latitude,longitude, date))
except NameError:
print('Fichier sans données GPS : ',nom)
else:
lefichiercsv.write("{},{} {{{{http://urldelimagesanssonnom/{}}}}},{},{}\n"
.format(nom,description, nom, latitude,longitude))
del latitude, longitude
i = i + 1
lefichiercsv.close()

View File

@ -0,0 +1,22 @@
def lalatitude(ref,GPSLatitude):
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
if ref == 'N':
latitude = d + (m / 60.0) + (s / 3600.0)
elif ref == 'S':
latitude = -1*(d + (m / 60.0) + (s / 3600.0))
else:
print('La latitude est fausse !')
return latitude
def lalongitude(ref,GPSLongitude):
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
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

Binary file not shown.

View File

@ -1,4 +1,4 @@
\documentclass[11pt,a4paper,twoside]{scrartcl}
\documentclass[12pt,a4paper,twoside]{scrartcl}
\usepackage{OCI}
@ -1294,6 +1294,43 @@ Puis, il faut choisir le calque sur lequel le POI trouvera sa place (éventuelle
\subsection{Méthode automatique}
Évidemment, lorsqu'il faut placer cinquante POI, la méthode manuelle s'avère très fastidieuse. Il faut alors avoir recours à un script qui va extraire les informations de position du POI des métadonnées EXIF des images, puis les mettre dans un fichier texte de type csv.
\medskip
La première étape est d'utiliser le script du listing \ref{listing:creationcarteumap} dans un répertoire où se trouve le dossier comprenant les images.
\subsubsection{Fonctionnement du code}
Aux lignes \ref{creationcarteumap2:ligne:num1} à \ref{creationcarteumap2:ligne:num3}, on importe les modules nécessaires au script. En particulier, le module \emph{OS} (ligne \ref{creationcarteumap2:ligne:num1}) permet de récupérer les noms des fichiers images du répertoire les contenant, le module \emph{exifread} (ligne \ref{creationcarteumap2:ligne:num2}) permet de récupérer les données EXIF des images et enfin le script \emph{creation\_carte\_umap2\_coord} (ligne \ref{creationcarteumap2:ligne:num3}) fournit les fonction de transformation des coordonnées de degrés, minutes, secondes en degrés décimaux.
...
\lstinputlisting[float,
language=python,
caption={Le code pour récupérer la position des POI},
label={listing:creationcarteumap},
numbers=left,
firstnumber=1,
%linerange={8-11,94-130},
%firstline=94,
%lastline=130,
numberstyle=\tiny,
numbersep=6pt,
stepnumber=2]
{codes/creation_carte_umap2.py}
\lstinputlisting[float,
language=python,
caption={Le code de conversion des coordonnées.},
label={listing:creationcarteumapcood},
numbers=left,
firstnumber=1,
%linerange={8-11,94-130},
%firstline=94,
%lastline=130,
numberstyle=\tiny,
numbersep=6pt,
stepnumber=2]
{codes/creation_carte_umap2_coord.py}
\newpage
\section{Cartes interactives en python}

View File

@ -1,4 +1,4 @@
\documentclass[11pt,a4paper,twoside]{scrartcl}
\documentclass[12pt,a4paper,twoside]{scrartcl}
\usepackage{OCI}
@ -1289,10 +1289,47 @@ Ensuite, on peut placer sans difficulté un POI sur le fond de carte UMAP. Pour
Ensuite seulement, il faut cliquer sur celui-ci et choisir de l'éditer (un petit crayon). Cela permet d'accéder au options du marqueur. Parmi celles-ci se trouve un onglet \emph{Coordonnées} que vous pouvez remplir des valeurs en degrés décimaux obtenus précédemment.
Puis, il faut choisir le calque sur lequel le POI trouvera sa place (éventuellement à créer précédemment), dans les \emph{Propriétés de la forme} choisir la forme du POI et dans les \emph{Options d'interaction}, sous \emph{Gabarit du contenu de la popup} et en vous aidant de l'aide, vous pouvez construire le contenu de votre POI en plaçant par exemple un titre à l'aide d'un \# et une image à l'aide d'accolades \{\{ url \}\} préalablement rendue disponible sur un site quelconque.
Puis, il faut choisir le calque sur lequel le POI trouvera sa place (éventuellement à créer précédemment), dans les \emph{Propriétés de la forme} choisir la forme du POI et dans les \emph{Options d'interaction}, sous \emph{Gabarit du contenu de la popup} et en vous aidant de l'aide, vous pouvez construire le contenu de votre POI en plaçant par exemple un titre à l'aide d'un \# précédant celui-ci et une image à l'aide d'accolades \{\{ url \}\} entourant le lien vers celle-ci, préalablement rendue disponible sur un site quelconque.
\subsection{Méthode automatique}
Évidemment, lorsqu'il faut placer cinquante POI, la méthode manuelle s'avère très fastidieuse. Il faut alors avoir recours à un script qui va extraire les informations d'un fichier texte au format csv.
Évidemment, lorsqu'il faut placer cinquante POI, la méthode manuelle s'avère très fastidieuse. Il faut alors avoir recours à un script qui va extraire les informations de position du POI des métadonnées EXIF des images, puis les mettre dans un fichier texte de type csv.
\medskip
La première étape est d'utiliser le script du listing \ref{listing:creationcarteumap} dans un répertoire où se trouve le dossier comprenant les images.
\subsubsection{Fonctionnement du code}
Aux lignes \ref{creationcarteumap2:ligne:num1} à \ref{creationcarteumap2:ligne:num3}, on importe les modules nécessaires au script. En particulier, le module \emph{OS} (ligne \ref{creationcarteumap2:ligne:num1}) permet de récupérer les noms des fichiers images du répertoire les contenant, le module \emph{exifread} (ligne \ref{creationcarteumap2:ligne:num2}) permet de récupérer les données EXIF des images et enfin le script \emph{creation\_carte\_umap2\_coord} (ligne \ref{creationcarteumap2:ligne:num3}) fournit les fonction de transformation des coordonnées de degrés, minutes, secondes en degrés décimaux.
...
\lstinputlisting[float,
language=python,
caption={Le code pour récupérer la position des POI},
label={listing:creationcarteumap},
numbers=left,
firstnumber=1,
%linerange={8-11,94-130},
%firstline=94,
%lastline=130,
numberstyle=\tiny,
numbersep=6pt,
stepnumber=2]
{codes/creation_carte_umap2.py}
\lstinputlisting[float,
language=python,
caption={Le code de conversion des coordonnées.},
label={listing:creationcarteumapcood},
numbers=left,
firstnumber=1,
%linerange={8-11,94-130},
%firstline=94,
%lastline=130,
numberstyle=\tiny,
numbersep=6pt,
stepnumber=2]
{codes/creation_carte_umap2_coord.py}
\newpage