কিউজিআইএস প্রসেসিং / এসএক্সটিএনটিইটি সহ ইন-মেমরি ভেক্টর স্তর ব্যবহার করে


10

আমি qgis:clipকনসোল থেকে অ্যালগরিদম চালানোর চেষ্টা করছি , তবে ওভারলে প্যারামিটার হিসাবে ইন-মেমোরি স্তরটি ব্যবহার করার সময় একটি ত্রুটি পাচ্ছি। এটি কি প্রত্যাশিত হবে, বা আমি কিছু ভুল করছি?

কোড:

mem_layer = QgsVectorLayer("Polygon?crs=epsg:4326", "temp_layer", "memory")
if not mem_layer.isValid(): raise Exception("Failed to create memory layer")            
mem_layer_provider = mem_layer.dataProvider()

clip_polygon = QgsFeature()
clip_polygon.setGeometry(QgsGeometry.fromRect( 
    QgsRectangle(
        self.output_layer.extent().xMinimum() + 10,
        self.output_layer.extent().yMinimum() + 10,
        self.output_layer.extent().xMaximum() - 10,
        self.output_layer.extent().yMaximum() - 10
    )
))
mem_layer_provider.addFeatures([clip_polygon])
mem_layer.updateExtents()

output = self.output_layer_path + "2"
processing.runalg("qgis:clip", layer, mem_layer, output) # Fails

উপরের কোডে self.output_layerএবং layerভেক্টর স্তর অবজেক্টগুলি রয়েছে (কিউজেসভেেক্টর লাইয়ার - যথাযথগুলি, ডিস্কে শেপফাইল থেকে লোড করা), self.output_layer_pathএকটি পাথ সহ পাইথন স্ট্রিং অবজেক্ট।

আমি যে ত্রুটিটি পাচ্ছি তা এখানে:

"C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\GeoAlgorithm.py", line 150, in     
    execute self.processAlgorithm(progress)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\Clip.py", line 72, 
    in processAlgorithm index = utils.createSpatialIndex(layerB)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\algs\ftools\FToolsUtils.py", 
    line 31, in createSpatialIndex features = QGisLayers.features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 211, 
    in features return Features(layer)
File "C:/OSGEO4~1/apps/qgis/./python/plugins\processing\core\QGisLayers.py", line 218, 
    in __init__ self.iter = layer.getFeatures()
AttributeError: 'NoneType' object has no attribute 'getFeatures'

আমি যদি আমার প্রসেসিং কলটিকে নিম্নলিখিতটিতে পরিবর্তন করি তবে এটি ত্রুটি ছাড়াই চলে:

processing.runalg("qgis:clip", layer, self.output_layer, output) # Runs fine

এছাড়াও, যদি কোনও সহায়তা করে তবে প্রসেসিং_কিগিস.লগ-এ লগড হওয়ায় এটি ব্যর্থ অ্যালগরিদম:

processing.runalg("qgis:clip","C:/path/to/shapefile.shp|layerid=0|subset=CONTINENT = 
    'Europe'","Polygon?crs=epsg:4326","C:/path/to/output")

1
এটি সম্ভবত প্রত্যাশা করা হয়েছে যেহেতু হার্ড-ড্রাইভের কোনও শারীরিক স্তরটির সরঞ্জামটির প্রয়োজন হয়। কেবল একটি ধারণা, তবে আপনি কেন অস্থায়ীভাবে একটি স্তরকে অস্থায়ী ফাইলে সংরক্ষণ করার চেষ্টা করছেন না (যদি আপনার কোনও অবস্থান প্রয়োজন import tempfileএবং tempfile.gettempdir)) এভাবেই qgis প্রক্রিয়াকরণ যাহাই হউক না কেন কাজ করে
Curlew

আমি করব, যদি আমার হয় .. এই জাতীয় স্তরের জন্য মেমরির কাজ করা সহজ এবং ক্লিনার। আপনি যদি নিশ্চিত হন যে এটি আশা করা যায় তবে এটি উত্তর হিসাবে পোস্ট করুন এবং আমি এটি গ্রহণ করতে পারি।
ওস্টিন

উত্তর:


12

দেখা যাচ্ছে যে, আপনি মেমরির স্তরটি সামগ্রীর সারণীতে ব্যবহার করার আগে যতক্ষণ না ব্যবহার করেন ততক্ষণ তা ঠিক কাজ করে। দেখে মনে হচ্ছে dataobjects.getObjectFromUriকিউজিআইএস উত্সের ফাংশন অন্যথায় এটি পরিচালনা করতে পারে না।

সুতরাং নিম্নলিখিতটি খুব ভালভাবে কাজ করে:

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
processing.runalg("qgis:clip", layer, mem_layer, output)

প্রসেসিং ফাংশন থেকে আউটপুট হিসাবে মেমরি স্তরগুলি কীভাবে ব্যবহার করতে হয় তার জন্য আমার সাম্প্রতিক প্রশ্নটি দেখুন (মূলত processing.runandloadপরিবর্তে ব্যবহার করুন processing.runalg)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.