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
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)
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()
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 | |||
Projection de Mercator | |||
Projection de Lambert |
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)
Cette fois, j'aimerais utiliser les données de flux pseudo-humaines qui sont publiées gratuitement comme échantillon.
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
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)
** Si vous faites jusqu'à présent, vous pouvez tracer comme matplotlib. ** **
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) #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.
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')
Vous pouvez également modifier la taille de l'hexagrid avec quadrillage.
Visualisez la distribution des fréquences en superposant la distribution des précipitations
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é.
De l'Agence météorologique | Écho radar maillé de 1 km |
Visualisez la vitesse de déplacement et la direction d'une personne
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)
C'est tout! Jusqu'à la fin Merci d'avoir lu!
Recommended Posts