waigani's diary

QGISを中心にFOSS4Gをいじくる

QGIS プロセッシング Scriptsを使いたい その3

指定したフィールドのみ残したベクトルファイルの作成

簡単なスクリプトをもう1つ。
行っている処理としては、

  • 入力としてベクトルファイルを受け取る(inputに入力ファイル名が入る)
  • 入力ベクトルレイヤから、残したいフィールド名を1つだけ受け取る(fieldNameに入る)
  • processing.getobject()でファイル名→QgsVectorLayer
  • 残したいフィールドの定義だけ抜き出し、出力ファイルに設定するたまにQgsFieldsを用意
  • 残したいフィールド以外は、名前をリストに入れておく、後で削除用に使用
  • processingのVectorWriterクラスを利用してベクトルファイル作成
  • 入力ベクトルレイヤの図形要素に順次アクセス
  • 要らないフィールドは削除した状態で、出力ベクトルファイルへ追加

というものです。

from qgis.core import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from processing.core.VectorWriter import VectorWriter

##[Test scripts]=group
##input=vector
##fieldName=field input
##output=output vector

vectorLayer = processing.getobject(input)
provider = vectorLayer.dataProvider()
fields = provider.fields()
newFields = QgsFields()
newFields.append(fields.field(fieldName))

deleteFields = []
for field in fields:
  if field.name() != fieldName:
    deleteFields.append(field.name())

writer = VectorWriter(output, provider.encoding(), newFields, provider.geometryType(), vectorLayer.crs())

features = vectorLayer.getFeatures()
for feature in features:
  for deleteField in deleteFields:
    feature.deleteAttribute(provider.fieldNameIndex(deleteField))
  writer.addFeature(feature)

del writer

追記 2014.7.24
QGIS2.4では、processing.getobject()がprocessing.getObject()になっているので注意!!

id,nameの2つのフィールドを持ったベクトルデータがあったとして、

スクリプトを実行して、nameのみを残すことを選択します。

実行結果として、フィールドnameのみ残されたベクトルレイヤが作成されます。

processingで用意されているクラス

ラスタファイルを作成するのに使用したRasterWriter、ベクトルファイルを作成するのに使用したVectorWriterはprocessingで用意されたクラスになります。

 QGISインストールディレクトリ/python/plugins/processing/core

以下に様々なファイルがありますので覗いてみましょう。
RasterWriterが入っているRasterWriter.py、VectorWriterが入っているVectorWriter.pyともに短いソースですので内容を確認してみることをお勧めします。引数として何を渡していたかも、すぐにわかると思います。