【Python】 ベースマップ Cartopyの導入

MAP(地図)

 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)
スポンサーリンク
ふシゼン
タイトルとURLをコピーしました