はじめに
QGIS(Quantum GIS)は、地理情報システム(GIS)のためのオープンソースソフトウェアです。QGIS は、多様な地理空間データの作成、表示、解析を可能にし、ユーザーに豊富なツールセットを提供します。
この記事では、デジタル標高モデル(DTM)を使用して段彩図を作成する手順について解説します。まずは QGIS を使用した段彩図の作成手順を説明し、その後、同様の処理をPythonを使用して PyQGIS で実装する方法を紹介します。
段彩図は、地形の標高を色分けして視覚的に表現する地図の一種です。段彩図を使用することで、地形の高低差や傾斜の変化を簡単に把握することができます。
QGIS
段彩図の作成手順
QGIS でデジタル地形モデル(DTM)から陰影段彩図を作成する手順は以下の通りです。
1. DTM データの読み込み
2. 段彩図の作成
-
「入力ラスタ」には DTM データを選択し、「出力ファイル名」を指定します。
PyQGIS
PyQGIS を使って GeoTIFF 形式の DTM を読み込み、段彩図を作成して、結果を GeoTIFF 形式で出力する手順を以下に示します。
事前セットアップ
-
QGIS のインストール:PyQGIS は QGIS に含まれている Python ライブラリです。まずはじめに QGIS をインストールしておく必要があります。
-
Python スクリプトの準備:PyQGIS スクリプトを作成するために Python 環境が必要となります。
-
環境変数の設定: QGIS の Python ライブラリを使用するには、環境変数を設定する必要があります。QGIS のインストールディレクトリを
C:\Program Files\QGIS 3.34.6
とした場合の設定例を以下に示します。環境変数 設定例 Path C:\Program Files\QGIS 3.34.6\bin
C:\Program Files\QGIS 3.34.6\apps\qgis-ltr\bin
C:\Program Files\QGIS 3.34.6\apps\grass\grass83\bin
C:\Program Files\QGIS 3.34.6\apps\qt5\bin
C:\Program Files\QGIS 3.34.6\apps\Python312\Scripts
C:\Program Files\QGIS 3.34.6\apps\Python31PYTHONHOME C:\Program Files\QGIS 3.34.6\apps\Python312 PYTHONPATH C:\Program Files\QGIS 3.34.6\apps\qgis-ltr\python QGIS_PLUGINPATH C:\Program Files\QGIS 3.34.6\apps\qt5\plugins
C:\Program Files\QGIS 3.34.6\apps\qgis-ltr\qtpluginsQGIS_PREFIX_PATH C:\Program Files\QGIS 3.34.6\apps\qgis-ltr QGIS_PYTHON_PATH C:\Program Files\QGIS 3.34.6\apps\Python312\Lib\site-packages -
Python パッケージのインストール
pip install pyqt5
実装例
1. 必要なモジュールのインポート
from qgis.core import (QgsApplication,
QgsProject,
QgsRasterFileWriter,
QgsProcessingException)
from qgis.analysis import QgsRelief
import os
-
qgis.core.QgsApplication
: QGIS アプリケーションの初期化と終了に使用。 -
qgis.core.QgsProject
: QGIS プロジェクトの管理に使用。 -
qgis.core.QgsRasterFileWriter
: ラスタファイルの書き出しに使用 -
qgis.core.QgsProcessingException
: 処理例外を扱うために使用 -
qgis.analysis.QgsRelief
: DEM データから段彩図を生成するために使用
2. QGIS 環境の初期化
まず初めに setPrefixPath
で QGIS のインストールパスを設定します。
その後、QGIS アプリケーションのインスタンスを作成し (QgsApplication([], False)
)、QGIS アプリケーションの初期化を完了します (initQgis()
)。
QgsApplication.setPrefixPath(r"C:\Program Files\QGIS 3.34.6", True) # QGIS のインストールパスを設定
qgs = QgsApplication([], False) # QGIS アプリケーションを初期化
qgs.initQgis() # QGIS アプリケーションの初期化を完了
3. プロジェクトの作成
QgsProject.instance()
で、QGIS プロジェクトのインスタンスを取得します。
project = QgsProject.instance()
4. 入力ファイルと出力ファイルのパス設定
入力ファイル (dem_path
) と出力ファイル (output_path
) の設定を行います。
また、後続の QgsRelief
で引数で利用するため、QgsRasterFileWriter.driverForExtension
を使い、出力ファイルの拡張子から GDAL ドライバ名 (outputFormat
) を取得しておきます。
dem_path = r"data\FG-GML-5338-04-DEM.tif"
output_path = r"data\DTM_relief.tif"
outputFormat = QgsRasterFileWriter.driverForExtension(os.path.splitext(output_path)[1]) # GTiff
GDAL ドライバ は、特定の地理空間データフォーマットを読み書きするためのモジュールであり、GDAL はこれらのドライバを提供するライブラリです。
QGIS は、GDAL を利用して、多種多様な地理空間データフォーマットの操作、変換、解析を行います。
5. 段彩図の生成
DEM ファイルから段彩図を生成するためのインスタンスを作成します。
relief = QgsRelief(dem_path, output_path, outputFormat)
6. 段彩の区分を自動的に生成
最適化された段彩区分を計算するよう、段彩区分を設定します。
reliefColors = relief.calculateOptimizedReliefClasses() # 最適化された段彩区分を計算
relief.setReliefColors(reliefColors)
7. z 係数の設定
z 係数(標高データの垂直倍率)を設定します。
relief.setZFactor(1.000000)
8. 頻度分布の出力
頻度分布を CSV ファイルとして出力したい場合は、以下の通り記載します。
relief.exportFrequencyDistributionToCsv(r"data\fd.csv")
9. ラスタ処理の実行
ラスタ処理を実行します。
relief.processRaster()
10. QGIS 環境の終了
QGIS アプリケーションを終了します。
qgs.exitQgis() # QGIS アプリケーションを終了
実行
ソースコードを実行すると、QGIS を起動することなく、段彩図(data\DTM_relief.tif
)を生成することができます。
参考:ソースコード全文
from qgis.core import (QgsApplication,
QgsProject,
QgsRasterLayer,
QgsRasterFileWriter,
QgsCoordinateReferenceSystem,
QgsProcessingException)
from qgis.analysis import QgsRelief
import os
# QGIS 環境の初期化
QgsApplication.setPrefixPath(r"C:\Program Files\QGIS 3.34.6", True) # QGIS のインストールパスを設定
qgs = QgsApplication([], False) # QGIS アプリケーションを初期化
qgs.initQgis() # QGIS アプリケーションの初期化を完了
# プロジェクトの作成
project = QgsProject.instance()
# DEMファイルのパス
dem_path = r"data\FG-GML-5338-04-DEM.tif"
# 出力ファイルのパス
output_path = r"data\DTM_relief.tif"
outputFormat = QgsRasterFileWriter.driverForExtension(os.path.splitext(output_path)[1]) # GTiff
# DEMファイルから段彩図を生成するためのインスタンスを作成
relief = QgsRelief(dem_path, output_path, outputFormat)
# 段彩の区分を自動的に生成
reliefColors = relief.calculateOptimizedReliefClasses() # 最適化された段彩区分を計算
relief.setReliefColors(reliefColors)
# z 係数
relief.setZFactor(1.000000)
## 頻度分布の出力
#relief.exportFrequencyDistributionToCsv(r"data\fd.csv")
# ラスタ処理を実行
res = relief.processRaster()
if res == 1:
raise QgsProcessingException('入力ファイルを開けません。(' + dem_path + ')')
elif res == 2:
raise QgsProcessingException('出力ファイルの GDAL ドライバを取得できません。')
elif res == 3:
raise QgsProcessingException('出力ファイルを作成できません。(' + output_path + ')')
elif res == 4:
raise QgsProcessingException('入力バンドを取得できません。')
elif res == 5:
raise QgsProcessingException('出力バンドを作成できません。')
elif res == 6:
raise QgsProcessingException('出力ラスタサイズが小さすぎます。')
elif res == 7:
print('処理がキャンセルされました。')
# QGIS 環境の終了
print('処理が完了しました。(' + output_path + ')')
qgs.exitQgis() # QGIS アプリケーションを終了