[PYTHON] Visualisez les informations de localisation avec Basemap

Il existe de nombreuses façons de visualiser les informations géospatiales à l'aide de Python, mais cette fois, j'utiliserai ** Basemap Matplotlib Toolkit ** pour visualiser les informations de localisation.

Par exemple, cliquez ici pour consulter les articles introduits dans le passé concernant la visualisation d'informations géospatiales

1. À propos du fond de carte

Pour faire simple, Basemap vous permet d'ajouter la fonction de traçage de matplotlib tout en dessinant diverses méthodes de projection cartographique, des tuiles cartographiques, des côtes et des rivières. Il est principalement utilisé par les scientifiques de la Terre.

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. (Extrait de https://matplotlib.org/basemap/users/intro.html)

1-1. Principes de base du fond de carte

Tout d'abord, utilisez conda pour installer la ligne de base.

$ 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()
#Spécifiez la plage pour dessiner la carte.
m = Basemap(llcrnrlat=30, urcrnrlat=50, llcrnrlon=125, urcrnrlon=150) #Créer une instance de fond de carte
#Soustrayez la latitude et la longitude tous les 10 degrés. La deuxième option définit où placer l'étiquette en haut, en bas, à gauche et à droite.
m.drawparallels(np.arange(-90, 90, 10), labels=[ True,False, True, False]) #Ligne Latitude
m.drawmeridians(np.arange(0, 360, 10), labels=[True, False, False, True]) #Ligne longitudinale
m.drawcoastlines() #Bordure
plt.show()

image.png

1-2. Paramètres de carte détaillés

Vous pouvez également modifier de manière flexible la résolution de la carte et la méthode de projection. (Il existe de nombreux paramètres détaillés ...)

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 Basse résolution Résolution moyenne Haute résolution
Projection cylindrique à distance régulière image.png image.png image.png
Projection de Mercator image.png image.png image.png
Projection de Lambert image.png image.png image.png

Au fait, la valeur par défaut lorsque rien n'est défini projection = 'cyl' (projection cylindrique à distance normale) resolution = 'c' (résolution grossière)

2. Méthode de visualisation des informations de localisation

2-1. Source des données

"Données de flux pseudo-humains" basées sur les données d'analyse SNS par le Center for Spatial Information Science, Université de Tokyo

Cette fois, j'aimerais utiliser les données de flux pseudo-humaines qui sont publiées gratuitement comme échantillon.

2-2. Structure des données

Lisez les données de flux pseudo-humains de la région du Kansai le 16 septembre 2013 et vérifiez le contenu.

import pandas as pd
df = pd.read_csv('./Kansai/2013_09_16.csv')
df

'''
Première colonne: ID utilisateur
Deuxième colonne: Estimation du sexe (1):Homme, 2:Femme, 0,3: inconnu, NA: non estimé)
3e colonne: date / heure (24 heures toutes les 5 minutes)
Quatrième colonne: Latitude
5ème colonne: longitude
6e rangée: catégorie résidente(Classement majeur)* Type de chaîne de caractères
7e rangée: catégorie résidente(Sous-catégorie)* Type de chaîne de caractères
8ème rangée: état(Rester ou bouger)* Type de chaîne de caractères
9e colonne: ID de la catégorie de résident(Correspond aux 6e et 7e lignes)
'''

Cette fois, nous ciblerons l'utilisateur en mouvement (STAY_MOVE == 'MOVE'). De plus, tout en divisant l'horodatage en heures et minutes, attribuez un rang à chaque utilisateur et à chaque heure et formatez-le sous une forme facile à gérer.

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. Définition de la valeur initiale du fond de carte et visualisation des informations de localisation

Maintenant, je vais visualiser les informations de localisation, mais je vais d'abord définir la carte que je considérerai comme la base cette fois. Il existe également des méthodes permettant de dessiner la carte d'arrière-plan d'ArcGIS et les frontières des préfectures et des villes, des villes et des villages, je vais donc les appliquer également.

Pour les frontières préfectorales et municipales, veuillez télécharger le Shapefile à partir de __ ici __. La structure des fichiers est la suivante.

-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


** Paramètre de carte initial **

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) #Frontière préfectorale
    m.readshapefile('./gadm/gadm36_JPN_2', 'prefectural_bound2', color='lightgray', linewidth=.5) #Frontière municipale
    m.arcgisimage(service='World_Street_Map', verbose=True, xpixels=1000, dpi=300)

image.png

** Si vous faites jusqu'à présent, vous pouvez tracer comme matplotlib. ** **

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) #Hommes en bleu
plt.scatter(tmp2['lon'],tmp2['lat'],color='r',s=0.5) #Femmes en rouge

Ici, seul le premier journal à 9 heures est tracé pour chaque utilisateur. 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')

Vous pouvez également modifier la taille de l'hexagrid avec quadrillage. image.png

3. Bonus

Par exemple, il est possible de multiplier les données météorologiques susceptibles d'affecter les déplacements des personnes. Soit dit en passant, le 16 septembre 2013 était le jour où le typhon est passé.

image.png out.gif
De l'Agence météorologique Écho radar maillé de 1 km

L'affichage vectoriel est également possible en calculant la vitesse et l'angle azimutal à partir des informations de position du point de départ et du point final. (Mis à part s'il y a une utilisation) out.jpeg

C'est tout! Jusqu'à la fin Merci d'avoir lu!

Recommended Posts

Visualisez les informations de localisation avec Basemap
Visualisez rapidement avec les pandas
Visualisez les réclamations avec l'IA
termux × AWS Envoyez des informations de localisation de smartphone à AWS avec l'IoT
Visualisons le fil 2ch avec WordCloud-Scraping-
Obtenir des informations avec l'API Zabbix
Visualisons la connaissance de Wikidata avec Neo4j
Obtenez des informations sur l'alambic avec Python
Obtenez des informations sur les fichiers vidéo avec ffmpeg-python
Visualisez l'arbre de décision avec le notebook Jupyter
Visualisez les dépendances des packages python avec graphviz
Obtenez des informations météorologiques avec Python et le grattage
Notifier LINE des informations de localisation (Google map) avec GPS Multi-Unit SORACOM Edition