pyQGIS入門

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コンソールで試す
  • 簡単な操作から始める
  • 少しずつ複雑な処理へ
  • スクリプトとして保存
  • プラグイン開発へ

関連記事

お問い合わせ

PyQGISの活用についてのご相談は、お気軽にお問い合わせください。

  • 自動化相談
  • スクリプト開発支援
  • プラグイン開発

お問い合わせはこちら

最終更新: 2025年1月