Python
QGIS
PyQGIS

QGIS + Python その2

実行動作確認環境

  • Windows 7 64bit
  • QGIS 2.8.11

属性テーブルのフィールド(カラム・列)の追加

test.py
# -*- coding: utf-8 -*- 
from PyQt4.QtCore import QVariant 
layer=iface.activeLayer()

if layer is None :
    print(u'アクティブなレイヤが存在しません。')

layer.startEditing()
layer.dataProvider().addAttributes( [
    QgsField('TestString', QVariant.String),
    QgsField('TestInt',  QVariant.Int),
    QgsField('TestDouble', QVariant.Double)
    ] )
layer.updateFields()
layer.commitChanges()
  • from PyQt4.QtCore import QVariantQVariant.String のために必要
  • layer.startEditing() がなくとも動作する
  • 実行結果
    • Image1.png
  • 既に同名のフィールドが存在する場合もエラーにはならず、 TestString_1 のような名称でフィールドが追加される。
  • QgsFeature Class Reference @ QGIS API Documentation

地物(フィーチャ)の属性を設定

test.py
# -*- coding: utf-8 -*- 
from PyQt4.QtCore import QVariant 
layer=iface.activeLayer()

if layer is None :
    print(u'アクティブなレイヤが存在しません。')

attributeName='TestString'
layer.startEditing()
for feature in layer.getFeatures():
    feature[attributeName]='ABC'
    layer.updateFeature(feature)
layer.commitChanges()
  • 上記では、レイヤ上の全地物の TestStringフィールド値を ABC に設定(上書き)
  • feature[attributeName]='ABC' の代わりに、feature.setAttribute(attributeName, 'ABC') でもOK
  • QgsFeature Class Reference @ QGIS API Documentation

特定の属性条件に一致する地物(フィーチャ)を「式」を使って取得

  • ここでの「式」とは、式ビルダ(↓↓)で記述するような式のこと
    • Image2.png
test.py
# -*- coding: utf-8 -*- 
layer=iface.activeLayer()

if layer is None :
    print(u'アクティブなレイヤが存在しません。')

req = QgsFeatureRequest().setFilterExpression( u'"id" = \'A14_000_1234\'' )
features = layer.getFeatures( req )

attributeName='TestString'
layer.startEditing()
for feature in features:
    feature.setAttribute(attributeName, 'XYZ')
    layer.updateFeature(feature)
layer.commitChanges()
  • 上記は、id フィールド値が A14_000_1234 に一致する地物(フィーチャ)を取得した例

式の記述ルール

  • フィールド(カラム・列・属性)の名前は、ダブルクォーテーションで記述
  • フィールドの値(文字列)は、シングルクォーテーションで記述
    • ただし、フィールドの値が数値の場合は、そのまま記述する

特定の属性条件に一致する地物(フィーチャ)を選択状態にする

test.py
# -*- coding: utf-8 -*- 
layer=iface.activeLayer()

if layer is None :
    print(u'アクティブなレイヤが存在しません。')

req = QgsFeatureRequest().setFilterExpression( u'"TestInt" > 2000' )
features = layer.getFeatures( req )
layer.setSelectedFeatures([featur.id() for featur in features])
  • setSelectedFeatures() の引数には、featur の実体(インスタンス)リストではなく、featur の id リスト を設定する。
    • void QgsVectorLayer::setSelectedFeatures ( const QgsFeatureIds & ids )

レイヤ名からレイヤ実体を取得

test.py
# -*- coding: utf-8 -*- 

layerName = 'test lay01 Polygon'
layer = None
for layer_ in QgsMapLayerRegistry.instance().mapLayers().values():
    if layer_.name() == layerName:
        layer = layer_
        break

if layer is None :
    print(u'レイヤ「{0}」は存在しません。'.format(layerName))

関連投稿

参考資料