日々適当
hibitekitou

cartopyを入れる

pc |2019-11-26

matplotlibでどう敗北してか書いてなかったので。

衛星写真を変形したかったのです。で、画像処理だけでいけたらいいなと。

地図をプロットする際に使うツールとしてbasemapが有名だったのだけど、どうも開発終了しててcartopyに移行する流れであるとどこかのサイトに書いてありました。それらツールを使うと衛星写真も各種図法に変形できるらしいことがネットに書かれています。
あ、cartopyってのはイギリス気象局によって開発されているオープンソースライブラリの一部だそうです。
Catalina環境にはbasemap環境を構築していなかったので、せっかくなのでcartopyを入れようかなと思いました。けれどもちょっと面倒なようです。
ちなみに、Catalina環境にはPython3とHomebrewがインストールされているものとします。

PRO4.Jというライブラリが必要だそうです。いろいろ参考にした結果

  1. git clone https://github.com/OSGeo/proj.4.git
  2. cd proj.4/
  3. git checkout -b 4.9.0 tags/4.9.0
  4. make
  5. make install

でとりあえず入ったようです。4.9.0より新しいバージョンありそうだけど(調べたら4.9.3が最後。現行最新は6.2.1らしいけど4が必要らしい)。
あとは主に

Pythonで地理情報のマッピング!cartopy使ってみた [Qiita]

を参考に、

  1. brew install geos
  2. pip3 install shapely cartopy --no-binary shapely --no-binary cartopy
  3. pip3 install matplotlib
  4. pip3 install scipy

これで

Using cartopy with matplotlib — cartopy 0.15.0 documentation

ここにあるコードが動作するようになりました。

と言う事でここから本題。やりたいことは正距円筒図法の一部が切り取られた画像を別の図法の画像にしたいということです。NASAが配布しているG.Projectorというツールでそれが可能なのですが、このツールはJava 8を要求し、OracleがJavaのランタイムの無償利用を打ち切ったために使いづらくなっちゃったのよね。ということもあり、なんとかならんものかとやり始めてみたわけですが。

左の画像(正距円筒図法)が右になりました。このサイズで見るとうまくいっているように見えなくはないですが、一部を拡大しますと下図のようになります。

左がオリジナル画像、右が変形結果。明らかに画質が劣化しすぎています。これをどうやっても解消することができなかったのですね。で、諦めて3DCGソフトでグリッドを歪める簡易的な変形にとどめることにしました(とはいえメッシュ分割を十分に細かくすれば、それなりの精度は出るはず…)

ちなみに、画像を変形して任意の図法に変形するのではなく、単純に海岸線や国境線などの線を取得する場合には今回の環境構築の結果はとても有用なはずですから、完全に無駄ではなかったと思えるような活用の仕方が今後できればいいですなぁ。

import matplotlib.pyplot as plt
import cartopy.crs as ccrs

north = [ 45.523015 , 141.936587 ] #宗谷岬
#east= [ 43.385437 , 145.817579 ] #納沙布岬
east = [ 45.509032 , 148.893014 ] #択捉島
south= [ 24.045030 , 123.791862 ] #波照間島
west= [ 24.449230 , 122.932030 ] #与那国島
akashi = [ 34.0 + 39.0/60.0, 135.0  ] #明石
img_extent =  ( west[ 1 ], east[ 1 ], south[ 0 ], north[ 0 ] )  #画像の緯度経度の範囲
plt.figure(  figsize=( 12., 9.))

proj = ccrs.LambertConformal( central_longitude=akashi[1] , central_latitude=akashi[0] , standard_parallels=(30,60) ) #ランベルト正角円錐図法
latlon_proj = ccrs.PlateCarree() # 緯度経度の処理用:正距円筒図法
#proj = ccrs.Mercator() #: メルカトル図法
#proj = ccrs.Orthographic( central_longitude=akashi[1] , central_latitude=akashi[0] ) # : 正射方位図法

ax = plt.axes( projection = proj )
ax.coastlines( resolution='10m' )
ax.set_extent( img_extent ,  latlon_proj )

plt.show()

コメント ( 0 )|Trackback ( 0 )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。
数字4桁を入力し、投稿ボタンを押してください。