কিউজিআইএস পাইথনে মানচিত্রের স্তরগুলির উপরে ইটারেটিং করা হচ্ছে?


30

মানচিত্রের স্তরগুলির মাধ্যমে কীভাবে পুনরাবৃত্তি করা যায় তা নির্ধারণ করতে আমার সমস্যা হচ্ছে। আমি এর মাধ্যমে সামগ্রীর সারণীতে বর্তমানে হাইলাইট করা স্তরটি অ্যাক্সেস করতে পারি iface.activeLayer()তবে আমি চাই আমার কোডটি সমস্ত স্তরগুলিতে চালিত হোক।

আমি এপিআই তে এমন কিছু দেখতে পাচ্ছি না যা এই কার্যকারিতাটিতে সহজে অ্যাক্সেস সরবরাহ করে এবং একটি ভাল অনলাইন উদাহরণ খুঁজে পেল না তবে আমি কি কিছু মিস করেছি?


আপনারা কীভাবে QgsMapLayerRegistry বা QgsProject ব্যবহার করছেন তা আমি দেখতে পাই না। কিউজিআইএস ৩.০.২ এ এটি কার্যকর হয় না। তবে, iface.mapCanvas ()। স্তরগুলি () করে does ভাল ধরনের. এটি কেবল আপনাকে সক্রিয় স্তরগুলি দেবে বলে মনে হচ্ছে (আপনি স্তরগুলির ফলকে যা পরীক্ষা করেছেন)। লেয়ার ফলকে যাচাই করা নেই এমনকী সমস্ত স্তরগুলির তালিকা কীভাবে পাওয়া যায় তা কি কেউ জানেন? এছাড়াও, যদি প্লাগইন নির্মাতা ব্যবহার করে থাকেন তবে এটি আপনার জন্য আপনার প্লাগইনের শেল তৈরি করে। রান ফাংশনে একটি "স্ব" পরামিতি রয়েছে, যা আইফেস ব্যবহার করার জন্য প্রয়োজন। যেমন স্ব.ফেস.ম্যাপক্যানভাস ()। স্তরগুলি () কেবলমাত্র fyi।
আজপিয়ারি

উত্তর:


24

চেষ্টা করুন ...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

QConsolidate প্লাগইন থেকে consolidatethread.py থেকে আটকানো

কিংবদন্তি ইন্টারফেস অবজেক্ট () থেকে QgsLegendInterface অবজেক্টের বিবরণ ফিরে এসেছে।

সম্পাদনা করুন : উপরের 'স্ব' সম্পর্কিত তথ্য যুক্ত করুন।


ধন্যবাদ! কৌতুকটি করেছে। আমার ধারণা আমি ইএসআরআই বিশ্বে খুব বেশি ব্যবহৃত হয়েছি যেখানে মানচিত্রের মানচিত্রের লেআউটে বিষয়বস্তু এবং বিষয়বস্তুর সারণী স্তরগুলির তালিকা উল্লেখ করে।
স্পেনসারেকারনেপস

2
মনে রাখবেন যে এই এবং ম্যাপক্যানভাস () কৌশলের মধ্যে নাথান উল্লেখ করেছেন তার মধ্যে যা ফিরিয়ে দেওয়া হয়েছে তার মধ্যে পার্থক্য রয়েছে। কিংবদন্তি ইন্টারফেস () অবজেক্টটি সমস্ত স্তরগুলি ফিরিয়ে আনবে, মানচিত্রের ক্যানভাসে না দেখানো হলেও, ম্যাপক্যানভাস () কেবল ক্যানভাসে প্রদর্শিত দেখায়। ম্যাপক্যানভাস () ব্যবহার করা দৃশ্যমান স্তরগুলির রেফারেন্স পাওয়ার জন্য একটি দুর্দান্ত এবং দ্রুত উপায়।
ডাক্তার্টো

1
অন্য নোটে, কিউজিআইএস (> = 1.8) এর সর্বশেষ সংস্করণগুলি কিংবদন্তীর তালিকাভুক্ত ক্রম (খুব সুন্দর!) থেকে পৃথক করে স্তরগুলির একটি রেন্ডারিং ক্রম সংজ্ঞায়িত করার অনুমতি দেয়। কিংবদন্তি ইন্টারফেস () এবং ম্যাপক্যানভাস () পদ্ধতিগুলি যথাক্রমে প্রতিটি জন্য স্তর ক্রম ফেরত দেয়।
ডাক্তার্টো

19

আরও দুটি উপায় রয়েছে:

layers = self.iface.mapCanvas().layers()

আপনাকে স্তরগুলির একটি তালিকা দেবে

অথবা

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

এই উত্তরটি তার 2.16উপরে বা তার উপরে কাজ করে বলে মনে হচ্ছে না
রাফেল

10

কিউজিআইএস ২.6 এর জন্য প্রতিটি স্তর চিহ্নিত করতে এবং তাদের গ্রুপ করার জন্য এখানে কোডটি দেওয়া হয়েছে:

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

দ্রষ্টব্য: গোষ্ঠীকরণের পরে আমাকে নকল স্তরটি সরিয়ে ফেলতে হবে তাই আমি ব্যবহার করেছি root.removeLayer(lyr)


9

কিউজিআইএস 3 QgsMapLayerRegistryএর জন্য কার্যকারিতা সরানো হয়েছে QgsProject

সুতরাং, মানচিত্রের স্তরগুলি পুনরাবৃত্তি করার জন্য আপনার সেই কাঠামোটি ব্যবহার করা উচিত:

layers = QgsProject.instance().mapLayers()

.mapLayers()একটি অভিধান হিসাবে গঠিত ফেরৎ {layer_x_id: layer_x, layer_y_id: layer_y, ....}। তারপরে আপনি স্তরগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন:

for layer_id, layer in layers.items():
    print(layer.name())

যেহেতু .mapLayers()একটি অভিধান প্রদান করে ( dict), আপনি .values()অভিধানের পদ্ধতিও ব্যবহার করতে পারেন যা কেবল listসেই ক্ষেত্রে ফিরে আসে যা সেই ক্ষেত্রে স্তর রয়েছে। তারপরে আপনি স্তরগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন:

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

আপনি যদি পছন্দ করেন তবে আপনি এই পদ্ধতিতে পুনরাবৃত্তি করতে পারেন:

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())

নমস্কার! এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ। স্তরগুলির নাম মুদ্রণ করতে ভাল কাজ করে ... তবে আমি অভিধানের কীগুলি মুদ্রণ করতে পারি না। আপনি কি আমাকে সাহায্য করতে পারেন?
সাইও ভিলাকা

1
for layer in layers: print(layer)আপনি কীগুলি মুদ্রণের জন্য স্ক্রিপ্টটি ব্যবহার করতে পারেন। অথবা কেবল লুপ print(layers.keys())ছাড়াই ব্যবহার করুন for
কাদির bazবাহবাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.