趣味で計算流砂水理

趣味で計算流砂水理 Computational Sediment Hydraulics for Fun Learning

数値計算とか河川工学とかプログラミングのことを書いています

MENU

衛星画像planetで遊んでみる:天竜川河口付近

前回の記事(jupyter上で衛星画像ALOS/AVNIR2をバンド演算とか図化してみる - 趣味で計算流砂水理 )で取り扱った天竜川河口付近についてplanetで変化を見てみました。

過去記事(衛生画像planetで複列砂州の変化をレンダリングしてみた - 趣味で計算流砂水理 )の同じ複列砂州河道(釜無川)と比べると全然変化が無いですね。

画像を右クリックで再生を選択

大きいものはこちら


ちょっとマニアックな話を

上記の「変化がない」という意味は砂州の平面形状が変わらないだけで河床の土砂が動かないというわけではないです。 河床表層の土砂は出水中は動いており、平衡状態を形成しています。この平衡状態からずれる分が河道の平面形状を変化させています。 一般に平面形状の変化速度は一部の急流河川や局所を除くと非常にゆっくりであり、10年間隔くらいで川を見ないとよくわからないです。 ちなみに、出水中でも河床表層の土砂が動かなくなると草本類が繁茂し、さらに冠水頻度が下がると木本類が侵入して陸地化します。

参考として、地理院地図から1988-1990年(左)、1974-1978年(右)をみると大きく変化しているのがわかると思います。


これまでのplanetの関連記事です。

computational-sediment-hyd.hatenablog.jp

computational-sediment-hyd.hatenablog.jp

jupyter上で衛星画像ALOS/AVNIR2をバンド演算とか図化してみる

  • オープンデータの衛星画像ALOS/AVNIR2をjupyterバンド演算と図化をしてみました。
  • 下の絵はハードコピーですが実際は移動・拡大縮小が可能です。(実はこれが本質だったりします。webベースならインタラクティブなものを使いましょう = matplotlibやめましょう。)

f:id:SedimentHydraulics:20200504215045p:plain

  • 興味のある方は、nbviewerを参照下さい。

元データ

前処理

  • 元データは4バンド(赤、緑、青、近赤外線)が個別ファイルになっています。
  • 前処理は、1).対象領域でクリップ、2).4バンドを1ファイルを行ってます。出力ファイル名:tenryurivmouth.tif
  • コードはnbviewerを参照下さい。
  • データはgithubを参照下さい。

参考サイト

演算・レンダリング

  • レンダリングは、単バンドごと、バンド合成(トゥルーカラー、ナチュラルカラー、フォルスカラー)、ラスタ演算(NDVI)の3ケースで行っております。
  • 重要な部分は解説しますが、詳細なコードは、nbviewerを参照下さい。

モジュールを読み込む

  • このブログではお馴染みのhvplot, geoviewsと多次元配列処理の定番xarrayを入れます。
import hvplot
import hvplot.xarray
import geoviews as gv
import xarray as xr
import numpy as np

インプットファイルを読み込む

  • 前処理で作ったファイルをxarryに読み込む
d = xr.open_rasterio('tenryurivmouth.tif')

単バンドのレンダリング

こんな感じ

geomap = gv.tile_sources.EsriImagery
red   = geomap * d.isel(band=0).hvplot.image(x='x',y='y',by='band',cmap='reds',geo=True,frame_height=400,clim=(1,255)).options(title='red',colorbar=False,clipping_colors={'min':'transparent'})
green = geomap * d.isel(band=1).hvplot.image(x='x',y='y',by='band',cmap='reds',geo=True,frame_height=400,clim=(1,255)).options(title='green',colorbar=False,clipping_colors={'min':'transparent'})
blue  = geomap * d.isel(band=2).hvplot.image(x='x',y='y',by='band',cmap='reds',geo=True,frame_height=400,clim=(1,255)).options(title='blue',colorbar=False,clipping_colors={'min':'transparent'})
nir   = geomap * d.isel(band=3).hvplot.image(x='x',y='y',by='band',cmap='reds',geo=True,frame_height=400,clim=(1,255)).options(title='near-infrared',clipping_colors={'min':'transparent'})
red+green+blue+nir  

f:id:SedimentHydraulics:20200504215334p:plain

バンド合成・レンダリング

  • バンド合成はトゥルーカラー、ナチュラルカラー、フォルスカラーの3パターン。それぞれの定義はwikipediaを参照
  • バンド合成では各バンド値を最大値から最小値を引き伸ばすことによる正規化を行っています。
  • 元データの型はuintのため解析範囲外は0としてます。正規化処理を行う際に不都合のため、0をNaNに変化するトリッキーな方法を使っています。
dnan = d.where(d>0)
norm = lambda arr : (arr-np.nanmin(arr)) * 255/(np.nanmax(arr)-np.nanmin(arr))
val = np.array([norm(dnan.values[0]), norm(dnan.values[1]), norm(dnan.values[2]), norm(dnan.values[3])])
val = np.where(np.isnan(val), 0, val)
val = val.astype(np.uint8)
dnan.values = val
true    = dnan.isel(band=[0,1,2]).hvplot.rgb(x='x',y='y',z='value', bands='band',geo=True, frame_height=400).options(title='true color')
natural = dnan.isel(band=[0,3,1]).hvplot.rgb(x='x',y='y',z='value', bands='band',geo=True, frame_height=400).options(title='natural color')
false   = dnan.isel(band=[3,0,1]).hvplot.rgb(x='x',y='y',z='value', bands='band',geo=True, frame_height=400).options(title='false color')
true + natural + false

f:id:SedimentHydraulics:20200504215045p:plain

  • nbviewerには正規化しない場合の失敗例もあります。

ラスタ演算・レンダリング

  • ラスタ演算はNDVI : Normalized Difference Vegetation Indexのみ。定義はwikipediaを参照
dras= dnan.where(dnan>0)
b = dras.values
NDVI = (b[3] - b[0])/(b[3] + b[0]) 
NDVI = (NDVI+1)*255/2
NDVI = np.where(np.isnan(NDVI), 0, NDVI)
NDVI = NDVI.astype(np.uint8)

dd = xr.DataArray(NDVI 
                 , coords={'x':d['x'], 'y':d['y']}
                 , dims=['y', 'x']
                 , attrs= d.attrs ) 
geomap = gv.tile_sources.EsriImagery
geomap * dd.hvplot.image(x='x',y='y',cmap='PRGn',geo=True,frame_height=400,clim=(1,255)).options(title='NDVI', clipping_colors={'min':'transparent'})

f:id:SedimentHydraulics:20200504215507p:plain

動作環境

conda create -y -n sate python=3.7
conda activate sate
conda install -y -c conda-forge bokeh=1.4.0
conda install -y -c pyviz geoviews=1.7.0
conda install -y -c pyviz hvplot=0.5.2
conda install -y -c conda-forge rasterio=1.0.21

github

github.com

linux環境でpythonのgdalを使うときの注意点

GDALって

gdalとはosgeoの提供するオープンソースライブラリでジオメトリデータを処理するためには必須です。 基本的にはCLIですが、主要なGISソフトのバックエンドで動いています。

詳しくはWikipedia

python用のモジュールもあります。

GDAL python API 2.1で大きく記述方法が変更されて使いやすくなりました。 (Pythonから使いやすくなったGDAL 2.1がステキだ | giscience.jp参照、未だに古い記述方法で記載されているものが多いので気をつけて下さい。)

最新版は2020/4/28時点で3.0.4でステーブル版は2.3.3です。

linux環境でpythonのgdalを使うときの注意点

本題ですが、 linux環境の場合、gdal Warpを例にあげるとこんな感じになります。

import gdal
ds = gdal.Warp('warp_test.tif', infile, dstSRS='EPSG:4326',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)
ds = None

ポイントは2行目のds=~と3行目のds=Noneですが、このように記述しないと上手く動かないです。

ちなみにwindowsの場合、

import gdal
ds = gdal.Warp('warp_test.tif', infile, dstSRS='EPSG:4326',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)

でも、

import gdal
gdal.Warp('warp_test.tif', infile, dstSRS='EPSG:4326',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)

でも動きます。

なぜなのかわかりません。詳しい人教えて下さい。

参考サイト

gis - python: perform gdalwarp in memory with gdal bindings - Stack Overflow


なんとGoogle Colaboratoryには最初からgdalが入ってました。

近日Google Colaboratoryの記事を書きます。

Dockerでcondaの仮想環境をつくる

dockerでpython環境を作る場合はpipを使うことが多いですが、依存性を考えるとcondaを使いたいところです。

例えば私が愛用しているgeoviewsの公式 には、

GeoViews itself is also installable using pip, but to do that you will first need to have installed the dependencies of cartopy, or else have set up your system to be able to build them.

と記載されており、condaを使ったほうが良いです。

サンプルとして、minicondaをベースにpanelパッケージが使える仮想環境pyvizを作るdockerfileを示します。 (インストール方法は2020/4/16時点pyviz関連の不具合の解消法 - 趣味で計算流砂水理を参照)

FROM continuumio/miniconda3

RUN conda create -n pyviz python=3.7

# Make RUN commands use the new environment:
SHELL ["conda", "run", "-n", "pyviz", "/bin/bash", "-c"]

RUN conda run -n pyviz \
&& conda install -y -c conda-forge bokeh=1.4.0

RUN conda run -n pyviz \
&& conda install -y -c pyviz geoviews panel

ENTRYPOINT ["conda","run","-n","pyviz"]

解説すると、2行目の

RUN conda create -n pyviz python=3.7

で仮想環境pyvizを作ります。

普通に考えるとpyvizをactivateすれば良いですが、dockerfileの場合、RUNコマンド実行後に環境がbaseに戻ってしまいます。

そこで、次のようにbashコマンドやcondaコマンドを実行する場合に毎回pyviz環境を指定する必要があります。

SHELL ["conda", "run", "-n", "pyviz", "/bin/bash", "-c"]

RUN conda run -n pyviz \
&& conda install -y -c conda-forge bokeh=1.4.0

最後にENTRYPOINTを指定しておくとdocker run時にconda~を打つ必要がなくなります。

ENTRYPOINT ["conda","run","-n","pyviz"]

参考サイト

Anaconda の公式 Docker イメージがアクティベーションしないと使えなくなった件 - Qiita Activating a Conda environment in your Dockerfile

衛生画像planetで複列砂州の変化をレンダリングしてみた

衛星画像シリーズです。

流路がどんどん変動していく様子がよくわかります。

画像を右クリックで再生を選択

大きいものはこちら


過去記事は以下です。

computational-sediment-hyd.hatenablog.jp

docker備忘録

単なる備忘録です。これだけ読めば思い出します。

Dockerfileとdocker buildコマンドでDockerイメージの作成 (1/2):いまさら聞けないDocker入門(3) - @IT

Dockerイメージとコンテナの削除方法 - Qiita

Dockerコンテナの作成、起動〜停止まで - Qiita

Docker、ボリューム(Volume)について真面目に調べた - Qiita

[docker] コンテナを一括削除 - Qiita

初心者による初心者のためのDocker入門 その1 dockerコマンド編 - Qiita

herokuでDockerを使う

使用頻度が低くすぐにわすれるので備忘録として

よく使う人はheroku cliを使ったほうが良いですが、忘れてしまうのでguiでの操作を基本とします。

Herokuアカウントは作成済みとします。

基本作業

  • Heroku dashbordから「Create new app」よりアプリを作成する。
  • 「Depoy」タブの「Deployment method」からアプリの管理方法を選択。私はGithubを使うためリポジトリを設定しconnect

スタックの種類を変更

dockerを使うためにはスタックの種類を変更する必要があります。ここだけはheroku cliが必要です。

heroku cliのインストールは各々の環境で異なりますので 公式(The Heroku CLI | Heroku Dev Center)を参照下さい。

私の環境windows10のWSL ubuntsuの場合は、python3+bottleで作成したDockerコンテナをherokuへデプロイ(windows10のWSL環境) | Tech Memoを参照しました。

以下のコマンドによりスタックをcontainerに変更する。

heroku login
# ブラウザが起動して認証画面が表示される
heroku stack:set container -a <App name>

アプリケーションの準備

Dockerで動かすため、当然Dockerfileが必要ですが、デプロイをマニュフェストを記述するHeroku.ymlも必要になります。(毎回コマンドを打っても大丈夫です)

Heroku.ymlの最小構成はこんな感じです。

build:
  docker:
    web: Dockerfile
run:
  web: command

注意点はDockerfileにCMDを書いた場合は、Herokuのrunは上書きされて無効になります。

詳細は以下を参照下さい。

Building Docker Images with heroku.yml | Heroku Dev Center How to deploy Synchronizer Docker Container in Heroku? – Split Help Center 【和訳】heroku.yml - Build Manifest (Developer Preview) - Qiita

デプロイ

Herokuのブラウザに戻って、「Depoy」タブの「Manual deploy」から「Deploy Branch」で完了。

「Depoy」タブの「Automatic deploys」をEnableに設定することによりgithubにpush時に自動でデプロイされる。

デプロイの状況は「Activity」タブで確認できる。

アプリの起動

画面右上の「Open app」ボタンでアプリを起動。動作のログは右上「More」ボタンはView logsから確認できる。