Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe

Ich war vor einiger Zeit für ein Brautpaar in Italien. Ich machte eine wöchentliche Tour durch Mailand, Venedig, Florenz, Pisa, Rom und Pompeji, und als ich es bemerkte, machte ich ungefähr 1000 Fotos. Ich hatte etwas Freizeit und machte jeden Tag ungefähr 10.000 Schritte, also wollte ich eine Aufzeichnung einschließlich der Route führen, also machte ich ein Kartenalbum ...!

Visualisierung

Das ganze Bild sieht so aus. Ich verwende die Karte von OpenStreetMap.

Wenn Sie beispielsweise Venedig vergrößern, können Sie von hier aus die Wanderroute wie folgt sehen. Es ist je nach Datum farblich gekennzeichnet, und da ich in Venedig übernachtet habe, gibt es eine zweifarbige Route. Und der Marker ist der Punkt, an dem Sie das Bild aufgenommen haben. Klicken Sie darauf und das Bild wird angezeigt.

Dies ist das Originalfoto. Da ich es während der Gondelfahrt genommen habe, befindet sich der Marker auch auf der Wasserstraße. Ich freute mich auf Venedig als heiligen Ort für "ARIA", aber es war eine weitaus fantastischere Stadt des Wassers als ich erwartet hatte. Ich werde mein Bestes geben, um es zu empfehlen.

Dies ist die Spanische Treppe, die der heilige Ort des zeitlosen Meisterwerks "Roman Holiday" ist. Ich habe es auf dem Flug gesehen (Oh

Dies ist eine Katze, die über Pompeji wacht, das durch den Ausbruch zerstört wurde. Katzen erscheinen hier. Es war eine Katze. Freut mich, dich kennenzulernen

Reaktion

Ich teilte es mit meiner Familie und Freunden und es war großartig, weil ich meine Erinnerungen teilen konnte, während ich der Reise folgte und Fotos zeigte. Ich ging durch diese Straße, aß in diesem Laden zu Abend und rannte auf dieser Straße, und es war kurz vor der Besprechungszeit. Da ich jedoch die HTML-Datei freigegeben habe, die das Jupyter Lab-Notizbuch so exportiert hat, wie es ist, haben die Ingenieure begonnen, den Python-Code zu lesen, und es gab ein Problem, dass es schwierig war, diese Geschichte zu hören

Verfahren

Ich habe ungefähr 50 Zeilen Python-Code in JupyterLab geschrieben und Folgendes getan: Ich fange an, Folium für geschäftliche Zwecke zu verwenden, aber es ist sehr einfach.

--Lesen Sie die Bilddatei mit Pillow.

Ich kann ein Bild-Tag an den Folium-Marker übergeben, aber es scheint, dass ich nicht auf die lokale Datei verweisen kann, daher verwende ich den Trick der Codierung in Base64. Dank dessen ist es einfach zu teilen, da es eine einzelne unabhängige HTML-Datei ausgeben kann, aber obwohl es reduziert ist, hat es ungefähr 1000 Bilder, so dass es eine HTML-Datei von ungefähr 100 MB wurde ... … 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

Ausführungsumgebung

$ 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     

Referenzlink

Ermitteln Sie den Aufnahmeort anhand der in das Foto eingebetteten GPS-Informationen mit Python | My Navi News Verarbeitung mit PIL unter Berücksichtigung des EXIF-Orientierungs-Tags | Qiita View image on popup | python-visualization/folium

Recommended Posts

Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
Der Prozess, Python-Code objektorientiert zu machen und zu verbessern
Konvertieren Sie das Ergebnis von Python Optparse, um es zu diktieren und zu verwenden
Das Ergebnis der Installation von Python auf Anaconda
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Schließen Sie das Cat-Ergebnis in doppelte Anführungszeichen ein und setzen Sie es in eine Variable
Öffnen Sie eine Excel-Datei in Python und färben Sie die Karte von Japan
Holen Sie sich den Aufrufer einer Funktion in Python
Zeigen Sie das Ergebnis der Geometrieverarbeitung in Python an
Kopieren Sie die Liste in Python
Vergleichen Sie die Geschwindigkeit von Python Append und Map
Ausgabe in Form eines Python-Arrays
Berücksichtigung der Stärken und Schwächen von Python
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Darstellung von Containern in einem verschachtelten Rahmen (schematisch) in Jupyter und was ich bei der Erstellung untersucht habe
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Wenn Sie eine Methode in einer Ruby-Klasse definieren und dann eine Methode darin definieren, wird sie zu einer Methode der ursprünglichen Klasse.
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
[Python] Ändern Sie die Textfarbe und Hintergrundfarbe eines bestimmten Schlüsselworts in der Druckausgabe
[Selen] Öffnen Sie den Link in einem neuen Tab und verschieben Sie ihn [Python / Chrome-Treiber]
Es ist einfach, SQL mit Python auszuführen und das Ergebnis in Excel auszugeben
Finden Sie die scheinbare Breite einer Zeichenfolge in Python heraus
Lassen Sie uns das Ausführungsergebnis des Programms mit C ++, Java, Python messen.
Das Ergebnis des maschinellen Lernens von Java-Ingenieuren mit Python www
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
[Hinweis] Import von Dateien in das übergeordnete Verzeichnis in Python
[Tipps] Probleme und Lösungen bei der Entwicklung von Python + Kivy
Finden Sie die Eigenwerte einer reellen symmetrischen Matrix in Python
Rufen Sie die Excel-Liste rekursiv in einem bestimmten Ordner mit Python ab und schreiben Sie sie in Excel.
Eine einfache Möglichkeit, die in Python benötigte Zeit anzuzeigen und sie intelligenter zu verbessern
Übergeben des Ausführungsergebnisses eines Shell-Befehls in einer Liste in Python (nicht blockierende Version)
Die Geschichte von Python und die Geschichte von NaN
So bestimmen Sie die Existenz eines Selenelements in Python
Verschrotten Sie den Zeitplan von Hinatazaka 46 und spiegeln Sie ihn in Google Kalender wider
[Python] Lassen Sie uns die Anzahl der Elemente im Ergebnis bei der Operation des Sets reduzieren
So überprüfen Sie die Speichergröße einer Variablen in Python
Löschen Sie ein bestimmtes Zeichen in Python, wenn es das letzte ist
Lesen Sie die Standardausgabe eines Unterprozesses zeilenweise in Python
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Holen Sie sich den Titel und das Lieferdatum von Yahoo! News in Python
Holen Sie sich die Anzahl der Leser von Artikeln über Mendeley in Python
Ein einfacher Grund, warum der Rückgabewert von round (2.675,2) in Python 2,67 beträgt (in Wirklichkeit sollte er 2,68 betragen ...)
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
[Rails 6] Betten Sie Google Map in die App ein und fügen Sie der eingegebenen Adresse einen Marker hinzu. [Bestätigung der Details]
Richten Sie mit Python einen Dummy-SMTP-Server ein und überprüfen Sie den Sendevorgang von Action Mailer
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Python VBA, um mit Selenium die gesamte WEB-Seite zu erfassen
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
Wenn Sie einen Singleton in Python möchten, stellen Sie sich das Modul als Singleton vor
Prognostizieren Sie den Stromverbrauch in 2 Tagen und veröffentlichen Sie ihn in CSV
[Python] Süß Ist es süß? Über Suiten und Ausdrücke in offiziellen Dokumenten
Ein leicht verständlicher Vergleich der grundlegenden Grammatik von Python und Go