Memilih semua file dalam direktori untuk digabung dalam QGIS Processing?


8

Saya sedang menulis skrip generik yang melibatkan penulisan shapefile ke direktori yang kemudian digabung bersama. Setelah menulis file ke folder Output , saya mencoba untuk mendapatkan saga: algoritma mergeshapeslayers untuk menggabungkan semua file di folder Output . Saya telah menggunakan Pembuat Model dan meskipun ini sangat membantu, saya menemukan bahwa itu digunakan untuk tujuan tertentu sedangkan saya mencoba membuat skrip untuk tujuan umum.

Kode:

##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
Maaf, tapi saya tidak tahu apa yang Anda coba lakukan. Apa itu Z? Apa yang function(Z)dilayani jika tidak mengembalikan apa pun? Apa perbedaan antara glob.glob(Z + './*.shp')dan glob.glob("*.shp")?
— gen

Terima kasih @ gen dan permintaan maaf, edit kode sehingga mudah-mudahan terlihat lebih baik. Untuk pemahaman saya yang terbatas, perbedaannya adalah yang glob.glob(path_1 + './*.shp')menentukan di mana file .shp berada; dan glob.glob("*.shp")mengambil nama file file .shp. Harap perbaiki saya jika saya salah.
— Joseph

Untuk mencoba menjadi lebih jelas tentang apa yang saya inginkan: Saya dapat menulis shapefile dari folder yang diberikan ke "C: \ Users \ Me \ Desktop \ Output \\". Saya kemudian ingin saga: mergeshapeslayers untuk menggabungkan semua file di folder Output itu. Kode untuk algoritma gabungan tidak benar dan ingin mengetahui solusi apa pun.
— Joseph

Jawaban:


5

Anda dapat menyederhanakan script tanpa menggunakan while...dan x, x+1: untuk sederhana daftar Python, itu akan lebih baik untuk menggunakan foratau daftar comprehensions :

##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)

Beberapa penjelasan:

#  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']

atau lebih baik dengan os.path.join(universal, 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

Sangat jelas, ringkas dan sangat membantu. Terima kasih banyak! Satu pertanyaan: Bukankah seharusnya baris 3 ##Result=output vector?
— Joseph

ya dan terima kasih, dikoreksi, tetapi ini adalah ide Anda (diadaptasi oleh saya)
— gen

Adaptasi Anda benar-benar mengajari saya, sangat dihargai :)
— Joseph

4

Menemukan jawabannya berkat @gene yang komentarnya membantu saya fokus pada area yang tepat. Hanya harus menggunakan glob untuk saga: fungsi mergeshapeslayers memanggil:

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

Menambahkan ini ke kode di atas yang sekarang menggabungkan semua file di folder.


bisakah Anda memperbaiki lekukan naskah Anda? Seperti yang diusulkan, itu tidak berhasil.
— gen

ok tapi Anda bisa menyederhanakan skrip Anda (lihat di bawah)
— gen

1
Kalau-kalau ada yang mengalami masalah yang sama seperti saya. saga: mergeshapeslayers tidak ditemukan, tetapi saga: mergelayers melakukan hal yang sama. Ini pada 2.12.1 (OS X 10.11.3).
— cmyk

@ cmyk - Terima kasih sobat, saya tidak menyebutkan dalam posting tapi itu adalah versi lama dari QGIS dan plugin Pemrosesan (saya pikir v2.2 untuk keduanya).
— Joseph
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.