Es gibt viele Möglichkeiten, Geoinformationen mit Python zu visualisieren, aber dieses Mal werde ich ** Basemap Matplotlib Toolkit ** verwenden, um Standortinformationen zu visualisieren.
Klicken Sie hier, um Artikel anzuzeigen, die in der Vergangenheit zur Visualisierung von Geoinformationen eingeführt wurden
Um es einfach auszudrücken: Mit Basemap können Sie die Plotfunktion von matplotlib hinzufügen, während Sie verschiedene Kartenprojektionsmethoden, Kartenkacheln, Küsten und Flüsse zeichnen. Es wird hauptsächlich von Erdwissenschaftlern verwendet.
The matplotlib basemap toolkit is a library for plotting 2D data on maps in Python. Basemap does not do any plotting on it’s own, but provides the facilities to transform coordinates to one of 25 different map projections (using the PROJ.4 C library). Matplotlib is then used to plot contours, images, vectors, lines or points in the transformed coordinates. Shoreline, river and political boundary datasets (from Generic Mapping Tools) are provided, along with methods for plotting them. The GEOS library is used internally to clip the coastline and polticial boundary features to the desired map projection region. Basemap is geared toward the needs of earth scientists, particularly oceanographers and meteorologists. (Zitiert aus https://matplotlib.org/basemap/users/intro.html)
Verwenden Sie zunächst conda, um die Basislinie zu installieren.
$ conda install -c anaconda basemap
$ conda install -c conda-forge basemap-data-hires
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
fig = plt.figure()
#Geben Sie den Bereich an, in dem die Karte gezeichnet werden soll.
m = Basemap(llcrnrlat=30, urcrnrlat=50, llcrnrlon=125, urcrnrlon=150) #Erstellen Sie eine Grundkarteninstanz
#Subtrahieren Sie den Breiten- und Längengrad alle 10 Grad. Die zweite Option legt fest, wo das Etikett nach oben, unten, links und rechts angebracht werden soll.
m.drawparallels(np.arange(-90, 90, 10), labels=[ True,False, True, False]) #Breitengradlinie
m.drawmeridians(np.arange(0, 360, 10), labels=[True, False, False, True]) #Längslinie
m.drawcoastlines() #Grenzlinie
plt.show()
Sie können die Kartenauflösung und die Projektionsmethode flexibel ändern. (Es gibt viele detaillierte Einstellungen ...)
class mpl_toolkits.basemap.Basemap(llcrnrlon=None, llcrnrlat=None, urcrnrlon=None, urcrnrlat=None, llcrnrx=None, llcrnry=None, urcrnrx=None, urcrnry=None, width=None, height=None, projection='cyl', resolution='c', area_thresh=None, rsphere=6370997.0, ellps=None, lat_ts=None, lat_1=None, lat_2=None, lat_0=None, lon_0=None, lon_1=None, lon_2=None, o_lon_p=None, o_lat_p=None, k_0=None, no_rot=False, suppress_ticks=True, satellite_height=35786000, boundinglat=None, fix_aspect=True, anchor='C', celestial=False, round=False, epsg=None, ax=None)
projection\resolution | Niedrige Auflösung | Mittlere Auflösung | Hohe Auflösung |
---|---|---|---|
Zylinderabstand mit regelmäßigem Abstand | |||
Mercator-Projektion | |||
Lambert-Projektion |
Übrigens der Standardwert, wenn nichts eingestellt ist
Projektion = 'Zyl' (zylindrische Projektion mit normalem Abstand)
Auflösung = 'c' (grobe Auflösung)
Dieses Mal möchte ich die pseudo-menschlichen Flussdaten, die kostenlos veröffentlicht werden, als Probe verwenden.
Lesen Sie am 16. September 2013 die pseudo-menschlichen Flussdaten des Kansai-Gebiets und überprüfen Sie den Inhalt.
import pandas as pd
df = pd.read_csv('./Kansai/2013_09_16.csv')
df
'''
Erste Spalte: Benutzer-ID
Zweite Spalte: Geschlechtsschätzung (1):Männlich, 2:Weiblich, 0,3: unbekannt, NA: nicht geschätzt)
3. Spalte: Datum / Uhrzeit (24 Stunden alle 5 Minuten)
Vierte Spalte: Breitengrad
5. Spalte: Längengrad
6. Reihe: Resident Kategorie(Hauptklassifikation)* Zeichenkettentyp
7. Reihe: Resident Kategorie(Unterkategorie)* Zeichenkettentyp
8. Reihe: Zustand(Bleib oder beweg dich)* Zeichenkettentyp
9. Spalte: Resident Category ID(Entspricht der 6. und 7. Zeile)
'''
Dieses Mal richten wir uns an den sich bewegenden Benutzer (STAY_MOVE == 'MOVE'). Geben Sie beim Teilen des Zeitstempels in Stunden und Minuten einen Rang für jeden Benutzer und jede Stunde an und formatieren Sie ihn in ein Formular, das einfach zu handhaben ist.
from dfply import *
df = df >> filter_by(X.STAY_MOVE=='MOVE') >> select(columns_to(X.lon, inclusive=True))
df = df >> separate(X.timestamp, ['col1','hour','col2','minute','col3'], sep=[10,13,14,16],convert=True) >> select(~X.col1, ~X.col2, ~X.col3)
df = df >> group_by(X.uid,X.hour) >> mutate(rk=row_number(X.minute))
df
Jetzt werde ich die Standortinformationen visualisieren, aber zuerst werde ich die Karte festlegen, die ich dieses Mal als Basis betrachten werde. Es gibt auch Methoden, mit denen die Hintergrundkarte von ArcGIS und die Grenzen von Präfekturen und Städten, Dörfern und Dörfern gezeichnet werden können. Daher werde ich sie auch anwenden.
Für Präfektur- und Gemeindegrenzen laden Sie bitte das Shapefile von __ [hier] herunter (https://gadm.org/download_country_v3.html) __. Die Dateistruktur ist wie folgt.
-gadm
-gadm36_JPN_1.cpg
-gadm36_JPN_1.shp
-gadm36_JPN_2.dbf
-gadm36_JPN_2.shx
-gadm36_JPN_1.dbf
-gadm36_JPN_1.shx
-gadm36_JPN_2.prj
-gadm36_JPN_1.prj
-gadm36_JPN_2.cpg
-gadm36_JPN_2.shp
** Anfängliche Karteneinstellung **
def basemap():
fig = plt.figure(dpi=300)
m = Basemap(projection="cyl", resolution="i", llcrnrlat=33.5,urcrnrlat=36, llcrnrlon=134, urcrnrlon=137)
m.drawparallels(np.arange(-90, 90, 0.5), labels=[True, False, True, False],linewidth=0.0, fontsize=8)
m.drawmeridians(np.arange(0, 360, 0.5), labels=[True, False, False, True],linewidth=0.0, rotation=45, fontsize=8)
m.drawcoastlines(color='k')
m.readshapefile('./gadm/gadm36_JPN_1', 'prefectural_bound1', color='k', linewidth=.8) #Präfekturgrenze
m.readshapefile('./gadm/gadm36_JPN_2', 'prefectural_bound2', color='lightgray', linewidth=.5) #Gemeindegrenze
m.arcgisimage(service='World_Street_Map', verbose=True, xpixels=1000, dpi=300)
** Wenn Sie dies bisher getan haben, können Sie wie matplotlib zeichnen. ** **.
scatter(x, y, *args, **kwargs)
https://basemaptutorial.readthedocs.io/en/latest/plotting_data.html#scatter
tmp1=df[(df['gender']==1) & (df['hour']==9) & (df['rk']==1)]
tmp2=df[(df['gender']==2) & (df['hour']==9) & (df['rk']==1)]
basemap()
plt.scatter(tmp1['lon'],tmp1['lat'],color='b',s=0.5) #Männer in Blau
plt.scatter(tmp2['lon'],tmp2['lat'],color='r',s=0.5) #Frauen in rot
Hier wird für jeden Benutzer nur das erste Protokoll um 9 Uhr aufgezeichnet.
hexbin(x, y, **kwargs)
https://basemaptutorial.readthedocs.io/en/latest/plotting_data.html#hexbin
tmp=df[(df['hour']==9) & (df['rk']==1)]
basemap()
plt.hexbin(tmp['lon'],tmp['lat'], gridsize=50, cmap='rainbow', mincnt=1, bins='log',linewidths=0.3, edgecolors='k')
Sie können die Größe des Hexagrids auch mit der Rastergröße ändern.
Visualisieren Sie die Häufigkeitsverteilung durch Überlagerung der Niederschlagsverteilung
Zum Beispiel ist es möglich, Wetterdaten zu multiplizieren, die wahrscheinlich die Bewegung von Menschen beeinflussen. Der 16. September 2013 war übrigens der Tag, an dem der Taifun vorbei war.
Von der Meteorologischen Agentur | 1 km Maschenradarecho |
Visualisiere die Bewegungsgeschwindigkeit und -richtung einer Person
Die Vektoranzeige ist auch möglich, indem die Geschwindigkeit und der Azimutwinkel aus den Positionsinformationen des Start- und Endpunkts berechnet werden. (Abgesehen davon, ob es eine Verwendung gibt)
Das ist es! Bis zum Ende Danke fürs Lesen!
Recommended Posts