はじめに
気象データを Python を使って地図とともに可視化するためには、matplotlib と cartopy を使うことが一般的です。Intel Macでの環境構築については、「Intel Macでmatplotlib+cartopyの環境構築」という記事で既に解説しました。
ここではApple M1チップを搭載したMacでの環境構築について説明します。環境については以下の通りです。
- OS: macOS Big Sur 11.2
- チップ: Apple M1
Homebrew
まずはHomebrewのインストールから説明します。公式サイトにアクセスし、書かれているコマンドを実行します。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
こちらの環境では実行すると
Error: Fetching /opt/homebrew failed!
Failed during: /opt/homebrew/bin/brew update --force --quiet
というエラーメッセージが出ました。
しかし、~/.zshrc
に以下のようにパスを設定し、source ~/.zshrc
で読み込み直した後、brew update
するとエラーは出ないようなので、特に問題はなさそうです。
export PATH="/opt/homebrew/bin:$PATH"
export LD_LIBRARY_PATH="/opt/homebrew/lib:$LD_LIBRARY_PATH"
ここでPATH
はbrew
コマンドを使うために必要になります。LD_LIBRARY_PATH
が設定されていない場合、後にプログラムの実行時にライブラリが見つからずエラーになります。
バージョンは3.1.4がインストールされました。
$ brew --version
Homebrew 3.1.4
Homebrew/homebrew-core (git revision a469d3bb2a; last commit 2021-04-29)
バージョン3.0.0から公式にHomebrewがApple Siliconをサポートするようになりました(公式アナウンス)。今インストールされたのは、Rosetta 2を使わないM1ネイティブ対応版になります。Intel版との主な違いは、インストール先が/opt/homebrew
に変更されたことと、まだM1未対応のformulaeが存在することです。
wget
をインストールして、ひとまず先に進みます。
brew install wget
Miniforge
Pythonのパッケージ管理や仮想環境の作成にはAnacondaやMinicondaがよく使われますが、これは残念ながらM1 Macには現在対応していません。その代わりに、Miniforgeと呼ばれるM1 Macに対応したディストリビューションを使います。基本的にMinicondaと同じように、conda
コマンドが使えます。
公式ページにあるインストーラをダウンロードし実行します。
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
bash Miniforge3-MacOSX-arm64.sh
ちなみに、試していませんが、brew install miniforge
でもインストールできるようです。
Cartopy用の環境構築
ここではcartopy-env
という名前の仮想環境をPython 3.9をベースに作成することにします。
conda create -n cartopy-env python=3.9
conda activate cartopy-env
Cartopy以外でよく使うパッケージをconda
で先にインストールしておきます。
conda install -c conda-forge numpy scipy xarray netcdf4 matplotlib
Intel Macの場合は、conda install -c conda-forge cartopy
でインストールできたわけですが、conda-forge の cartopy は osx-arm64 に対応していないため、conda
コマンドではインストールできません。
そこでCartopyの公式サイトを参照しつつ、ソースからビルドすることになります。
まず、依存するパッケージを先にインストールします。
brew install proj geos
brew link proj
pip install --upgrade pyshp
pip install shapely --no-binary shapely
その後、pip
でcartopyをインストールするのですが、環境変数CFLAGS
でコンパイルオプションを指定しないと、エラーになります。
export CFLAGS="-I/opt/homebrew/include -L/opt/homebrew/lib"
pip install cartopy
この状態でPythonでimport cartopy
をしてみると、ImportErrorが出ることがあります。
>>> import cartopy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/__init__.py", line 96, in <module>
import cartopy.crs
File "/opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/crs.py", line 36, in <module>
from cartopy._crs import (CRS, Geodetic, Globe, PROJ4_VERSION,
ImportError: dlopen(/opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/_crs.cpython-39-darwin.so, 2): Library not loaded: @rpath/libproj.22.dylib
Referenced from: /opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/_crs.cpython-39-darwin.so
Reason: image not found
/opt/homebrew/lib/
を見てみると、libproj.19.dylib
とlibproj.dylib
は見つかりますが、libproj.22.dylib
がないようです。
同様のissueはすでに上がっており、対処方法として最も手っ取り早いのは/opt/homebrew/lib/
でlibproj.22.dylib
のシンボリックリンクを作成することです。
ln -s libproj.dylib libproj.22.dylib
最後に、以下のプログラムを実行し、日本付近の地図が描画されれば、正しくインストールされたことが確かめられます。
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import cartopy.crs as ccrs
import cartopy.feature as cfeature
land_50m = cfeature.NaturalEarthFeature(
'physical', 'land', '50m',
edgecolor='face',
facecolor=cfeature.COLORS['land'])
plt.figure()
ax = plt.axes(projection=ccrs.Mercator())
ax.set_extent([120, 150, 20, 50], ccrs.PlateCarree())
ax.add_feature(land_50m)
ax.coastlines(resolution='50m', lw=0.5)
ax.gridlines(xlocs=mticker.MultipleLocator(10),
ylocs=mticker.MultipleLocator(10),
linestyle='-',
color='gray')
plt.savefig("mercator.png")