Suite du paragraphe sur UMAP.
This commit is contained in:
parent
d92631a7a6
commit
5554d00bea
|
@ -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}@*)
|
|
@ -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()
|
|
@ -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()
|
|
@ -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.
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue