PyQGISを使えば、QGISの操作をPythonで自動化できます。
PyQGIS入門【QGISをPythonで自動化】
繰り返し作業の効率化、バッチ処理、独自ツールの作成など、可能性が大きく広がります。
PyQGISとは
概要
PyQGISは、PythonからQGISの機能を利用するためのAPIです。
できること
- GIS操作の自動化
- バッチ処理(複数ファイルの一括処理)
- カスタムツールの作成
- プラグイン開発
- スタンドアロンアプリケーション開発
必要な知識
【必要な基礎知識】 ・Python基礎(変数、ループ、関数) ・QGISの基本操作 【あると良い知識】 ・オブジェクト指向プログラミング ・GISの基本概念(レイヤ、フィーチャ、属性)
Pythonコンソールの使い方
コンソールの起動
起動方法
- プラグイン → Pythonコンソール
- または Ctrl + Alt + P
画面構成
┌─────────────────────────────────────┐ │ エディタ(スクリプト編集) │ ├─────────────────────────────────────┤ │ コンソール(対話式実行) │ │ >>> ここにコマンドを入力 │ └─────────────────────────────────────┘
最初のコード
コンソールに以下を入力してEnter:
python
print("Hello PyQGIS!")
出力: Hello PyQGIS!
基本的な操作
プロジェクトの取得
python
# 現在のプロジェクトを取得
project = QgsProject.instance()
# プロジェクト名を取得
print(project.fileName())
ifaceオブジェクト
ifaceはQGISのインターフェースを操作するためのオブジェクトです。
python
# アクティブレイヤを取得
layer = iface.activeLayer()
print(layer.name())
# マップキャンバスを取得
canvas = iface.mapCanvas()
# メッセージを表示
iface.messageBar().pushMessage("完了", "処理が終わりました", Qgis.Info)
マップキャンバスの操作
python
# 現在の縮尺を取得
scale = iface.mapCanvas().scale()
print(f"現在の縮尺: 1:{scale:.0f}")
# 縮尺を設定
iface.mapCanvas().zoomScale(10000) # 1:10000
# 全体表示
iface.mapCanvas().zoomToFullExtent()
レイヤの操作
レイヤの読み込み
ベクターレイヤ:
python
# シェープファイルを読み込み
layer = QgsVectorLayer("path/to/file.shp", "レイヤ名", "ogr")
# レイヤが有効か確認
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
print("レイヤを追加しました")
else:
print("レイヤの読み込みに失敗しました")
ラスターレイヤ:
python
# GeoTIFFを読み込み
layer = QgsRasterLayer("path/to/file.tif", "ラスター")
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
レイヤの一覧取得
python
# すべてのレイヤを取得
layers = QgsProject.instance().mapLayers()
for layer_id, layer in layers.items():
print(f"{layer.name()} - {layer.type()}")
名前でレイヤを取得
python
# 名前でレイヤを検索
layers = QgsProject.instance().mapLayersByName("レイヤ名")
if layers:
layer = layers[0]
レイヤの情報取得
python
layer = iface.activeLayer()
# 基本情報
print(f"名前: {layer.name()}")
print(f"タイプ: {layer.type()}")
print(f"CRS: {layer.crs().authid()}")
# ベクターレイヤの場合
if layer.type() == QgsMapLayerType.VectorLayer:
print(f"フィーチャ数: {layer.featureCount()}")
print(f"ジオメトリタイプ: {layer.geometryType()}")
フィーチャの操作
フィーチャの取得
python
layer = iface.activeLayer()
# すべてのフィーチャをループ
for feature in layer.getFeatures():
# ID
print(f"ID: {feature.id()}")
# 属性
print(f"属性: {feature.attributes()}")
# ジオメトリ
geom = feature.geometry()
print(f"ジオメトリ: {geom.asWkt()[:50]}...")
特定のフィーチャを取得
python
# IDで取得
feature = layer.getFeature(1)
# フィルタで取得
request = QgsFeatureRequest().setFilterExpression('"name" = \'東京\'')
for feature in layer.getFeatures(request):
print(feature.attributes())
属性値の取得
python
for feature in layer.getFeatures():
# インデックスで取得
value = feature[0]
# フィールド名で取得
value = feature["name"]
print(value)
フィーチャの編集
python
layer = iface.activeLayer()
# 編集モード開始
layer.startEditing()
# 属性値を変更
layer.changeAttributeValue(feature.id(), 0, "新しい値")
# 変更を保存
layer.commitChanges()
# または取り消し
# layer.rollBack()
新しいフィーチャの追加
python
layer = iface.activeLayer()
layer.startEditing()
# 新しいフィーチャを作成
feature = QgsFeature(layer.fields())
# ジオメトリを設定
point = QgsGeometry.fromPointXY(QgsPointXY(139.7671, 35.6812))
feature.setGeometry(point)
# 属性を設定
feature.setAttribute("name", "新しい地点")
# レイヤに追加
layer.addFeature(feature)
# 保存
layer.commitChanges()
処理ツールの実行
processingモジュール
QGISの処理ツールをPythonから実行できます。
python
import processing
# バッファ処理
result = processing.run("native:buffer", {
'INPUT': layer,
'DISTANCE': 100, # メートル
'OUTPUT': 'memory:' # メモリ上に出力
})
# 結果をプロジェクトに追加
QgsProject.instance().addMapLayer(result['OUTPUT'])
利用可能なツールを検索
python
# ツール一覧を検索
for alg in QgsApplication.processingRegistry().algorithms():
if 'buffer' in alg.id().lower():
print(alg.id())
ツールのパラメータを確認
python
processing.algorithmHelp("native:buffer")
スクリプトの保存と実行
エディタの使用
1. Pythonコンソールの「エディタを表示」ボタン 2. コードを記述 3. 「スクリプトを実行」ボタン(または F5)
スクリプトの保存
保存方法
- ファイル → 名前を付けて保存
- .py ファイルとして保存
外部スクリプトの実行
python
# 外部スクリプトを実行
exec(open('C:/scripts/my_script.py').read())
よくある使用例
例1: 複数シェープファイルの一括読み込み
python
import os
folder = "C:/data/shapefiles"
for filename in os.listdir(folder):
if filename.endswith(".shp"):
filepath = os.path.join(folder, filename)
layer_name = os.path.splitext(filename)[0]
layer = QgsVectorLayer(filepath, layer_name, "ogr")
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
print(f"追加: {layer_name}")
例2: 全レイヤをGeoPackageに出力
python
output_path = "C:/output/all_layers.gpkg"
for layer_id, layer in QgsProject.instance().mapLayers().items():
if layer.type() == QgsMapLayerType.VectorLayer:
# GeoPackageに追加
options = QgsVectorFileWriter.SaveVectorOptions()
options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer
options.layerName = layer.name()
QgsVectorFileWriter.writeAsVectorFormatV3(
layer,
output_path,
QgsCoordinateTransformContext(),
options
)
print(f"出力: {layer.name()}")
例3: フィールド計算
python
layer = iface.activeLayer()
layer.startEditing()
# 面積を計算してフィールドに設定
field_index = layer.fields().indexOf("area")
for feature in layer.getFeatures():
area = feature.geometry().area()
layer.changeAttributeValue(feature.id(), field_index, area)
layer.commitChanges()
print("面積計算完了")
例4: 座標変換
python
# 座標変換の設定
source_crs = QgsCoordinateReferenceSystem("EPSG:4326")
dest_crs = QgsCoordinateReferenceSystem("EPSG:6677")
transform = QgsCoordinateTransform(source_crs, dest_crs, QgsProject.instance())
# 点を変換
point = QgsPointXY(139.7671, 35.6812)
transformed = transform.transform(point)
print(f"変換後: {transformed.x()}, {transformed.y()}")
まとめ
PyQGISの基本
python
# よく使うオブジェクト
project = QgsProject.instance() # プロジェクト
iface # インターフェース
layer = iface.activeLayer() # アクティブレイヤ
# よく使う操作
layer.getFeatures() # フィーチャ取得
layer.startEditing() # 編集開始
layer.commitChanges() # 保存
processing.run() # 処理ツール実行
学習のステップ
5ステップ
- Pythonコンソールで試す
- 簡単な操作から始める
- 少しずつ複雑な処理へ
- スクリプトとして保存
- プラグイン開発へ
関連記事
