Phát hành khóa tập tin PyQGIS?


16

Tôi đã tự hỏi điều gì kích hoạt việc phát hành khóa tập tin trong pyQGIS?

Tôi đang cố gắng xóa một vài nguồn dữ liệu (được sử dụng tạm thời) bằng cách gọi QgsVectorFileWriter.deleteShapeFile, nhưng tôi phải thoát khỏi QGIS trước khi tôi có thể làm điều đó. Tôi đã tải các nguồn vào các đối tượng QssVectorLayer. Tất cả các đối tượng và tham chiếu đến chúng phải là rác được thu thập trước khi tôi có thể xóa nguồn? Có cách nào để buộc điều này?


Tôi đã quản lý để tạo một mẫu mã tối thiểu không thành công. Hãy chắc chắn rằng temp dir trống trước khi chạy.

from qgis.core import *
import processing, os, gc

project_temp_dir = "C:/Path/To/My/Dir/"      
layer1_path = project_temp_dir + "layer1.shp"
layer2_path = project_temp_dir + "layer2.shp"
input_layer = QgsMapLayerRegistry.instance().mapLayersByName('in_layer')[0]
if not input_layer.isValid(): raise Exception("Failed to grab input layer")

# Create layer 1
err = QgsVectorFileWriter.writeAsVectorFormat(input_layer, layer1_path, "utf-8", input_layer.crs())   
if err != QgsVectorFileWriter.NoError: raise Exception("Failed to write layer 1")

# Load layer 1
layer1 = QgsVectorLayer(layer1_path, "lyr1", "ogr")
if not layer1.isValid(): raise Exception("Failed to load layer 1")

# Use layer 1 to create layer 2, read-only makes no difference
# if not layer1.setReadOnly(): raise Exception("Could not set layer 1 to read-only")
processing.runalg("qgis:reprojectlayer", layer1, "EPSG:54030", layer2_path)

# Load layer 2
layer2 = QgsVectorLayer(layer2_path, "lyr2", "ogr")
if not layer2.isValid(): raise Exception("Failed to load layer 2")

del layer1
del layer2 
del input_layer
gc.collect()
print "Garbage: " + str(gc.garbage) # Empty

# Remove data sources for layers - FAILS!!
for f in os.listdir(project_temp_dir):          
    if f.endswith(".shp") and not os.path.isdir(project_temp_dir + f):              
        if not QgsVectorFileWriter.deleteShapeFile(project_temp_dir + f):
            # F*%&ing locks. 
            print "Failed to clear project temp directory."

Tôi thấy rằng nó hoạt động nếu tôi sử dụng QgsVectorFileWriterđể tạo layer2, thay vì thuật toán xử lý. Tôi nhận được lỗi tương tự nếu thử qgis:clipthuật toán. Vì vậy, đây có phải là một lỗi trong xử lý? Tôi đang sử dụng nó sai?

Câu trả lời:


9

Xin lỗi để tiếp tục trả lời câu hỏi của riêng tôi, nhưng tôi nghĩ rằng tôi đã tìm thấy một giải pháp.

Khi nó bật ra, nó hoạt động tốt nếu bạn thêm lớp vào sổ đăng ký bản đồ, và sau đó loại bỏ nó một lần nữa. Sổ đăng ký bản đồ có quyền sở hữu lớp, vì vậy khi nó bị xóa khỏi sổ đăng ký, các khóa được giải phóng. Lưu ý rằng bạn phải thêm lớp vào chú giải ( .addMapLayer(layer, addToLegend = False) sẽ không hoạt động).

Vẫn không chắc nên gọi đây là một giải pháp hay một cách giải quyết, nhưng nó thực hiện công việc.

# ...

# Replace the following code (note: should do error checking on map registry functions):

# Load layer 1
layer1 = QgsVectorLayer(layer1_path, "lyr1", "ogr")
if not layer1.isValid(): raise Exception("Failed to load layer 1")
QgsMapLayerRegistry.instance().addMapLayer(layer1) #!!!!

# Use layer 1 to create layer 2  
processing.runalg("qgis:reprojectlayer", layer1, "EPSG:54030", layer2_path)

# Load layer 2
layer2 = QgsVectorLayer(layer2_path, "lyr2", "ogr")
if not layer2.isValid(): raise Exception("Failed to load layer 2")
QgsMapLayerRegistry.instance().addMapLayer(layer2) #!!!!

# Remove layer references
QgsMapLayerRegistry.instance().removeMapLayer(layer1.id()) #!!!!
QgsMapLayerRegistry.instance().removeMapLayer(layer2.id()) #!!!!

# Remove data sources for layers
for f in os.listdir(project_temp_dir):          
    if f.endswith(".shp") and not os.path.isdir(project_temp_dir + f):    
    # ...

Nếu bất cứ ai có thêm thông tin, tôi rất vui được tìm hiểu thêm về điều này.


tôi phải xóa hai lớp như vậy ... tôi có thể xóa một lớp bằng phương pháp trên .. tất cả các tệp khác ngoại trừ .dbf và .shp của lớp thứ hai đang bị xóa .. có giải pháp nào để xóa hai tệp đó không cũng?
rao
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.