QGIS + Python その2

# 実行動作確認環境
- Windows 7 64bit
- QGIS 2.8.11

# 属性テーブルのフィールド（カラム・列）の追加

```Python: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()` がなくとも動作する
- 実行結果
    - ![Image1.png](https://qiita-image-store.s3.amazonaws.com/0/152805/ab94b573-3468-ffc0-ae86-3e3c5e3fc049.png)
- 既に同名のフィールドが存在する場合もエラーにはならず、 `TestString_1` のような名称でフィールドが追加される。
- [QgsFeature Class Reference](http://qgis.org/api/2.18/classQgsFeature.html) @ QGIS API Documentation

# 地物（フィーチャ）の属性を設定

```Python: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](http://qgis.org/api/2.18/classQgsFeature.html) @ QGIS API Documentation

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

- ここでの「式」とは、式ビルダ（↓↓）で記述するような式のこと
    - ![Image2.png](https://qiita-image-store.s3.amazonaws.com/0/152805/d3f08197-28b9-62e4-36bc-944435265a61.png)


```Python: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` に一致する地物（フィーチャ）を取得した例

## 式の記述ルール

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

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

```Python: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 ) `

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

```Python: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))
```

# 関連投稿

- [Python+GIS その1](http://qiita.com/code0327/items/3ce49cfa6dfaaf488da7)

# 参考資料

- [QGISプログラミング入門 2016Osaka編](http://waigani.hatenablog.jp/entry/2016/01/31/133014)
- [GIS Stack Exchange](https://gis.stackexchange.com/)
- [QGIS API Documentation 2.18](http://qgis.org/api/2.18/annotated.html)
- [Getting Started With Python Programming](http://www.qgistutorials.com/en/docs/getting_started_with_pyqgis.html)