পাইকিজিআইএস-এ নাম রেখে স্তর পাচ্ছেন?


15

আমার কাছে একটি প্লাগইন রয়েছে যা শহরগুলির তালিকার জন্য বাফার খুঁজে পায়, দূরত্ব সরবরাহ করে। রাষ্ট্র এবং শহরের নামগুলি বৈশিষ্ট্য সারণী থেকে নেওয়া হয় এবং সেই অনুযায়ী ফিল্টার হয়। আমি যা চাই তা হল আমার প্লাগইনটি ক্যানভাসে স্তরটির স্তর নাম বা ক্রমটি সনাক্ত করতে হবে, ক্যানভাসে উপস্থিত অন্যান্য স্তর নির্বিশেষে এবং সেই স্তরটি থেকে সম্পর্কিত বৈশিষ্ট্য অ্যাক্সেস করা উচিত।

আমি আরও কৌতূহলী যে কোডে একটি নির্দিষ্ট স্তর নাম ইঙ্গিত করে পুনরুক্তিতে কোনও ত্রুটি ঘটবে যদিও কিছু অন্যান্য স্তর উপস্থিত রয়েছে?

নীচে আমার কোডটি দয়া করে আমাকে বলুন আমার কোথায় পরিবর্তন করা উচিত এবং কী পরিবর্তন হবে?

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

উত্তর:


41

আপডেট: 10.04.2018

ব্যবহার QGIS 3.x আপনি ব্যবহার করতে পারেন mapLayersByNameথেকে পদ্ধতি QgsProjectএই ভাবে শ্রেণী:

layers = QgsProject.instance().mapLayersByName('my layer name')

যেহেতু আপনার স্তর স্তরগুলিতে একই নামের সাথে QGIS এ বেশ কয়েকটি স্তর থাকতে পারে তাই উপরের পদ্ধতিটি আপনাকে মেলা স্তরগুলির একটি তালিকা দেয়।


জন্য QGIS 2.x :

আপনার স্তরের এমন একটি নাম রয়েছে যা আপনি অন্যের থেকে আলাদা করতে পারেন তা নিশ্চিত করেই আপনার দরকার হবে। পরিবর্তে layer = self.iface.activeLayer(), করুন:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

যদি আপনি স্তরটির নামটি বিশ্বাস না করেন (সর্বোপরি, এটি যে কোনও সময় ব্যবহারকারী দ্বারা পরিবর্তন করা যেতে পারে), আপনি স্তর উত্স পরীক্ষা করার চেষ্টা করতে পারেন। যদি আপনার স্তরটি শেফিল হয় তবে আপনি শেপফিলের পথটি এইভাবে পরীক্ষা করতে পারেন:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

সম্পাদনা: @ যাকব মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, আপনি প্রথম লাইকটি একটি লাইনে লিখতে পারেন:

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

বা:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

যাইহোক, আপনার layerListপ্রথম উপাদানটি অ্যাক্সেস করার আগে এটি খালি নয় তা যাচাই করতে হবে :

if layerList: 
    layer = layerList[0]

2
QgsMapLayerRegistry.instance () এ ম্যাপের লিরের জন্য মুদ্রণ করুন (ম্যাপলায়ার্স ()। মান () যদি লিরনাম () == "ল্যান্ড"] [0] .নাম ()
জ্যাকব

7
স্তর = QgsMapLayerRegistry.instance () mapLayersByName ( "mylayername") [0]।
জ্যাকব

আপনি layer = noneআপনার কোডের শুরুতে কেন সেট করছেন? এটি অযৌক্তিক বলে মনে হচ্ছে বিশেষত এটি যদি কোনও ফাংশনে থাকে
ব্যবহারকারী 32882

1
এটি একটি ডিফল্ট মান, কারণ জন্য ভিতরে যদি একটি আছে। যদি যদি কখনও পূরণ না হয় তবে স্তরটির পরে স্তরটির অস্তিত্ব থাকবে না। সুতরাং, আপনি লেয়ার ভেরিয়েবলটি পরে পড়তে পারবেন তা নিশ্চিত করার জন্য।
জার্মেইন ক্যারিলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.