2. 解析環境の準備

FOSS4Gで解析しよう

衛星画像は位置情報をもつデータなので、地理情報システム(GIS)による解析が一般的です。GISソフトとしては商用ならArcGISやENVIやERDAS IMAGINEなど、非商用ならQGISやGRASSなどが有名ですが、今回はオープンソースでかつCUI操作が強力なGRASSを使ってみようと思います。GRASSのように、フリー・オープンソースなGISソフトのことを総称してFOSS4Gと言います。FOSS4Gで解析することのメリットですが、もちろん解析にかかるコストが抑制できるということもありますが、解析の透明性・再現性が確保しやすいという点があげられます。インターネット環境さえあれば、世界のどこでも誰でも、同様の解析が再現できるのです。

ただし、GRASS自体は機械学習機能が貧弱なため、データの前処理が終わった時点でPythonに読み込んで機械学習にかける、という流れでいきます [1]


GISの概念や、GRASSの基本的な使い方に慣れていない方は、公式チュートリアルのほか、筑波大・奈佐原先生のGIS入門や、大阪市立大・升本先生の講義が参考になります。使うのは、

あたりです。とはいえ、GRASSに慣れていない方もいらっしゃると思いますので、ここでは初期設定の仕方を解説しておきます。初期設定がGRASS最初の難関だと思いますので。初期設定さえできれば、写経に支障ありません。


GRASSの準備

linux環境を想定していますので、コンソールから次のコマンドを打って、GRASSを立ち上げましょう:

右のようなGUIウインドウが立ち上がればOKです。

環境によってはgrass70とうつ必要があるかもです。また、Windowの場合はスタートからGRASSを起動すれば、同様のGUIと、linuxシェルライクなコンソールが一緒に立ち上がると思います。

さて、初期設定はこのGUIの指示にしたがって進みます。まず

1. Select GRASS GIS database directory.

ですが、これはGRASSに読み込まれたデータや地理情報が格納される一番おおもとのディレクトリです。デフォルトではカレントディレクトリになっていると思いますので、好きなディレクトリ名に変えてください。筆者の場合は~/Downloads以下にLULCというディレクトリを作りました。

続いて

2. Select GRASS Location

に移りましょう。GRASSではデータと地理情報が3重の入れ子構造をもつディレクトリによって管理されます。先ほどのGIS databaseがおおもと、次にLocation、その下にMapsetと呼ばれるディレクトリが作られ、ひとつのプロセスがひとつのMapsetに対応します。ツリー構造になるので、ひとつのGIS databaseが複数のLocationを、ひとつのLocationが複数のMapsetを持つことができます。

さて、いまは新しいLocationを作っているところです。この階層に解析のデータム/投影法が割り当てられます。今回は、EPSG:4326 (wgs84, latlon) の解析環境を作りましょう。

Newをクリックしますと「データベースとロケーション名の設定」なるウィンドウが出てきます。プロジェクトロケーション(Location名)をlatlonとでもして次に進み、「新しいロケーションの作成方法」では「EPSGコードを指定」を選んで次に進みます。

日本語がやや面白い表示になっていますが気にせずいきましょう

EPSGコードが不明な場合は、「パラメータをリストから選択」を選ぶと、検索窓を使って調べることができますが、今回はいいでしょう。

で、「EPSGコード」画面が出てきますので、EPSGコード(4326)を入力します。出てきたものが求めるデータム/投影法かを確認し、次に進みます。

すると「データム変換方法の選択」というのが出てきます。ここでは測地系の変換パラメータ(WGS84からのずれ)を選択するのですが、すでにWGS84を使っているのでまああまり関係ありません。1を選択しておきましょう。0でも影響ないと思います。

OKを押すと、最終確認としてというウィンドウが出てきます。もしかしてと思いますが、Summaryのことでしょうか。要(かなめ)。AIによる翻訳技術の向上が望まれます。(2024.01追記→最近は気にならなくなりました)

確認して問題なければfinishを押します。以降、データの読み込みから、GIS解析、出力にいたる全てはこのデータム/投影法のもとで行われることになるので、よく意識しておきましょう。例えば今回作成したLocation以下で走るGRASS環境に、UTM座標系の地理データを読み込もうとすると、失敗します。投影法が異なるデータをひとつのLocationの中に読み込みたい場合は、あらかじめgdalや他のGISソフトで投影法を変換しておくか、GRASSの場合には

r.proj

というコマンドがあります。

さて最後は、

3. Select GRASS Mapset

に移ります。Mapsetは実際にデータが格納される作業場所です。例えばひとつの研究プロジェクトにつきひとつのMapsetを作っておけば、データの管理が楽ですよね。ほかにも、サーバを複数のユーザが共有して使っているような場合、ユーザごとにMapsetを作るのがいいでしょう。

新しいMapsetの作成はすぐにすみます。Newを押して「新しいマップセット名」にLULCと入力する、以上です。

ところで、Location (latlon) を作成した段階で、すでにPERMANENTというMapsetが勝手に作られていると思います。これはひとつのLocationにつき必ずひとつ作成される特別なPERMANENTで、中に読み込んだデータが、同じ階層にある全てのMapsetからデフォルトで参照できます[2]。また、Locationに割り当てたデータム/投影法の実体は、じつはPERMANENTディレクトリの中に格納されています(つまり消したらダメということです)。

さて、ようやく解析の準備が整いました。以降、GRASSを立ち上げるたびに、「どのGIS database, Location, Mapsetで解析するのか」を指定することになります。今回はもちろんいま作ったばかりの、latlon/LULCでGRASSを立ち上げましょう。

ちなみに、MapsetはPERMANENTで解析しても支障はないのですが、前述の通り彼は少々別格の存在といいますか、複数のMapsetをまたいだ共通のプラットフォーム(たとえば複数ユーザが共通して参照するデータを入れておくとか)と言った意味合いがあるので、筆者自身はあまりPERMANENTで直接解析を行うことはしません。

使いたいLocationとMapsetが選択されていることを確認し、「Start GRASS Session」を押します。

以下のようなウィンドウが立ち上がればOKです。GUIウィンドウからの操作が好みの方はそれも利用できますが、GRASSの真価はどちらかというと拡張されたlinuxシェルによるコマンド操作のほうにあるので、GUIは一旦閉じてしまってもかまいません。

Pythonの準備

PythonはGRASSほどやるべき準備はありませんが、いくつかライブラリが必要です。numpy, matplotlib, pandasあたりは流石にデフォルトで入ってると思いますが、sklearn(scikit-learn)は事前インストールが必要かもしれません。pip等で準備しておいてください。

次回はようやくデータの読み込みです。

初期設定が煩雑すぎてやる気がなくなったという説もありますかね

次章: データ準備と読み込み

[1] GIS処理自体、geopandasやgdal, rasterioなどのライブラリを読みこんでラスタをnumpyの配列にしてしまえばpythonでもできるので、気持ちのある人はすべてをpythonのみでこなすのもいいかと思います。若者はきっとGEEでGdriveやGcloudに出力したデータをGoogle Colabのpythonで処理したりするのでしょう。

[2] デフォルトで、と言ったのは、PERMANENTでなくても、同じ階層の他のマップセットのデータには変数名のうしろに「@マップセット名」とつければ参照できるので。