QGIS処理でマージするためにディレクトリ内のすべてのファイルを選択しますか?


8

私は、シェープファイルをディレクトリに書き込んでから、それらをマージする一般的なスクリプトを書いています。ファイルを出力フォルダーに書き込んだ後、saga:mergeshapeslayersアルゴリズムを使用して、出力フォルダー内のすべてのファイルをマージしようとしています。私はモデルビルダーを使用しましたが、ある程度は役立ちますが、特定の目的で使用されているのに対して、一般的な目的でスクリプトを作成しようとしています。

コード:

##Test=name
##Select_folder=folder
##Result=output vector

import os
import glob

path_1 = Select_folder
path = path_1
os.chdir(path)

def function():

    output = glob.glob(path_1 + './*.shp')
    x = 0

    while output[x]:
        for fname in glob.glob("*.shp"):
            outputs_1 = processing.runandload("qgis:fieldcalculator", output[x], 'Number', 1, 10, 0, True, 1 , "C:\Users\Me\Desktop\Output\\"  + fname)
            multiple_0 = glob.glob("*.shp")
            x = x + 1

        if x + 1 > len(output):
            processing.runalg("saga:mergeshapeslayers", output[0], ";".join(multiple_0) , Result)
            break
        else:
            continue

if path_1:
    function()
else:
   pass

1
申し訳ありませんが、何をしようとしているのかわかりません。とは何Zですか。function(Z)それが何も返さない場合、サーブは何をしますか?違いは何であるglob.glob(Z + './*.shp')とはglob.glob("*.shp")
ジーン

@geneと謝罪に感謝し、うまくいけばより良く見えるようにコードを編集しました。私の限られた理解では、違いはglob.glob(path_1 + './*.shp').shpファイルの場所を定義することです。そして、glob.glob("*.shp")の.shpファイルのファイル名を取得します。間違えたら訂正してください。
ジョセフ

私が何を望んでいるかをより明確にするために:特定のフォルダーから "C:\ Users \ Me \ Desktop \ Output \\"にシェープファイルを書き込むことができます。次に、saga:mergeshapeslayersでその出力フォルダー内のすべてのファイルをマージします。マージアルゴリズムのコードが正しくなく、解決策を知りたい。
ジョセフ

回答:


5

あなたは使用せずに、スクリプトを簡素化することができますwhile...し、xx+1簡単なPythonのリストについては、それが使用するのが最善のようになります。forまたは、リストの内包表記

##Test=name
##Select_folder=folder
##Result=output vector

import os
import glob
# folder path of Result shapefile
path_res = os.path.dirname(Result)
# go to Select_folder
os.chdir(Select_folder)
# copy the shapefiles (you don't need to load the shapefiles, so use runalg)
for fname in glob.glob("*.shp"):
     outputs_1 = processing.runalg("qgis:fieldcalculator", fname, 'Number', 1, 10, 0, True, 1 , path_res  + "/"+ fname) 

# paths of the shapefiles in the Result folder with list comprehension
output = [path_res + "/"+ shp for shp in glob.glob("*.shp")]
# merge the shapefiles
processing.runalg("saga:mergeshapeslayers", output[0], ";".join(output) , Result)

いくつかの説明:

#  folder path of the Result shapefile # = path_res
print  os.path.dirname("/Users/Shared/test.shp")
/Users/Shared

# list comprehension
print [shp for shp in glob.glob("*.shp")]
['shape1.shp', 'shape2.shp',..., 'shapen.shp']
print [path_res + "/"+ shp for shp in glob.glob("*.shp")]
['/Users/Shared/shape1.shp', '/Users/Shared/shape2.shp', ...,'/Users/Shared/shapen.shp']

以上os.path.join(ユニバーサル、Windows、Linux、Mac OS X):

print [os.path.join(path_res, shp) for shp in glob.glob("*.shp")]
print [os.path.join(path_res, shp) for shp in glob.glob("*.shp")][0] # = output[0]
/Users/Shared/shape1.shp

非常に明確、簡潔、信じられないほど役に立ちます。どうもありがとうございました!1つの質問:3行目は想定されていませ##Result=output vectorんか?
ジョセフ

はい、ありがとうございます。修正しましたが、それはあなたのアイデアです(私が改作)
gene

あなたの適応は間違いなく私に教えてくれました、とても感謝しています:)
ジョセフ

4

@geneのおかげで答えが見つかりました。コメントは適切な領域に集中するのに役立ちました。単にsaga:mergeshapeslayers関数を呼び出すためにglobを使用する必要がありました:

multiple_0=glob.glob("*.shp")

これを上記のコードに追加し、フォルダー内のすべてのファイルをマージします。


スクリプトのインデントを修正できますか。提案されているように、それは機能しません。
遺伝子

[OK]をしかし、あなた(下記参照)スクリプトを簡素化することができます
遺伝子

1
誰かが私と同じ問題に遭遇した場合に備えて。saga:mergeshapeslayersは見つかりませんでしたが、saga:mergelayersは同じことを行います。これは2.12.1(OS X 10.11.3)でした。
cmyk 2016

@cmyk-バディに感謝します。投稿には触れませんでしたが、QGISの古いバージョンと処理プラグインでした(両方ともv2.2だと思います)。
ジョセフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.