LoginSignup
11

More than 5 years have passed since last update.

QGIS + Python その2

Last updated at Posted at 2020-10-11

実行動作確認環境

  • 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))

関連投稿

参考資料

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11