Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage

Je suis allé en Italie pour un jeune marié il y a quelque temps. J'ai fait une visite hebdomadaire de Milan, Venise, Florence, Pise, Rome et Pompéi, et quand j'ai remarqué, j'ai pris environ 1000 photos. J'avais un peu de temps libre et faisais environ 10 000 pas chaque jour, donc je voulais garder un enregistrement comprenant l'itinéraire, alors j'ai fait un album de cartes ...!

Visualisation

L'image entière ressemble à ceci. J'utilise la carte d'OpenStreetMap.

De là, par exemple, si vous zoomez sur Venise, vous pouvez voir l'itinéraire à pied comme celui-ci. Il est codé en couleur en fonction de la date, et depuis que j'ai passé la nuit à Venise, il existe un itinéraire bicolore. Et le marqueur est le point où vous avez pris la photo, cliquez dessus et l'image apparaîtra.

Ceci est la photo originale. Le marqueur est également sur la voie navigable car il a été pris lors de la visite en gondole. J'attendais avec impatience Venise comme lieu sacré pour "ARIA", mais c'était une ville d'eau bien plus fantastique que ce à quoi je m'attendais. Je ferai de mon mieux pour le recommander.

C'est la Place d'Espagne, qui est le lieu sacré du chef-d'œuvre intemporel "Vacances romaines". Je l'ai regardé sur le vol pour aller (Oi)

C'est un chat qui veille sur Pompéi qui a été détruit par l'éruption. Les chats apparaissent ici. C'était un chat. Ravi de vous rencontrer

réaction

Je l'ai partagé avec ma famille et mes amis, et c'était génial car j'ai pu partager mes souvenirs tout en suivant le voyage et en montrant des photos. J'ai traversé cette rue, j'ai dîné dans ce magasin et j'ai couru cette route, et c'était juste avant l'heure de la réunion. Cependant, depuis que j'ai partagé le fichier HTML qui a exporté le notebook Jupyter Lab tel quel, les ingénieurs ont commencé à lire le code Python, et il y avait un problème qu'il était difficile d'entendre cette histoire w

procédure

J'ai écrit environ 50 lignes de code Python sur JupyterLab et j'ai fait ce qui suit: Je commence à utiliser Folium pour les affaires, mais c'est très simple.

Je peux passer une balise d'image au marqueur Folium, mais il semble que je ne peux pas faire référence au fichier local, donc j'utilise l'astuce de l'encodage en Base64. Grâce à cela, il est facile à partager car il peut générer un seul fichier HTML indépendant, mais même s'il est réduit, il contient environ 1000 images, il est donc devenu un fichier HTML d'environ 100 Mo ... … W

code

import base64
import folium
import glob
import pandas as pd
from io import BytesIO
from matplotlib import pyplot as plt
from PIL import ExifTags, Image, ImageOps
def to_deg(v, ref, pos):
    d = float(v[0][0]) / float(v[0][1])
    m = float(v[1][0]) / float(v[1][1])
    s = float(v[2][0]) / float(v[2][1])
    return (d + (m / 60.0) + (s / 3600.0)) * (1 if ref == pos else -1)
to_trans_methods = {
    1: [],
    2: [Image.FLIP_LEFT_RIGHT],
    3: [Image.ROTATE_180],
    4: [Image.FLIP_TOP_BOTTOM],
    5: [Image.FLIP_LEFT_RIGHT, Image.ROTATE_90],
    6: [Image.ROTATE_270],
    7: [Image.FLIP_LEFT_RIGHT, Image.ROTATE_270],
    8: [Image.ROTATE_90]
}
files = glob.glob('/path/to/*.jpg')
rows = []
for file in files:
    with Image.open(file) as im:
        exif = {ExifTags.TAGS[k]: v for k, v in im.getexif().items() if k in ExifTags.TAGS}
        if 'GPSInfo' in exif:
            gps = {ExifTags.GPSTAGS[k]: v for k, v in exif['GPSInfo'].items() if k in ExifTags.GPSTAGS}
            lat = to_deg(gps['GPSLatitude'], gps['GPSLatitudeRef'], 'N')
            lon = to_deg(gps['GPSLongitude'], gps['GPSLongitudeRef'], 'E')
            im.thumbnail((192, 192))
            for method in to_trans_methods[exif.get('Orientation', 1)]:
                im = im.transpose(method)
            buf = BytesIO()
            im.save(buf, format="png")
            rows.append([lat, lon, exif['DateTimeOriginal'], base64.b64encode(buf.getvalue()).decode()])

df = pd.DataFrame(rows, columns=['lat', 'lon', 'dt', 'base64'])
df['dt'] = pd.to_datetime(df['dt'], format='%Y:%m:%d %H:%M:%S')
df = df.sort_values('dt')
fmap = folium.Map(location=[df['lat'].mean(), df['lon'].mean()], zoom_start=6)
hsv=[plt.get_cmap('hsv', 12)(i) for i in range(12)]
fmap.add_child(folium.ColorLine(zip(df['lat'], df['lon']), colors=df['dt'].dt.day, colormap=hsv, weight=4))
for _, row in df.iterrows():
    fmap.add_child(folium.Marker([row['lat'], row['lon']], popup=f'<img src="data:image/png;base64,{row["base64"]}">'))
fmap

Environnement d'exécution

$ python --version
Python 3.7.4

$ pip list | grep -e folium -e jupyter -e matplotlib -e pandas -e Pillow
folium               0.10.1    
jupyter-client       5.3.3     
jupyter-core         4.5.0     
jupyterlab           1.1.4     
jupyterlab-server    1.0.6     
matplotlib           3.1.2     
pandas               1.0.1     
Pillow               7.0.0     

Lien de référence

Découvrons le lieu de prise de vue à partir des informations GPS intégrées dans la photo avec Python | My Navi News Traitement avec PIL en tenant compte de la balise d'orientation EXIF | Qiita View image on popup | python-visualization/folium

Recommended Posts

Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
Le processus de création et d'amélioration du code Python orienté objet
Convertissez le résultat de python optparse en dict et utilisez-le
Le résultat de l'installation de python sur Anaconda
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Mettez le résultat du chat entre guillemets et mettez-le dans une variable
Ouvrez un fichier Excel en Python et coloriez la carte du Japon
Récupérer l'appelant d'une fonction en Python
Afficher le résultat du traitement de la géométrie en Python
Copiez la liste en Python
Comparez la vitesse d'ajout et de carte Python
Sortie sous la forme d'un tableau python
Prise en compte des forces et faiblesses de Python
[Python / Jupyter] Traduisez le commentaire du programme copié dans le presse-papiers et insérez-le dans une nouvelle cellule.
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python
Représenter des conteneurs dans un cadre imbriqué (schéma) dans Jupyter, et ce que j'ai étudié en cours de création
Un mémorandum sur la mise en œuvre des recommandations en Python
Si vous définissez une méthode dans une classe Ruby, puis définissez une méthode dans celle-ci, elle devient une méthode de la classe d'origine.
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
[Selenium] Ouvrez le lien dans un nouvel onglet et déplacez-le [Pilote Python / Chrome]
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Découvrez la largeur apparente d'une chaîne en python
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Obtenez le nombre d'éléments spécifiques dans la liste python
[Note] Importation de fichiers dans le répertoire parent en Python
[Astuces] Problèmes et solutions dans le développement de python + kivy
Trouver les valeurs propres d'une vraie matrice symétrique en Python
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Un moyen simple de visualiser le temps pris en Python et un moyen plus intelligent de l'améliorer
Comment passer le résultat de l'exécution d'une commande shell dans une liste en Python (version non bloquante)
L'histoire de Python et l'histoire de NaN
Comment déterminer l'existence d'un élément sélénium en Python
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Comment vérifier la taille de la mémoire d'une variable en Python
Supprimer un caractère spécifique en Python s'il s'agit du dernier
Lire la sortie standard d'un sous-processus ligne par ligne en Python
L'histoire de la création d'un pilote standard pour db avec python.
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
L'histoire de la création d'un module qui ignore le courrier avec python
Obtenez le titre et la date de livraison de Yahoo! News en Python
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Une raison simple pour laquelle la valeur de retour de round (2.675,2) est de 2,67 en python (elle devrait être de 2,68 en réalité ...)
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
[Rails 6] Intégrez Google Map dans l'application et ajoutez un marqueur à l'adresse saisie. [Confirmation des détails]
Configurer un serveur SMTP factice avec Python et vérifier le fonctionnement de l'envoi depuis Action Mailer
L'histoire de la création d'un outil pour charger une image avec Python ⇒ l'enregistrer sous un autre nom
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Python VBA pour obtenir une capture de la page WEB entière avec Selenium
L'histoire de la création d'un robot LINE pour le petit-déjeuner d'une université de 100 yens avec Python
Si vous voulez un singleton en python, considérez le module comme un singleton
Prédisez la quantité d'énergie utilisée en 2 jours et publiez-la au format CSV
[Python] Doux Est-ce doux? À propos des suites et des expressions dans les documents officiels
Comparer la grammaire de base de Python et Go d'une manière facile à comprendre