[PYTHON] Visualisieren Sie Standortinformationen mit Basemap

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

1. Über Grundkarte

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)

1-1. Grundlagen der Grundkarte

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()

image.png

1-2. Detaillierte Karteneinstellungen

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 image.png image.png image.png
Mercator-Projektion image.png image.png image.png
Lambert-Projektion image.png image.png image.png

Übrigens der Standardwert, wenn nichts eingestellt ist Projektion = 'Zyl' (zylindrische Projektion mit normalem Abstand) Auflösung = 'c' (grobe Auflösung)

2. Methode zur Visualisierung von Standortinformationen

2-1. Datenquelle

"Pseudo-Human-Flow-Daten" basierend auf SNS-Analysedaten des Center for Spatial Information Science der Universität Tokio

Dieses Mal möchte ich die pseudo-menschlichen Flussdaten, die kostenlos veröffentlicht werden, als Probe verwenden.

2-2. Datenstruktur

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

image.png

2-3 Grundeinstellung des Grundwerts und Visualisierung der Standortinformationen

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)

image.png

** Wenn Sie dies bisher getan haben, können Sie wie matplotlib zeichnen. ** **.

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. image.png

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. image.png

3. Bonus

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.

image.png out.gif
Von der Meteorologischen Agentur 1 km Maschenradarecho

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) out.jpeg

Das ist es! Bis zum Ende Danke fürs Lesen!

Recommended Posts

Visualisieren Sie Standortinformationen mit Basemap
Mit Pandas schnell visualisieren
Visualisieren Sie Ansprüche mit AI
termux × AWS Senden Sie mit IoT Standortinformationen für Smartphones an AWS
Lassen Sie uns 2ch Thread mit WordCloud-Scraping- visualisieren
Informationen erhalten Sie mit zabbix api
Lassen Sie uns das Wissen über Wikidata mit Neo4j visualisieren
Holen Sie sich Alembic-Informationen mit Python
Holen Sie sich Informationen zu Videodateien mit ffmpeg-python
Visualisieren Sie den Entscheidungsbaum mit einem Jupyter-Notizbuch
Visualisieren Sie Python-Paketabhängigkeiten mit graphviz
Holen Sie sich Wetterinformationen mit Python & Scraping
Benachrichtigen Sie LINE über Standortinformationen (Google-Karte) mit der GPS-SORACOM Edition mit mehreren Einheiten