Chọn tất cả các tệp trong thư mục để hợp nhất trong Xử lý QGIS?


8

Tôi đang viết một kịch bản chung bao gồm viết shapefiles vào một thư mục sau đó được hợp nhất với nhau. Sau khi ghi các tệp vào thư mục đầu ra , tôi đang cố gắng lấy thuật toán saga: mergeshapeslayers để hợp nhất tất cả các tệp trong thư mục đầu ra . Tôi đã sử dụng Trình tạo mô hình và mặc dù nó rất hữu ích ở một mức độ nào đó, tôi thấy rằng nó được sử dụng cho các mục đích cụ thể trong khi tôi đang cố gắng tạo một kịch bản cho các mục đích chung.

Mã số:

##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
Xin lỗi, nhưng tôi không biết bạn đang cố gắng làm gì. Là Zgì? Gì function(Z)phục vụ nếu nó trả về gì? Sự khác biệt giữa glob.glob(Z + './*.shp')và là glob.glob("*.shp")gì?
gen

Cảm ơn @gene và lời xin lỗi, đã chỉnh sửa mã để hy vọng nó sẽ tốt hơn. Theo hiểu biết hạn chế của tôi, sự khác biệt là glob.glob(path_1 + './*.shp')xác định vị trí của các tệp .shp; và glob.glob("*.shp")tìm nạp tên tệp của tệp .shp. Xin hãy sửa tôi nếu tôi nhầm.
Joseph

Để cố gắng rõ ràng hơn những gì tôi muốn: Tôi có thể viết các shapefiles từ một thư mục đã cho vào "C: \ Users \ Me \ Desktop \ Output \\". Sau đó, tôi muốn saga: mergeshapeslayers hợp nhất tất cả các tệp trong thư mục đầu ra đó. Mã cho thuật toán hợp nhất là không chính xác và muốn biết bất kỳ giải pháp nào.
Joseph

Câu trả lời:


5

Bạn có thể đơn giản hóa kịch bản của bạn mà không sử dụng while...x, x+1: cho đơn giản danh sách Python, nó sẽ là tốt nhất để sử dụng forhoặc comprehensions danh sách :

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

Một số giải thích:

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

hoặc tốt hơn với os.path.join(phổ quát, 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

Rất rõ ràng, súc tích và vô cùng hữu ích. Cảm ơn rât nhiều! Một câu hỏi: Không phải là dòng 3 phải ##Result=output vectorkhông?
Giuse

vâng và cảm ơn, đã sửa, nhưng đó là ý tưởng của bạn (do tôi điều chỉnh)
gen

Sự thích nghi của bạn chắc chắn đã dạy tôi, rất cảm kích :)
Joseph

4

Tìm thấy câu trả lời nhờ @gene, những bình luận đã giúp tôi tập trung vào đúng lĩnh vực. Chỉ cần sử dụng global cho hàm saga: mergeshapeslayers để gọi:

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

Đã thêm mã này vào mã ở trên mà bây giờ sẽ hợp nhất tất cả các tệp trong thư mục.


bạn có thể sửa lỗi thụt lề của kịch bản của bạn, xin vui lòng. Theo đề xuất, nó không hoạt động.
gen

ok nhưng bạn có thể đơn giản hóa tập lệnh của mình (xem bên dưới)
gen

1
Chỉ trong trường hợp ai đó gặp phải vấn đề tương tự như tôi. saga: mergeshapeslayers không được tìm thấy, nhưng saga: mergelayers làm điều tương tự. Đây là vào ngày 2.12.1 (OS X 10.11.3).
cmyk

@cmyk - Cảm ơn bạn thân, tôi đã không đề cập đến trong bài đăng nhưng đó là phiên bản cũ của QGIS và plugin Xử lý (tôi nghĩ v2.2 cho cả hai).
Joseph
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.