[PYTHON] Verwendung von Folium (Visualisierung von Standortinformationen)

Überblick

Ich werde ein Paket namens Folium zusammenfassen, das für die Verarbeitung geografischer Informationen in Python geeignet ist.

Über Folium

Folium ist eine Bibliothek, die eine JavaScript-Bibliothek namens Leaflet in Python umschließt.

  1. Erstellen Sie ein Kartenobjekt
  2. Fügen Sie dem Kartenobjekt verschiedene Formen hinzu
  3. Speichern Sie das Map-Objekt als HTML

Sie können ganz einfach eine HTML-Datei mit einer interaktiven Karte erstellen, indem Sie den Anweisungen folgen. In JupyterLab wird die Karte auf dem Bildschirm angezeigt, indem einfach das Kartenobjekt angezeigt wird.

Dieser Eintrag wurde im Jupyter Lab geschrieben. Wenn Sie den Code in diesem Eintrag in der Reihenfolge in JupyterLab ausführen, erhalten Sie das gleiche Ergebnis (sollte).

Versionsinformation

import sys
import folium
print(f"""Python
{sys.version}

folium
{folium.__version__}""")
Python
3.7.3 (default, Mar 27 2019, 16:54:48) 
[Clang 4.0.1 (tags/RELEASE_401/final)]

folium
0.10.1

Vorbereitung

Definieren Sie die unten verwendeten Konstanten.

#Breite und Länge der Toranomon Hills
office_lat = 35.66687568
office_lng = 139.74947495

Basic

Zeigen Sie die Karte vorerst an

Um eine Karte auf Jupyter anzuzeigen, bewerten Sie einfach folium.Map. Alternativ können Sie es mit Map.save in eine HTML-Datei ausspucken.

fmap1 = folium.Map(
    location=[office_lat, office_lng],
    tiles = "OpenStreetMap",
    zoom_start = 20, #Vergrößerung 1 bis 20 beim Zeichnen
    width = 800, height = 800 #Kartengröße
) 
fmap1 #Oder fmap1.save("1.html")

スクリーンショット 2020-02-03 16.08.01.png

Fliesen ist

Sie können aus wählen.

Setzen Sie einen Marker

Platziere einen Marker. Popups können für Marker registriert werden.

fmap2 = folium.Map(
    location=[office_lat, office_lng], 
    zoom_start=20
)
folium.Marker([office_lat, office_lng], popup="Datawise ist hier").add_to(fmap2)
fmap2

スクリーンショット 2020-02-03 16.09.19.png

Versuche eine Linie zu ziehen

Übergeben Sie eine Liste von (lat, lng) an PolyLine und zeichnen Sie eine Faltlinie

import itertools as it

#Die Spitze des Platzes zentrierte sich auf Toranomon Hills
sq = [
    (office_lat + dy * pow(10, -3), office_lng + dx * pow(10, -3))
    for dx, dy in it.product([-1, 1], [-1, 1])
]
fmap3 = folium.Map(location=[office_lat, office_lng], zoom_start=20)
folium.PolyLine(locations=sq).add_to(fmap3)
fmap3

スクリーンショット 2020-02-03 16.10.25.png

Versuchen Sie, die Oberfläche zu streichen

Sie können Polygone mit Polygon zeichnen.

sw, nw, se, ne = sq
fmap4 = folium.Map(location=[office_lat, office_lng], zoom_start=20)
folium.Polygon(
    locations=[sw, se, ne, nw], #Polygonale Eckpunkte
    color="red", #Linienfarbe
    weight=10, #Dicke der Linie
    fill=True, #Füllen
    fill_opacity=0.5 #Transparenz (1=Opazität)
).add_to(fmap4)

fmap4

スクリーンショット 2020-02-03 16.11.31.png

Wenn Sie über ein solches Werkzeug verfügen, können Sie im Prinzip die Informationen der entsprechenden Daten auf der Karte visualisieren. In der Praxis ist es jedoch (möglicherweise) langweilig, das Polygon mit einer Liste von Scheitelpunkten zu verwalten. ..

GeoJSON ist als Standard zum Ausdrücken von Formen auf einer Karte definiert und kann auch von Folium verarbeitet werden.

Verwenden Sie das GeoJSON-Objekt

Verwenden Sie die Geojson-Bibliothek, um mit GeoJSON zu arbeiten.

GeoJSON Notizen

GeoJSON stirbt, wenn Sie die Spezifikationen nicht sorgfältig lesen. Ich habe mehrere Stunden damit verbracht, die folgenden Punkte zu bemerken ... Es ist keine Übertreibung zu sagen, dass ich diesen Eintrag geschrieben habe, weil ich ihn meinen Kollegen vermitteln wollte.

Verwenden Sie für Details den folgenden Code ...

import geojson as gj

# (lat、lng)Liste von
#Punkt 1.Erstes und letztes Element haben den gleichen Wert
lat_lng = [sw, se, ne, nw, sw] 

#Punkt 2. (lng, lat)Konvertieren zu
def swap(p):
    return p[1], p[0]
lng_lat = list(map(swap, lat_lng))

#Punkt 3.Machen Sie eine Liste der Liste von (lng, lat)
lng_lat2 = [lng_lat]

poly5 = gj.Polygon(lng_lat2)
fmap5 = folium.Map(location=[office_lat, office_lng], zoom_start=20)
folium.GeoJson(poly5).add_to(fmap5)
fmap5

スクリーンショット 2020-02-03 16.14.29.png

Ich habe es nicht im Detail untersucht, aber wenn es nicht funktioniert, speichern Sie es als HTML → öffnen Sie es in einem Browser und sehen Sie sich JS-Fehler usw. an. Möglicherweise sind einige Informationen vorhanden.

Zeichnen Sie mehrere Polygone

In GeoJSON wird eine Sammlung mehrerer Objekte durch eine FeatureCollection dargestellt. Mit FeatureCollection können Sie viele gleichzeitig zeichnen. (Tatsächlich erwartet folium.GeoJson, dass eine FeatureCollection als GeoJSON übergeben wird, aber wenn etwas anderes übergeben wird, wird es intern in eine FeatureCollection konvertiert.)

def slide(poly, i): 
    """
Eine Funktion, die Polygone ein wenig verschiebt
    """
    vtx = poly["coordinates"][0] # gj.Polygonkoordinaten sind eine Liste von Eckpunkten"Liste von"
    vtx2 = [
        (lng + i * pow(10, -3), lat + i * pow(10, -3))
        for lng, lat in vtx
    ]
    return gj.Polygon([vtx2]) # gj.Polygoncodinat ist (weggelassen)





fmap6 = folium.Map(location=[office_lat, office_lng], zoom_start=16)
polys6 = [slide(poly5, i) for i in range(-2, 3)]
fc6 = gj.FeatureCollection(polys6)
folium.GeoJson(fc6).add_to(fmap6)
fmap6

スクリーンショット 2020-02-03 16.24.42.png

Es sieht so aus, als ob es oben gut funktioniert, aber es macht tatsächlich etwas falsch mit der GeoJSON-Spezifikation. FeatureCollection-Spezifikationen Oben müssen FeatureCollection-Features eine Liste von Objekten mit dem Typ = "feature" sein. .. Auf der anderen Seite, wenn Sie sich "Funktionen" von fc6 ansehen

fc6["features"]
[{"coordinates": [[[139.746475, 35.663876], [139.748475, 35.663876], [139.748475, 35.665876], [139.746475, 35.665876], [139.746475, 35.663876]]], "type": "Polygon"},
 {"coordinates": [[[139.747475, 35.664876], [139.749475, 35.664876], [139.749475, 35.666876], [139.747475, 35.666876], [139.747475, 35.664876]]], "type": "Polygon"},
 {"coordinates": [[[139.748475, 35.665876], [139.750475, 35.665876], [139.750475, 35.667876], [139.748475, 35.667876], [139.748475, 35.665876]]], "type": "Polygon"},
 {"coordinates": [[[139.749475, 35.666876], [139.751475, 35.666876], [139.751475, 35.668876], [139.749475, 35.668876], [139.749475, 35.666876]]], "type": "Polygon"},
 {"coordinates": [[[139.750475, 35.667876], [139.752475, 35.667876], [139.752475, 35.669876], [139.750475, 35.669876], [139.750475, 35.667876]]], "type": "Polygon"}]

Es ist schwer zu erkennen, aber die "Features" von fc6 sind ein Array von Objekten mit dem Typ "Polygon". (Ich denke, das obige Beispiel hat funktioniert, weil Folium gute Arbeit geleistet hat, da bin ich mir sicher)

Sie können das richtige GeoJSON-Objekt erhalten, indem Sie Folgendes schreiben:

fmap7 = folium.Map(location=[office_lat, office_lng], zoom_start=16)
fc7 = gj.FeatureCollection(
    features=[
        gj.Feature(
            geometry=p,
            id=i
        ) for i, p in enumerate(polys6)
    ]
)
folium.GeoJson(fc7).add_to(fmap7)
fmap7

スクリーンショット 2020-02-03 16.16.20.png

Ändern Sie das Format des Polygons

Um das Format von Polygon zu ändern, übergeben Sie style_function an folium.GeoJson. Das Ergebnis der Anwendung von style_function auf jedes Feature wird beim Formatieren dieses Features als Format verwendet.

fmap8 = folium.Map(location=[office_lat, office_lng], zoom_start=16)
folium.GeoJson(
    fc7,
    style_function=lambda feature: {
        "fillColor": "red",
        "color": "black",
        "weight": 10 / (feature["id"] + 1),
        "fillOpacity": feature["id"] * 0.2
    }).add_to(fmap8)
fmap8

スクリーンショット 2020-02-03 16.17.16.png

[^ 1]: Dieses Japanisch ist schwer zu verstehen, deshalb werde ich es ergänzen. In GeoJSON werden Punkte auf der Karte durch eine Liste der Länge 2 [Länge, Breite] dargestellt. Da ein Polygon durch mehrere Punkte (= jeden Scheitelpunkt) dargestellt wird, wird der Außenumfang des Polygons durch eine Liste dargestellt, die mehrere [Längen- und Breitengrade] enthält. Ich dachte, dass dies ein Polygon darstellen könnte, aber GeoJSONs Polygon kann auch ein Polygon mit Löchern darstellen. Ein perforiertes Polygon wird durch eine Liste dargestellt, in der das erste Element eine Liste ist, die den Außenumfang darstellt, und das zweite und nachfolgende Element eine Liste, die den Umfang des Innenlochs darstellt. Aufgrund der GeoJSON-Spezifikationen ist es erforderlich, eine Liste zu erstellen, die nur eine Liste enthält, die den Außenumfang darstellt (dies ist eine Liste, die mehrere Listen der Länge 2 enthält, die als [Längengrad, Breitengrad] bezeichnet werden), auch wenn keine Löcher vorhanden sind. Um beispielsweise ein Viereck mit vier Punkten [0,0], [0,1], [1,1], [1,0] als Eckpunkte zu definieren, [[0,0], [0] , 1], [1,1], [1,0]] "anstelle der Liste der Eckpunkte" [[[0,0], [0,1], [1,1], [1,0] Sie benötigen eine Liste von Scheitelpunktlisten mit dem Namen]]] .

Recommended Posts

Verwendung von Folium (Visualisierung von Standortinformationen)
Zusammenfassung der Verwendung von pandas.DataFrame.loc
Zusammenfassung der Verwendung von pyenv-virtualenv
Zusammenfassung der Verwendung von csvkit
[Python] Zusammenfassung der Verwendung von Pandas
Berechnen Verwenden Sie% des Befehls df
[Python2.7] Zusammenfassung der Verwendung von unittest
Jupyter Notebook Grundlagen der Verwendung
Grundlagen von PyTorch (1) - Verwendung von Tensor-
Zusammenfassung der Verwendung der Python-Liste
[Python2.7] Zusammenfassung der Verwendung des Unterprozesses
[Frage] Wie verwende ich plot_surface von Python?
Verwendung von xml.etree.ElementTree
Wie benutzt man Python-Shell
Hinweise zur Verwendung von tf.data
Verwendung von virtualenv
Wie benutzt man Seaboan?
[Python] Verwendung von zwei Arten von type ()
Verwendung von Image-Match
Wie man Shogun benutzt
Verwendung von Pandas 2
Verwendung von Virtualenv
Verwendung von numpy.vectorize
Verwendung von pytest_report_header
Wie man teilweise verwendet
Wie man Bio.Phylo benutzt
Nicht viel erwähnt, wie man Pickle benutzt
Zusammenfassung der Verwendung von MNIST mit Python
Verwendung von SymPy
Wie man x-means benutzt
Verwendung von WikiExtractor.py
Verwendung von IPython
Verwendung von virtualenv
Wie benutzt man Matplotlib?
Verwendung von iptables
Wie benutzt man numpy?
Verwendung von TokyoTechFes2015
Wie benutzt man venv
Verwendung des Wörterbuchs {}
Wie benutzt man Pyenv?
Verwendung der Liste []
Wie man Python-Kabusapi benutzt
Verwendung von OptParse
Verwendung von return
Wie man Imutils benutzt
[Rails] So erhalten Sie Standortinformationen mithilfe der Geolocation-API
Hinweise zur Verwendung von AIST Spacon ABCI
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Hinweise zur Verwendung beim Kombinieren von pandas.DataFrame
Verwendung von Python Kivy ~ ~ Grundlagen der Kv-Sprache ~
Verwendung von Qt Designer
Verwendung der Suche sortiert
[gensim] Verwendung von Doc2Vec
python3: Verwendung der Flasche (2)
Verstehen Sie, wie man Django-Filter verwendet
Verwendung des Generators