waigani's diary

QGISを中心にFOSS4Gをいじくる

QGISでベクトルデータを表示してみる その2

ベクトルレイヤーを表示出来たとして、各featureへのアクセスを行いたい。

単純に考え付いたのがこれ。
feature数をfor文の条件にして、IDをキーにfeatureを持ってきて、属性の最初のカラムの内容を表示する。

l = qgis.utils.iface.activeLayer()
for i in range(l.featureCount()):
  l.featureAtId(i,feat)
  att = feat.attributeMap()
  print att[0].toString()

これでも出来なくはないですが、途中でfeature数いじったりする場合は都合悪いですね。
PyQGIS Developer CookBookを見てても出てるのは下記みたいな方法です。
selectのところが肝でしょうか。下記では属性でもって全てのfeatureを対象とするようにしていますが、範囲なんかでも指定出来ます。

provider = l.dataProvider()

feat = QgsFeature()

allAttrs = provider.attributeIndexes()

provider.select(allAttrs)

while provider.nextFeature(feat):
  att = feat.attributeMap()
  print att[0].toString()

各featureにアクセス出来たとして、変更の方法がイマイチわかってにないです。
属性の変更については、IDとカラムを指定して書き換えれるようです。

l.startEditing()
l.changeAttributeValue(0,0,"test")
l.commitChanges()

編集モードに切り替わって、

属性を置き換えて、

編集モードを戻します。

startEditing()をしない状態で、属性の置き換えをしようとするとfalseが返ってきます。

とりあえずここまで。