自由に使える白地図・ベースマップを求めてPython Basemapに辿り着き、トラブルでBasemapが使えなくなった後、Leaflet、GISソフト QGIS等をいじって、只今、Python Cartopy。
※ Cartopyは要Python 3
Cartopyをインストールしたのは1年ほど前だが、Jupyterを使い始めてから使用頻度増加。
基本的には以前のBasemapと同じ。
いくつか異なる点もあるが、一度地図を表示させることができれば、あとはコピー&ペーストで使い回しできる。
※ 地形データの読み込みに時間がかかるので、気長に待つか、再度Runボタン(実行ボタン)を押してみる
地図描画&プロット
以下、使い回し部分(日本地図の場合)。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(10,10))
ax=plt.axes(projection=ccrs.PlateCarree())
ax.set_extent((121.0,150.0,22.0,48.0),ccrs.PlateCarree())
import cartopy.feature as cfea
ocean_h = cfea.NaturalEarthFeature('physical', 'ocean', '50m')
ax.add_feature(ocean_h,color='#7fffd4')
land_h = cfea.NaturalEarthFeature('physical', 'land', '10m')
ax.add_feature(land_h,color='#9acd32',edgecolor='grey')
lakes_h = cfea.NaturalEarthFeature('physical', 'lakes', '10m')
ax.add_feature(lakes_h,color='aqua',edgecolor='grey')
緯度、経度の範囲や色などは適当に変更。
※ 範囲が大きいと解像度「10m」では読み込みに時間がかかる。
landとlakesの輪郭の色 edgecolorを黒からグレーに変えてみた。
日本語フォントを使う場合、以下も追加。
import matplotlib
font={'family':'IPAexMincho'}
matplotlib.rc('font',**font)
IPAexMincho
の部分は適当に変更。
一番最後に出力部分。出力ファイル名は適当に変更。
plt.savefig("20210224.png")
plt.show()
以上、コピ&ペ部分。
プロットは、
ax.plot(経度,緯度,…)
で、マーカー。
ax.text(経度,緯度,…)
で、テキスト。重ならないよう適当に調整。ちょっと面倒。
ax.plot(139.4497,36.3402,'ro',markersize='12')
ax.text(139.9,36.3402,'足利',color="purple",fontsize='20')
ax.plot(139.2758,35.7880,'ro',markersize='12')
ax.text(137.0,35.7880,'青梅',color="purple",fontsize='20')
ax.plot([経度1,経度2],[緯度1,緯度2],…)
で、線引き。
ax.plot([139.6722,130.9597],[35.2813,33.9411],'b-',linewidth=2)
ax.text(139.6722,34.5,'yokosuka',color="blue",fontsize='15')
ax.text(130.0,33.0,'moji',color="blue",fontsize='15')
Basemapでは、
map = Basemap(projection='merc',…)
xpt,ypt = map(lon,lat)
で、経度、緯度をメルカトル図法 merc
の座標に変換してからplot()
に入れていたが、
Cartopy(の正距円筒図法 PlateCarree
)ではそのまま。
いっぱいプロット
いっぱいプロットしたい場合、一行一行ax.plot()
を並べるよりもCSVファイルなどのデータファイルを読み込んで一括処理したほうが楽。
例えば、気象庁データなどから以下のような表を作って、202102wind.csvというファイルに保存した場合、
kansokujo | Latitude | Longitude | wind16_1 | wind16_2 |
宗谷岬 | 45.52 | 141.935 | 38.8 | 西南西 |
稚内 | 45.415 | 141.6783333 | 27.3 | 西南西 |
礼文 | 45.305 | 141.045 | 29.7 | 西南西 |
・ | ||||
・ | ||||
・ |
CSVファイルを作業ディレクトリ(デフォルトはホーム)に置いてから
pandasライブラリのread_csv()で、CSVファイルを読み込むと
import pandas as pd
pwind = pd.read_csv('202102wind.csv',index_col=0)
pwind(変数名は任意)に表データが格納される。
あとは……。
とりあえず今回は、16方位あるうち東西南北4方位の風について<、>、^、vのマーカーでプロット。
wind270 = pwind[pwind['wind16_2']=='東']
lat270 = wind270['Latitude'].tolist()
lon270 = wind270['Longitude'].tolist()
wind90 = pwind[pwind['wind16_2']=='西']
lat90 = wind90['Latitude'].tolist()
lon90 = wind90['Longitude'].tolist()
wind180 = pwind[pwind['wind16_2']=='北']
lat180 = wind180['Latitude'].tolist()
lon180 = wind180['Longitude'].tolist()
wind360 = pwind[pwind['wind16_2']=='南']
lat360 = wind360['Latitude'].tolist()
lon360 = wind360['Longitude'].tolist()
ax.plot(lon90,lat90,">",markersize=8)
ax.plot(lon180,lat180,"v",markersize=8)
ax.plot(lon270,lat270,"<",markersize=8)
ax.plot(lon360,lat360,"^",markersize=8)