[OSGeoJapan-discuss] QGISのpythonコンソールで面積を計算してその結果を列に加える方法

ASAHI Kosuke asahi @ hcc.co.jp
2015年 5月 20日 (水) 21:30:07 PDT


飯島さま

みなさんがいい方法答えてしまった後ですが。

 vlayer.dataProvider().addAttributes([QgsField("AREA",  QVariant.Double)])
のあとに
 vlayer.updateFields()
入れるとどうでしょう?

On 2015/05/21 8:48, Hayato IIJIMA wrote:
> OSGeoメーリングリストの皆様
> 
> 山梨県の飯島と申します。このたびはお世話になります。
> 
> QGISのpythonコンソールで、SHPファイル(添付したようなファイル)のポリゴンごとの面積を計算する方法をご存知でしたら、ご教示いただければと思います。
> 
> ファイルが1つであればSHPファイルを開き、「属性テーブルを開く」→「フィールド計算機」で新しい列を作りその値として計算した面積を入れればいい話です。しかし、このようなファイルが多数ある場合、GUIによる作業は時間がかかるため、pythonで一気に処理できないかと思っています。
> 
> ネット上でQGISのpythonでの処理方法をいろいろ調べてみて、面積を計算して単に表示するとか、新しい列を作るといったことはできるのですが、面積を計算してその結果を新しい列に加えるということがどうしてもできないのです。
> 
> from PyQt4.QtCore import *
> from qgis.analysis import *
> input_dir="C:/..." #作業するSHPファイルまでのパス
> import os
> import glob
> import processing
> files = glob.glob(os.path.join(input_dir, r'*.shp'))
> 
> #面積を「表示」
> for i in range(0, len(files)):
> vlayer = QgsVectorLayer(files[i], "temp", "ogr")
> #Gmail上でタブによる字下げがうまくいきませんが、実際にはタブで行頭を字下げしています(以下同様)。
> for f in vlayer.getFeatures():
> print f.geometry().area()
> 
> #新しい列を加える
> #カラムを加える(試行錯誤)
> for i in range(0, len(files)):
> vlayer = QgsVectorLayer(files[i], "temp", "ogr")
> #Gmail上でタブによる字下げがうまくいきませんが、実際にはタブで行頭を字下げしています(以下同様)。
> caps = vlayer.dataProvider().capabilities()
> if caps & QgsVectorDataProvider.AddFeatures:
> res = vlayer.dataProvider().addAttributes([QgsField("AREA",  QVariant.Double)])
> 
> これらを合わせるとうまくいきそうな気もしますが、今のところできていません。
> ちなみに、作業環境は以下のようです。
> 
> OS: Win7 64 bit
> QGIS: 2.8
> 
> 調査に出ているためご教示いただいた後の返事が遅くなるかもしれませんが、よろしくお願い致します。
> 
> 
> 
> 
> _______________________________________________
> OSGeoJapan-discuss mailing list
> OSGeoJapan-discuss @ lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
> 


-- 
北海道地図株式会社 研究開発課
朝日 孝輔
mailto:asahi @ hcc.co.jp
Tel : 0166-62-4711



OSGeoJapan-discuss メーリングリストの案内