PythonのBasemapライブラリが開発を終えて、以前からCartopyライブラリ(scitools.org.uk/cartopy/)に代わっていくことが告知されていたが、Basemapのアップデートに失敗してから紆余曲折の末、ようやくCartopyをインストール。
Python 2.7以降で動くが、Python 2xxも2020年でサポートを終えているので、
Python 3xxのconda環境でインストール。
conda install cartopy
以前はうまくいかなかったが、今回は無難。
Basemap同様、matplotlibライブラリを使って描画する。
とりあえず以下の「ベースマップづくり」のページと同じ(ような)地図を作ってみる。
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure(figsize=(10,10))
proj=ccrs.PlateCarree()
ax=plt.axes(projection=proj)
ax.set_extent((121.0, 151.0, 22.0, 48.0),proj)
PlateCarreeは正距円筒図法。
北緯22°-48°、東経121°-151°の範囲を描画。
ax.coastlines()
海岸線を描画。
大陸と海の色塗りはcartopy.featureを使う、ということで
import cartopy.feature as cfea
ax.add_feature(cfea.LAND,color='#9acd32')
ax.add_feature(cfea.OCEAN,color='#7fffd4')
経線・緯線はmatplotlib.tickerを使う、ということで
5°間隔で描画
import matplotlib.ticker as tck
gl=ax.gridlines(crs=proj,draw_labels=True)
gl.xlocator = tck.FixedLocator(np.arange(120,150,5))
gl.ylocator = tck.FixedLocator(np.arange(20,50,5))
draw_labels=True
でラベルを付けてくれる。
最後に
plt.show()
で完成。
地図はNatural Earth(www.naturalearthdata.com/)から必要な範囲だけダウンロードされるようで、オフラインだとエラーになる。
一度ダウンロードされればオフラインでもOK。
世界地図ならばデフォルトでも構わないが、日本地図は上のとおりなので、解像度 resolutionを「10m」にした。デフォルトは「110m」。
ax.coastlines(resolution='10m')
経線・緯線も途中までしか描かれていない。
以下のサイトに説明があって助かった。
matplotlib:cartopyのTIPS(ebcrpa.jamstec.go.jp/~yyousuke/matplotlib/cartopy.html ・・・ リンク切れ)
追)新URLは、yyousuke.github.io/matplotlib/cartopy.html
gl.xlocator=tck.FixedLocator(np.arange(120,160.1,5))
gl.ylocator=tck.FixedLocator(np.arange(20,50.1,5))
160.1、50.1とすれば隅まで描かれる。
Basemapよりも手ごわい。
色塗りがresolution「110m」のままなので海岸線とずれる。
気にしない気にしない……。
やっぱり気になる。
Basemapの上位互換ではないのか用途が違うのか……。
NaturalEarthFeatureで取り込む方法があるようだ。
ax.add_feature(cfea.LAND,color='#9acd32')
の部分を
land_h = cfea.NaturalEarthFeature('physical', 'land', '10m')
ax.add_feature(land_h,color='#9acd32',edgecolor='k')
に変更。edgecolorは輪郭の色(黒)。
同様に湖沼 lakesも描画。
海はダウンロードに時間がかかったので「50m」にした。
lakes_h = cfea.NaturalEarthFeature('physical', 'lakes', '10m')
ax.add_feature(lakes_h,color='aqua',edgecolor='k')
ocean_h = cfea.NaturalEarthFeature('physical', 'ocean', '50m')
ax.add_feature(ocean_h,color='#7fffd4')
追)oceanの後にlandを描くようにしないとlandの輪郭が上塗りで消えてしまう
ついでに経線・緯線をlinestyleとcolorの指定で黒の点線に変更。
gl=ax.gridlines(crs=proj,linestyle=':',color='k',draw_labels=True)