পরিবর্তিত ডেটা উত্স থেকে একটি কিউগিস স্তর আপডেট করুন


13

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

আমি বিভিন্ন বৈশিষ্ট্যযুক্ত মান সহ একটি নতুন শেফফিল লিখতে চাই এবং কিগিস মানচিত্রের রঙ আপডেট করতে চাই। পদক্ষেপ 1 সেই প্রক্রিয়াটিকে ট্রিগার করছে, দ্বিতীয় পদক্ষেপটি পরিবর্তিত শেফফাইল থেকে স্তর পুনরায় লোড করছে। এটির পদক্ষেপ 2 আমি এখানে উদ্বিগ্ন।

অন্যান্য প্রশ্ন / মেলিং তালিকার বকবক triggerRepaintস্তর ব্যবহার করে উল্লেখ করে - যা কাজ করে না। অন্যান্য পরামর্শ অন্তর্ভুক্ত setCacheImage(None)এবং আবার যে কাজ করে না। স্তরটি শেষ পর্যন্ত আপডেট হয় তবে আমি যুক্তিটি সত্যিই দেখতে পাচ্ছি না এবং কখনও কখনও কিছু না করার পরে অবাক হয়ে যায়। অথবা হয়ত আমি দুই মিনিট আগে কিছু করেছি।

এটি আপডেট করার এক প্রজননযোগ্য উপায় হ'ল লেজেন্ড মেনু থেকে স্তরটিকে নকল করা - নকলটি সর্বদা বর্তমান শেফফাইল থেকে তার ডেটা পেয়ে যায় এবং মূল স্তরটি নিজেই আপডেট হয়! সুতরাং এটি করার কিছু উপায় থাকতে হবে।

আমি মনে করি এটি ২.৮-তে আরও ভাল কাজ করছে তবে এটি ২.১০ তাই সম্ভবত কোথাও একটি নতুন বাগ রয়েছে।

সম্পর্কিত, তবে আমার জন্য 2.10-তে কাজ করে না:

কিউজিআইএসে উত্স পরিবর্তিত হলে স্বয়ংক্রিয়ভাবে রাস্টার স্তরগুলি পুনরায় লোড করবেন কীভাবে?

অন্যান্য জিনিস আমি চেষ্টা করেছি:

  • layer.dataProvider().dataChanged.emit() - একবার কাজ করেছেন, আবার একই স্তরে নয়

আমি মনে করি লেয়ারটি কেন অনুলিপি করে কাজ করে তা আমি সন্ধান করেছি - যদি আমি আপডেট স্তরের উপর ভিত্তি করে একটি নতুন থ্রোওয়ে স্তর তৈরি করি এবং তারপরে আপডেট স্তরটিতে কল .triggerRepaint()করি, এটি মানচিত্রের ক্যানভাসে আপডেট হয়:

QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()

আমি যদি কোনও ভিন্ন স্তর উত্স ব্যবহার করি তবে এটি কাজ করে না, তাই মনে হয় আপনি যদি একই স্তর উত্সের ভিত্তিতে একটি স্তর অবজেক্ট তৈরি করেন ...

একটি রাস্টার স্তর (একটি জিওটিআইএফএফ থেকে) সহ এখনই একটি দ্রুত পরীক্ষা, এবং কেবল কল করা rlayer.triggerRepaint()মানচিত্রের ক্যানভাসে রাস্টারটির দৃশ্যকে নির্ভরযোগ্যভাবে আপডেট করেছে বলে মনে হচ্ছে।


আপনার কিছু নমুনা কোড পোস্ট করতে হতে পারে।
নাথান ডব্লিউ

@ নাথানডাব্লু আমি যা করছি তা বেশিরভাগই গুই - লোড স্তর থেকে করুন, স্টাইল করুন - তারপরে কেবল স্তরটি পাওয়া যাবে এবং পাইথন কনসোলে এই কয়েকটি লাইন। আমি যতক্ষণ না জানি যে আমি নীতিটি কাজ করতে পারি ততক্ষণ আমি এটি একটি প্লাগিনের কাঠামোর সাথে লেগে থাকতে বোধ করি! আমি আশা করছিলাম যে এর একটি দ্রুত উত্তর ("কল লেয়ার.আপডেটফ্রমনিউডাটা ইউটাফুল ()") পাবেন তবে আমি এটিকে পরে আরও কোড (শেফফায়ালগুলি তৈরি করার জন্য আর কোড সহ) দিয়ে করব later
স্পেসডম্যান

নিশ্চিত হওয়ার জন্য, আপনি পরবর্তীকালে উভয় আদেশ ব্যবহার করার চেষ্টা করেছিলেন: layer.setCacheImage(None)এবং layer.triggerRepaint()?
ম্যাথিয়াস কুহন

হ্যাঁ @ মাথিয়াসকুহন - যদিও এটি কখনও কখনও কার্যকর হয় তবে প্রায়ই হয় না। আমি কেবল একটি পরিবর্তিত শেফফিল লিখেছি, পাইথন কনসোলে (ডান স্তরটিতে) দুটি জিনিসই করেছি, ভিজ্যুয়াল আপডেট নেই। এখন পর্যন্ত ১০০% কাজ করেছে এমন সহজ জিনিসটি উপরে উল্লিখিত মূল স্তরের উত্সের ভিত্তিতে এবং তারপরে মূল স্তরের উপর ভিত্তি করে একটি নতুন নিক্ষেপ স্তর অবজেক্ট তৈরি করছে triggerRepaint()। v 2.10.1-পাইসা
স্পেসডম্যান

আমার সন্দেহ আছে যে এটি ওজিআর সংযোগ পুল প্রবর্তনের সাথে সম্পর্কিত হতে পারে। আপনি যদি ডিস্কের ফাইলটি প্রতিস্থাপন করেন বা বিদ্যমান ফাইলটি সম্পাদনা করেন তবে কিছু পার্থক্য রয়েছে কি ?
মাথিয়াস কুহন

উত্তর:


5

এটি ওজিআর সংযোগ পুলের সাথে সম্পর্কিত। [1]

কিউজিআইএস ২.১০ এর আগে প্রতিটি একক অ্যাক্সেসে (যেমন পুনরায় রঙ করা) ফাইল পুনরায় খোলা হয়েছিল।

কিউজিআইএস ২.১০ থেকে ফাইল হ্যান্ডেলটি উন্মুক্ত রাখা হয়েছে এবং এর অর্থ যদি কোনও ফাইল হ্যান্ডেলটি প্রতিস্থাপন করা হয় তবে এখনও ইউনিক্স ভিত্তিক সিস্টেমে পুরানো ফাইলটির দিকে নির্দেশ করা যায়

কিউজিআইএস ২.১০: কার্যক্ষম

দুর্ভাগ্যক্রমে QGIS 2.10-তে ফাইলটি আবার খুলতে QGIS কে সুন্দরভাবে বাধ্য করার জন্য কোনও এপিআই নেই। কাজের হিসাবে আপনি একটি কুরুচিপূর্ণ হ্যাক ব্যবহার করতে পারেন:

layer.dataProvider().changeAttributeValues( { -1: { 0: 0 } } )
layer.triggerRepaint()

কিউজিআইএস 2.12: সমাধান

আমি সবেমাত্র একটি নতুন পদ্ধতি প্রবর্তন করেছি যা QGIS 2.12 থেকে শুরু হয়ে যাবে:

layer.dataProvider().forceReload()
layer.triggerRepaint()

সাধারণ পদ্ধতির

আপনার ফাইলটি কীভাবে ওভাররাইট করা হচ্ছে তা নিয়ন্ত্রণ করার সম্ভাবনা থাকলে আপনি বিদ্যমান ফাইলগুলিকে লেখার অনুমতি দিয়ে খুলতে পারবেন এবং ডিস্কে ফাইলগুলি পুরোপুরি (মুছুন / পুনরায় তৈরি করুন) পরিবর্তে সামগ্রীটি পরিবর্তন করতে পারবেন।

[1] নির্দিষ্ট ডেটা উত্সগুলিতে অ্যাক্সেসের গতি বাড়ানোর জন্য সংযোগ পুলটি চালু করা হয়েছিল।


সেরা সমাধান মত মনে হচ্ছে। .changeAttributeValuesদেখাবে একটি "ত্রুটি 1: (-1) বৈশিষ্ট্য আইডি সহ আকৃতি পড়তে পাওয়া সীমার বাইরে প্রচেষ্টা করুন।" কিন্তু এটা ঠিক আছে.
স্পেসডম্যান

2

আপনি যদি প্যান করেন বা অন্যথায় মানচিত্রটি রিফ্রেশ করেন তবে তা আপডেট হওয়া উচিত।

এই নিবন্ধটি বলে যে আপনি পিকিউজিআইএস-এ নিম্নলিখিত ব্যবহার করতে পারেন:

myLayer.triggerRepaint()

রিফ্রেশ করার জন্য নিম্নলিখিত ফাংশনটি ব্যবহার করা যেতে পারে:

def refresh_layers(self):
    for layer in qgis.utils.iface.mapCanvas().layers():
         layer.triggerRepaint()

আমি আমার প্রশ্নে যেমন বলেছি, এবং আমি যে লিঙ্কটি দিয়েছি তাতে উল্লেখ করা হয়েছে, triggerRepaint()কাজ করে না। refresh()মানচিত্রে ক্যানভাস কাজ করে না। ক্যাশে চিত্র সেট করা None(যা এখন এপিআই ডক্সে অবহেলিত) কাজ করে না। আমি কেবলমাত্র এই নতুন জিনিসগুলি একটি নতুন পরিবর্তিত শেফফিল স্তরটিতে চেষ্টা করেছি, মানচিত্রটি প্যান করেছি, টগল করা ভিস চালু এবং বন্ধ করেছি, এটি কার্যকর হয়নি। স্তরটিকে "নকল করুন" এবং এটি তাত্ক্ষণিকভাবে আপডেট হয়। আপনি কি এই জিনিসগুলি নিজে চেষ্টা করেছেন (২.১০)?
স্পেসডম্যান

আমি মনে করি এর উত্তর দিতে আমাদের @ নাথন-ডাব্লু দরকার। আমি নিজে চেষ্টা করে দেখিনি ...
অ্যালেক্স লেথ

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