PyQGIS入門【QGISをPythonで自動化】
目次
PyQGISを使えば、QGISの操作をPythonで自動化できます。
繰り返し作業の効率化、バッチ処理、独自ツールの作成など、可能性が大きく広がります。
PyQGISとは
概要
PyQGIS は、PythonからQGISの機能を利用するためのAPIです。
できること:
- GIS操作の自動化
- バッチ処理(複数ファイルの一括処理)
- カスタムツールの作成
- プラグイン開発
- スタンドアロンアプリケーション開発
必要な知識
【必要な基礎知識】
・Python基礎(変数、ループ、関数)
・QGISの基本操作
【あると良い知識】
・オブジェクト指向プログラミング
・GISの基本概念(レイヤ、フィーチャ、属性)
Pythonコンソールの使い方
コンソールの起動
プラグイン → Pythonコンソール
または
Ctrl + Alt + P
画面構成
┌─────────────────────────────────────┐
│ エディタ(スクリプト編集) │
├─────────────────────────────────────┤
│ コンソール(対話式実行) │
│ >>> ここにコマンドを入力 │
└─────────────────────────────────────┘
最初のコード
コンソールに以下を入力してEnter:
print("Hello PyQGIS!")
出力:
Hello PyQGIS!
基本的な操作
プロジェクトの取得
# 現在のプロジェクトを取得
project = QgsProject.instance()
# プロジェクト名を取得
print(project.fileName())
ifaceオブジェクト
iface はQGISのインターフェースを操作するためのオブジェクトです。
# アクティブレイヤを取得
layer = iface.activeLayer()
print(layer.name())
# マップキャンバスを取得
canvas = iface.mapCanvas()
# メッセージを表示
iface.messageBar().pushMessage("完了", "処理が終わりました", Qgis.Info)
マップキャンバスの操作
# 現在の縮尺を取得
scale = iface.mapCanvas().scale()
print(f"現在の縮尺: 1:{scale:.0f}")
# 縮尺を設定
iface.mapCanvas().zoomScale(10000) # 1:10000
# 全体表示
iface.mapCanvas().zoomToFullExtent()
レイヤの操作
レイヤの読み込み
ベクターレイヤ:
# シェープファイルを読み込み
layer = QgsVectorLayer("path/to/file.shp", "レイヤ名", "ogr")
# レイヤが有効か確認
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
print("レイヤを追加しました")
else:
print("レイヤの読み込みに失敗しました")
ラスターレイヤ:
# GeoTIFFを読み込み
layer = QgsRasterLayer("path/to/file.tif", "ラスター")
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
レイヤの一覧取得
# すべてのレイヤを取得
layers = QgsProject.instance().mapLayers()
for layer_id, layer in layers.items():
print(f"{layer.name()} - {layer.type()}")
名前でレイヤを取得
# 名前でレイヤを検索
layers = QgsProject.instance().mapLayersByName("レイヤ名")
if layers:
layer = layers[0]
レイヤの情報取得
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()}")
フィーチャの操作
フィーチャの取得
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]}...")
特定のフィーチャを取得
# IDで取得
feature = layer.getFeature(1)
# フィルタで取得
request = QgsFeatureRequest().setFilterExpression('"name" = \'東京\'')
for feature in layer.getFeatures(request):
print(feature.attributes())
属性値の取得
for feature in layer.getFeatures():
# インデックスで取得
value = feature[0]
# フィールド名で取得
value = feature["name"]
print(value)
フィーチャの編集
layer = iface.activeLayer()
# 編集モード開始
layer.startEditing()
# 属性値を変更
layer.changeAttributeValue(feature.id(), 0, "新しい値")
# 変更を保存
layer.commitChanges()
# または取り消し
# layer.rollBack()
新しいフィーチャの追加
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から実行できます。
import processing
# バッファ処理
result = processing.run("native:buffer", {
'INPUT': layer,
'DISTANCE': 100, # メートル
'OUTPUT': 'memory:' # メモリ上に出力
})
# 結果をプロジェクトに追加
QgsProject.instance().addMapLayer(result['OUTPUT'])
利用可能なツールを検索
# ツール一覧を検索
for alg in QgsApplication.processingRegistry().algorithms():
if 'buffer' in alg.id().lower():
print(alg.id())
ツールのパラメータを確認
processing.algorithmHelp("native:buffer")
スクリプトの保存と実行
エディタの使用
1. Pythonコンソールの「エディタを表示」ボタン
2. コードを記述
3. 「スクリプトを実行」ボタン(または F5)
スクリプトの保存
ファイル → 名前を付けて保存
→ .py ファイルとして保存
外部スクリプトの実行
# 外部スクリプトを実行
exec(open('C:/scripts/my_script.py').read())
よくある使用例
例1: 複数シェープファイルの一括読み込み
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に出力
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: フィールド計算
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: 座標変換
# 座標変換の設定
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の基本
# よく使うオブジェクト
project = QgsProject.instance() # プロジェクト
iface # インターフェース
layer = iface.activeLayer() # アクティブレイヤ
# よく使う操作
layer.getFeatures() # フィーチャ取得
layer.startEditing() # 編集開始
layer.commitChanges() # 保存
processing.run() # 処理ツール実行
学習のステップ
1. Pythonコンソールで試す
2. 簡単な操作から始める
3. 少しずつ複雑な処理へ
4. スクリプトとして保存
5. プラグイン開発へ
参考・一次情報
- QGIS「PyQGIS Developer Cookbook」 — Pythonコンソール、プロジェクト、レイヤ、プラグイン等を扱うPyQGIS公式リファレンスです。
- QGIS「Using Vector Layers」 — フィーチャ取得・編集、属性操作、空間インデックス、ベクター出力の公式API例です。
- QGIS「Using processing algorithms from the console」 —
processing.run()、アルゴリズムID、パラメータ、出力の公式な使用方法です。
関連記事
お問い合わせ
PyQGISの活用についてのご相談は、お気軽にお問い合わせください。
最終更新: 2025年1月