Ich werde ein Paket namens Folium zusammenfassen, das für die Verarbeitung geografischer Informationen in Python geeignet ist.
Folium ist eine Bibliothek, die eine JavaScript-Bibliothek namens Leaflet in Python umschließt.
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).
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
Definieren Sie die unten verwendeten Konstanten.
#Breite und Länge der Toranomon Hills
office_lat = 35.66687568
office_lng = 139.74947495
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")
Fliesen
ist
Sie können aus wählen.
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
Ü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
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
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 die Geojson-Bibliothek, um mit GeoJSON zu arbeiten.
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
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.
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
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
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
[^ 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