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

ASAHI Kosuke asahi @ hcc.co.jp
2015年 5月 20日 (水) 22:58:36 PDT


飯島さま

ちゃんと実行して試してないのですが、こんな感じかなと思います

#新しいカラムを作る
for i in range(0, len(files)):
   vlayer = QgsVectorLayer(files[i], "temp", "ogr")
   vlayer.startEditing()
   caps = vlayer.dataProvider().capabilities()
   if caps & QgsVectorDataProvider.AddFeatures:
     vlayer.dataProvider().addAttributes([QgsField("AREA",QVariant.Double)])
     vlayer.updateFields()
     idx = vlayer.fieldNameIndex("AREA")

     for f in vlayer.getFeatures():
       vlayer.changeAttributeValue(f.id(), idx, 
round(f.geometry().area(), 3))

   vlayer.commitChanges()

On 2015/05/21 14:34, Hayato IIJIMA wrote:
> 朝日様、皆様
>
> 山梨県の飯島です。ご検討ありがとうございます。
>
>>> AttributeError: 'QgsVectorLayer' object has no attribute 'updataFields'
>>
>> updataFiledsになってますね。
>> 綴りあってますかね?
> 大変失礼いたしました。修正しました。
>
> ただ、スペルを修正して実行したところ、エラーは出ないのですが、やはり空のAREAカラムが作られるだけのようです。AREAカラムに計算した面積を入れられるといいのですが。
>
> 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")
> for f in vlayer.getFeatures():
> print f.geometry().area()
>
> #新しいカラムを作る
> for i in range(0, len(files)):
> vlayer = QgsVectorLayer(files[i], "temp", "ogr")
> caps = vlayer.dataProvider().capabilities()
> if caps & QgsVectorDataProvider.AddFeatures:
> res = vlayer.dataProvider().addAttributes([QgsField("AREA",  QVariant.Double)])
> vlayer.updateFields()
>
>
>
>>
>>
>> On 2015/05/21 13:53, Hayato IIJIMA wrote:
>>>
>>> 朝日様、皆様
>>>
>>> 山梨県の飯島です。ご検討ありがとうございます。
>>>
>>>>    vlayer.dataProvider().addAttributes([QgsField("AREA",
>>>> QVariant.Double)])
>>>> のあとに
>>>>    vlayer.updateFields()
>>>> 入れるとどうでしょう?
>>>
>>> 以下のようなエラーが出てきてしまいました。何かimportしないといけないのかも?
>>> Traceback (most recent call last):
>>>     File "<input>", line 6, in <module>
>>> AttributeError: 'QgsVectorLayer' object has no attribute 'updataFields'
>>>
>>>> 久保さん
>>>
>>>
>>> プロセシングを教えていただき、ありがとうございました。これ、ファイルの読み込みは1個1個クリックしないとできないんですよね?まとめて選択できると便利なのですが。
>>>
>>>
>>>
>>>
>>>>
>>>> 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 mailing list
>>>> OSGeoJapan-discuss @ lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss
>>>
>>>
>>>
>>>
>>
>>
>> --
>> 北海道地図株式会社 研究開発課
>> 朝日 孝輔
>> mailto:asahi @ hcc.co.jp
>> Tel : 0166-62-4711
>>
>
>
>


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



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