পাইকিজিআইএস ফাইলের লকগুলি ছেড়ে দিচ্ছেন?


16

আমি ভাবছিলাম যে পাইকিজিআইএস-এ ফাইল লকগুলি প্রকাশের ট্রিগার করে?

আমি কল করে কয়েকটি ডেটা উত্স (অস্থায়ীভাবে ব্যবহৃত) মুছে ফেলার চেষ্টা করছি QgsVectorFileWriter.deleteShapeFile, তবে এটি করার আগে আমাকে কিউজিআইএস ছাড়তে হবে। আমি QgsVectorLayer বস্তুগুলিতে উত্সগুলি লোড করেছি। আমি উত্সটি মুছতে পারার আগে এই সমস্ত অবজেক্ট এবং সেগুলির উল্লেখগুলি আবশ্যক আবর্জনা সংগ্রহ করা উচিত? এটি জোর করার কোন উপায় আছে?


আমি ব্যর্থ হয়েছে এমন একটি ন্যূনতম কোড নমুনা তৈরি করতে পরিচালিত করেছি। টেম্প দির চালানোর আগে খালি রয়েছে তা নিশ্চিত করুন।

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."

আমি দেখতে পেয়েছি যে যদি আমি প্রসেসিং অ্যালগরিদমের পরিবর্তে QgsVectorFileWriterতৈরি করতে ব্যবহার করি তবে এটি কাজ করে layer2qgis:clipঅ্যালগরিদম চেষ্টা করলে আমি একই ত্রুটি পেয়েছি । সুতরাং এটি প্রক্রিয়াজাতকরণ মধ্যে একটি বাগ হয়? আমি কি এটি ভুল ব্যবহার করছি?

উত্তর:


9

আমার নিজের প্রশ্নের উত্তর দেওয়া চালিয়ে যাওয়ার জন্য দুঃখিত, তবে আমি মনে করি আমি একটি সমাধান পেয়েছি।

দেখা যাচ্ছে যে, আপনি মানচিত্রের রেজিস্ট্রিতে স্তরটি যুক্ত করুন এবং এটি আবার সরিয়ে ফেললে এটি ভাল কাজ করে। মানচিত্রের রেজিস্ট্রি স্তরটির মালিকানা গ্রহণ করে, তাই এটি যখন রেজিস্ট্রি থেকে মুছে ফেলা হয়, তখন লকগুলি মুক্ত করা হয়। নোট করুন যে আপনাকে লেজেন্ডটি লেজেন্ডে যুক্ত করতে .addMapLayer(layer, addToLegend = Falseহবে ( ) কাজ করবে না)।

এখনও এটিকে সমাধান বা কার্যকারিতা হিসাবে অভিহিত করা হবে কিনা তা নিশ্চিত নয় তবে এটি কাজটি করে।

# ...

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

কারও কাছে আরও তথ্য থাকলে আমি এই সম্পর্কে আরও জানতে পেরে খুশি হব।


আমাকে এই জাতীয় দুটি স্তর মুছতে হবে ... উপরের পদ্ধতিটি ব্যবহার করে আমি একটি মুছতে সক্ষম হয়েছি .. দ্বিতীয়টির .dbf এবং .shp ব্যতীত অন্য সমস্ত ফাইল মুছে ফেলা হচ্ছে .. এই দুটি ফাইল মোছার কোনও সমাধান আছে কি? যেমন?
রাও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.