気候予測データの解析環境を構築する。その3-地理空間情報の処理環境を構築する。

はじめに

地理空間情報を扱うシステムをGIS(Geographic Information System)といいます。

GISは、地図や衛星画像などの空間データを管理・分析するためのシステムであり、気候変動予測シミュレーションの出力を地図上に表示したり、他の空間データと組み合わせたりすることで、気候変動の影響をより具体的に把握することができます。

本研究室では、オープンソースのソフトウェアとツールであるFOSS4G(Free and Open Source Software for Geospatial)を使っています。

FOSS4Gはオープンソースであり、コストをかけずに導入することができます。

QGISのインストール

本研究室では、地理空間情報の表示にQGISを使っています。

QGISオープンソースGISソフトウェアで、様々なフォーマットの地理空間情報を扱うことができます。

qgis.org

使い方は、「改訂版(Ver.3.22対応)業務で使うQGISVer.3 完全使いこなしガイド(通称鈍器!?)」に詳しく載っていますので、参照ください。

youtu.be

公式のドキュメントに沿ってインストールしていきましょう。

www.qgis.org

リモートデスクトップーコンソールの起動

WSL2ーUbuntuリモートデスクトップ接続し、コンソールを起動します。

cci-labo.hateblo.jp

ツールのインストール

インストールに必要なツールを入れます。

sudo apt update
sudo apt install gnupg software-properties-common

GPG鍵を入手

aptを使用してQGISパッケージをインストールする際に、パッケージの信頼性を保証するためにGPG鍵が必要です。

"wget"で入手しておきます。

sudo wget -O /etc/apt/keyrings/qgis-archive-keyring.gpg https://download.qgis.org/downloads/qgis-archive-keyring.gpg

QGISリポジトリの追加

aptがパッケージをインストールする際に参照するリポジトリのリストに、QGISリポジトリを追加します。

"/etc/apt/sources.list.d/"にファイル名:"qgis.sources"を作成し、編集する。

sudo nano /etc/apt/sources.list.d/qgis.sources

QGISリポジトリ設定を記入

Types: deb deb-src
URIs: https://qgis.org/debian
Suites: jammy
Architectures: amd64
Components: main
Signed-By: /etc/apt/keyrings/qgis-archive-keyring.gpg

”Ctrl-O”で編集内容を保存。 ”Ctrl-X”でnanoを終了できます。

QGISのインストール
sudo apt update
sudo apt install qgis qgis-plugin-grass

QGISの起動

「アプリケーション」→「教育」→「QGISデスクトップ」でQGISが立ち上がります。


地理情報ライブラリのインストール

本研究室では基本、pythonでデータ処理をしています。pythonには地理空間情報を扱うために様々なライブラリが用意されており、次のツールを使っています。

  • gdal : 地理空間情報フォーマットの変換ユーティリティです
  • sqlalchemy : PyhtonでPostGISなどの空間データベースを含むリレーショナルデータベースを扱うためのライブラリです
  • geopandas :  pandasオブジェクトで地理データを扱うためのライブラリです
  • cartpy : 地図上にデータを描くためのライブラリです

順にインストールしていきます。

gdalのインストール

前半の記事に従ってQGISをインストールすると、自動でインストールされます。 単独でインストールすることもできますが、QGISのインストールのほうがはるかに簡単です。

sqlalchemyのインストール

postgresqlPythonから扱うためのlibpq-devと、SQLiteデータベースのインターフェースであるsqlite3をインストールしてから、pip3でインストールします。 -

sudo apt install libpq-dev sqlite3
sudo pip3 install psycopg2 sqlalchemy


geopandasのインストール

GeoPandasの公式ページでは、GeoPandas とそのすべての依存関係をインストールするためにconda パッケージ マネージャーを使用することがお勧めされています。

geopandas.org

本研究室では、pip3からインストールしました。 (特に問題なくインストールできます。:QGISリポジトリを登録してあるので、依存関係でつまずかないのかも?)

sudo pip3 install geopandas

cartopyのインストール

libgeos-devをインストールしてからcartopyをインストールします。

sudo apt install libgeos-dev
sudo pip3 install cartopy


地理情報ライブラリのテスト

実際に動くか確認してみます。

まず、サンプルデータとして、国土地理院から公開されている地球地図日本のデータをダウンロードします。

www.gsi.go.jp

次の2つのファイルを入手して、ホームディレクトリに解凍しておきます。

  • 第2.2版ベクタ(2016年公開)‐ 全レイヤ : gm-jpn-all_u_2_2.zip
  • 第1.1版ラスタ(2006年公開)- 標高 : gm-jpn-el_u_1_1.zip

出典:国土地理院ウェブサイト(https://www.gsi.go.jp/kankyochiri/gm_jpn.html)

ここでは、C:\Users\hoge\gm-jpnに解凍しました。※hogeはユーザー名です

QGISに読み込むとこんな感じになります。

Jupyterの対話型ウインドウを起動

実行結果がすぐ出力される、VSCodeの”Jupyter:対話型ウインドウ”を使います。

cci-labo.hateblo.jp

テスト1

PyGDALでgeotiffを読み込んでみる。

from osgeo import gdal, gdalconst
import matplotlib.pyplot as plt

gtif = gdal.Open("/mnt/c/Users/kazuh/gm-jpn/gm-jpn-el_u_1_1/jpn/el.tif",gdalconst.GA_ReadOnly)
garr = gtif.GetRasterBand(1).ReadAsArray()

plt.imshow(garr)

スト2

sqlalchemyを使ってsqliteデータベースにアクセスしてみる。

以下を参考に、行政界データからSpatiaLiteデータベースを作成。

docs.qgis.org

QGISに行政界データ(polbnda_jpn.shp)を読み込んでおく。

「polbnda_jpn」を右クリック→「エクスポート」→「新規ファイルに地物を保存」

保存形式の設定。

  • 形式: SpatiaLite
  • ファイル名:/mnt/c/Users/hoge/gm-jpn/gm_jpn.sqlite
  • レイヤ名:polbnda_jpn
  • CRS:EPSG:4326 - WGS 84

OKをクリック。

gm_jpn.sqliteデータベースのpolbnda_jpnテーブルを読み込む。

from sqlalchemy import create_engine 
import pandas as pd

engine = create_engine('sqlite:////mnt/c/Users/hoge/gm-jpn/gm_jpn.sqlite', echo=True)

df = pd.read_sql_query("SELECT * FROM polbnda_jpn",con=engine)

df

テスト3

GeoPandasでShapeファイルを読み込んでみる。

import geopandas as gpd

gdf = gpd.read_file("/mnt/c/Users/hoge/gm-jpn/gm-jpn-all_u_2_2/polbnda_jpn.shp")

gdf

テスト4

cartpyで日本地図を描いてみる。

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

## 50m resolution
plt.figure()
ax1 = plt.subplot(projection=ccrs.PlateCarree())
ax1.coastlines(resolution='50m')
ax1.set_extent([120,150,20,50], ccrs.PlateCarree())
ax1.set_title('50m coastline')
plt.show()

動きましたか? 今回はここまで。次回はDocker-wgrib2環境を構築していきます。