実行動作確認環境
- 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 QVariant
はQVariant.String
のために必要 -
layer.startEditing()
がなくとも動作する - 実行結果
- 既に同名のフィールドが存在する場合もエラーにはならず、
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
特定の属性条件に一致する地物(フィーチャ)を「式」を使って取得
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))