কিউজিআইএস-এ প্রতিবেশী টাইল আইডস কীভাবে নির্ধারণ করবেন?


11

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

তবে আমরা তখন এমন বাস্তববাদী উদাহরণগুলি চিন্তা করতে শুরু করেছি যেখানে আমরা এমন পৃষ্ঠাগুলি আঁকতে চাই না যেখানে আমাদের আগ্রহের জেলাটি নেই, যেমন আমার হোম কাউন্টির এই একটি:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং আজ বিকেলে আমার প্রতিটি গ্রিড সেলের জন্য আগ্রহী 4 প্রতিবেশী কাজ করার জন্য অজগর স্ক্রিপ্টে একটি নাটক ছিল এবং আমার গ্রিডে এই মানগুলি জুড়েছিল (এটি উজ্জ্বল গান্ধীর টিউটোরিয়ালের উপর ভিত্তি করে ):

for f in feature_dict.values():
    print 'Working on %s' % f[_NAME_FIELD]
    geom = f.geometry()
    # Find all features that intersect the bounding box of the current feature.
    # We use spatial index to find the features intersecting the bounding box
    # of the current feature. This will narrow down the features that we need
    # to check neighboring features.
    intersecting_ids = index.intersects(geom.boundingBox())
    # Initalize neighbors list and sum
    neighbors = []
    neighbors_sum = 0
    for intersecting_id in intersecting_ids:
        # Look up the feature from the dictionary
        intersecting_f = feature_dict[intersecting_id]
        int_geom = intersecting_f.geometry()
        centroid = geom.centroid()
        height = geom.boundingBox().height()
        width = geom.boundingBox().width()
        # For our purpose we consider a feature as 'neighbor' if it touches or
        # intersects a feature. We use the 'disjoint' predicate to satisfy
        # these conditions. So if a feature is not disjoint, it is a neighbor.
        if (f != intersecting_f and
            not int_geom.disjoint(geom)):
            above_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x(),
               centroid.asPoint().y()+height))
            below_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x(),
               centroid.asPoint().y()-height))
            left_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x()-width,
               centroid.asPoint().y()))
            right_point = QgsGeometry.fromPoint(QgsPoint(centroid.asPoint().x()+width,
               centroid.asPoint().y()))
            above = int_geom.contains(above_point)   
            below = int_geom.contains(below_point)   
            left = int_geom.contains(left_point)
            right = int_geom.contains(right_point)
            if above:
                print "setting %d as above %d"%(intersecting_f['id'],f['id'])
                f['above']=intersecting_f['id']

            if below:
                print "setting %d as below %d"%(intersecting_f['id'],f['id'])
                f['below']=intersecting_f['id']

            if left:
                print "setting %d as left of %d"%(intersecting_f['id'],f['id'])
                f['left']=intersecting_f['id']

            if right:
                print "setting %d as right of %d"%(intersecting_f['id'],f['id'])
                f['right']=intersecting_f['id']

    # Update the layer with new attribute values.
    layer.updateFeature(f)

layer.commitChanges()

এটি ঠিক কাজ করে।

এখানে চিত্র বর্ণনা লিখুন

তবে পুরোপুরি সত্যি বলতে কী উত্তরে একটি পরীক্ষা পয়েন্ট তৈরি করা এবং তারপরে সমস্ত সম্ভাব্য প্রতিবেশীর পরীক্ষা করা ভুল বলে মনে হয়। যাইহোক আমার মস্তিষ্ক ভাঙার এক বিকেলের পরে আমি একটি নির্দিষ্ট গ্রিড কোষের উত্তরের প্রতিবেশী কী তা নির্ধারণ করার ভালতর উপায় সম্পর্কে ভাবতে পারি না?

আদর্শভাবে আমি প্রিন্ট রচয়িতা পাঠ্য বাক্সে রাখার জন্য যথেষ্ট সাধারণ কিছু চাই, তবে আমার সন্দেহ হয় যে এটি জিজ্ঞাসা করার জন্য খুব বেশি।


একদিকে যদি কোনও প্রতিবেশী না থাকে তবে কি হবে। আপনি কি এক দিক দিয়ে ক্লোসেট সেলটির মান চান বা আপনি কোনও শূন্যতা ছেড়ে চলে যাবেন?
Radouxju

সেক্ষেত্রে আমি নালার জন্য খুশি, আমি শূন্য বা খালি না হলে সহজেই কেবল প্রদর্শন করতে লেবেলটি সেট করতে পারি।
ইয়ান টার্টন

উত্তর:


3

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

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

আমি এটি চেষ্টা করি নি, তবে আপনি নতুন জ্যামিতি জেনারেটর স্টাইলিং কার্যকারিতা ব্যবহারের মাধ্যমে কিউজিআইএসে একটি পৃথক ডেটা স্তর তৈরি করা এড়াতে সক্ষম হতে পারেন, এটি ম্যাপআইএনফোতে অর্জনযোগ্য ছিল না এমন আরও মার্জিত এবং গতিশীল সমাধানের জন্য তৈরি করবে!


আমি অন্যান্য বহুভুজগুলির লেবেলগুলি ব্যবহার করার কথা ভাবছিলাম! :-) জ্যামিতি জেনারেটরের সাথে তাত্ক্ষণিক পরীক্ষার পরে আমি একটি বাউন্ডিং বক্স আঁকতে পারি, তবে গ্রিড তৈরি করা আরও শক্ত
ইয়ান টার্টন

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

সবেমাত্র একটি নাটক ছিল, এবং এটি উপস্থিত হয় যে জ্যামিতি জেনারেটর স্টাইলিং দ্বারা উত্পাদিত জ্যামিতি লেবেলযুক্ত হয় না, তাই আমি আশা করি যে আরও মার্জিত সমাধান নয়।
অ্যান্ডি হারফুট

8

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

এখানে চিত্র বর্ণনা লিখুন

প্রথমে আমাদের প্রতিটি গ্রিডের লেবেল প্রদর্শন করতে হবে।

লেআউট ভিউতে আমি গ্রিডটি আটলাসে কভারেজ স্তর হিসাবে ব্যবহার করেছি, আমি দুটি মানচিত্র তৈরি করেছি: মূল দর্শন উইন্ডো মানচিত্র এবং একটি সূচক মানচিত্র যা কেবল গ্রিড দেখায়, আপনি নীচে দেখতে পাচ্ছেন:

এখানে চিত্র বর্ণনা লিখুন

তারপরে আমি নিম্নলিখিতগুলি করেছি:

  1. আমি পুরো গ্রিডের পরিমাণ দেখাতে সূচক মানচিত্রের স্কেল সামঞ্জস্য করেছি তারপরে আমি স্কেলটি স্থির করেছি
  2. আমি ব্যবহার করার সময় মানচিত্রটি প্যান করা থেকে রোধ করতে দেখার সীমাটি স্থির করেছিলাম Preview atlasএবং
  3. Overviewআপনি নীচে দেখতে পারেন হিসাবে আমি প্রধান দেখার মানচিত্রের ব্যাপ্তি এবং অবস্থান দেখতে সক্ষম করেছিলাম :

এখানে চিত্র বর্ণনা লিখুন

মূল দেখার উইন্ডো মানচিত্রের জন্য, প্রতিটি গ্রিড ব্লকের মাত্রা পর্যন্ত আমি স্কেলটি স্থির করেছি, নিশ্চিত হয়েছি যে কিছু ঘটলে স্কেল পরিবর্তন হবে না, যেমন আপনি নীচে দেখতে পাচ্ছেন;

এখানে চিত্র বর্ণনা লিখুন

একটি সূচী মানচিত্র ব্যবহার করে, আপনি প্রতিটি টাইলের আইডি এবং অবস্থান অন্যান্য টাইলের রেফারেন্স সহ সহজেই দেখতে পাবেন, এমনকি আপনি মূল দেখার মানচিত্রের উইন্ডো থেকে গ্রিডটি বন্ধ করে দিচ্ছেন। উদাহরণস্বরূপ, নিম্নলিখিত মানচিত্রে একটি টাইল আইডি = 14 রয়েছে এবং আপনি পার্শ্ববর্তী টাইল আইডি দেখতে পারেন।

এখানে চিত্র বর্ণনা লিখুন

আপডেট :

আমি আমার উত্তর আপডেট করব কারণ আমি বুঝতে পেরেছি যে আপনি আশেপাশের বিন্যাসগুলির আইডি নয় আশেপাশের বিন্যাসের পৃষ্ঠা নম্বর সূচকটি দেখাতে চেয়েছিলেন।

প্রক্রিয়াটি বোঝার জন্য সহজ করার জন্য, আমি নীচে প্রদর্শিত হিসাবে লেআউট পৃষ্ঠা নম্বরটি দেখানোর জন্য সূচী মানচিত্রে আইডি নম্বরগুলি আপডেট করব:

এখানে চিত্র বর্ণনা লিখুন

যে আইডিগুলি আমি 0 (জিরো) থেকে শুরু করেছি, সূচকের মানচিত্রে প্রদর্শিত প্রথম গ্রিডের আইডি 3 থেকে শুরু হবে তাই অতএব, আমি আটলাসের আইডি নম্বর থেকে 2 বিয়োগ করে পৃষ্ঠা নম্বরটি 1 থেকে শুরু করতে চাই: Page number: ID -2, তারপরে আমি বর্তমান পৃষ্ঠা, পূর্ববর্তী পৃষ্ঠা, পরবর্তী পৃষ্ঠার উপরের পৃষ্ঠা এবং নীচের পৃষ্ঠার জন্য লেবেল তৈরি করতে অভিব্যক্তিটির রেফারেন্স হিসাবে বর্তমান পৃষ্ঠা নম্বরটি ব্যবহার করব:

এখানে চিত্র বর্ণনা লিখুন

  • বর্তমান পৃষ্ঠার লেবেল পাঠ্য বাক্সে এই অভিব্যক্তি রয়েছে: Current Page Number: [%@atlas_pagename%]

  • পূর্ববর্তী পৃষ্ঠা প্রকাশ: [%if((@atlas_pagename = 1), Null, '↑ Page Number: ' || (@atlas_pagename - 1))%]যেহেতু 1 এর আগে কোনও পৃষ্ঠা নেই

  • পরবর্তী পৃষ্ঠার অভিব্যক্তি: [%if( (@atlas_pagename = 25), Null, '↓ Page Number: ' || (@atlas_pagename + 1))%]যেহেতু 25 এর পরে কোনও পৃষ্ঠা নেই

  • উপরের পৃষ্ঠা প্রকাশ: [%if((@atlas_pagename <= 6),NULL,'↑ Page Number: ' || (@atlas_pagename -6))%]যেহেতু উপরের দিকের 6 টির আগে কোনও পৃষ্ঠা নেই

  • [%if((@atlas_pagename >= 20), Null, '↓ Page Number: ' || (@atlas_pagename + 6))%]পৃষ্ঠাগুলির নীচে: যেহেতু নীচের দিকে 20 এর পরে কোনও পৃষ্ঠা নেই

কিছু আউটপুট ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


যদিও দরকারী, এটি তার প্রশ্নের উত্তর দেয় না।
ভিক্টর

@ ভিক্টর আপনার মন্তব্যের জন্য ধন্যবাদ, আমি আমার উত্তর আপডেট করেছি।
আহমাদনব

এটি আপনার উদাহরণে (এবং তাঁর) কাজ করে, যেহেতু কী ম্যাপ / গ্রিডের দিকগুলি নিয়মিত। যদি তারা সরল না থাকে তবে যে সংখ্যাটি যোগ করতে বা বিয়োগ করতে হবে তা কাজ করবে না (আপনার উদাহরণে)) আপনি যে আটলাস পৃষ্ঠায় আছেন তার উপর নির্ভর করে পৃথক হবে।
ভিক্টর

2
আমি আপনার সাথে একমত. গ্রিড নিয়মিত না হলে প্রক্রিয়া আরও জটিল হবে। তবে যেহেতু তিনি এটি নিয়মিত গ্রিডে প্রয়োগ করতে চান আমার প্রস্তাবিত সমাধানে প্রয়োগ পদ্ধতিটি কার্যকর হবে will
আহমাদনব

কেবল সত্যটি লক্ষ করছি, আপনার যদি আরও একটি ভাল ধারণা থাকে! বিশেষত যেহেতু আমার গ্রিডটি নিয়মিত নয়!
ভিক্টর

2

এই সমাধানটি আয়তক্ষেত্রাকার গ্রিডগুলির জন্য কাজ করবে এবং এটি স্বয়ংক্রিয়ভাবে (ম্যানুয়ালি কোনও কিছুকে সামঞ্জস্য না করে কোনও দৃশ্যের জন্য কাজ করা উচিত)।

ধরে নেওয়া যাক আপনার পৃষ্ঠা নম্বর সহ একটি গ্রিড আছে have প্যারামিটার হিসাবে গ্রিড স্তর এবং এর পৃষ্ঠা নম্বর ক্ষেত্রটি নির্বাচন করে আপনি আমার প্রসেসিং স্ক্রিপ্টটি চালাতে পারেন । স্ক্রিপ্ট right, left, above, belowগ্রিড স্তরে চারটি ক্ষেত্র ( ) তৈরি করে এবং প্রতিটি গ্রিড কক্ষের জন্য সংশ্লিষ্ট প্রতিবেশী পৃষ্ঠা আইডি গণনা করে। তারপরে আপনি [% if( "left" is not NULL, 'to page' || "left", "" ) %]প্রতিবেশীর পৃষ্ঠার লেবেলগুলি দেখানোর জন্য আপনার অভিব্যক্তি (যেমন, ) ব্যবহার করতে পারেন ।

কিউজিআইএস রিসোর্স শেয়ারিং প্লাগইন থেকে কেবল আমার সংগ্রহশালা ( https://github.com/gacarrillor/QGIS-Resource.git ) যুক্ত করুন এবং স্ক্রিপ্টটি ইনস্টল করুন: এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

কিভাবে এটা কাজ করে

স্ক্রিপ্টটি বর্তমান গ্রিড সেল এবং প্রতিটি ছেদকারী ঘর উভয় থেকে বাউন্ডিং বক্সের স্থানাঙ্কগুলির সাথে তুলনা করে (ডান, বাম, উপরে বা নীচে) সম্পর্ক নির্ধারণ করে। দেখা যাচ্ছে যে প্রতিটি সম্পর্কের জন্য, স্থানাঙ্কগুলির মধ্যে একটি অনুপস্থিত।

যদি সম্পর্কটি থাকে above, অনুপস্থিত স্থানাঙ্কটি হ'ল yMin, বর্তমান গ্রিড সেলের বাউন্ডিং বাক্স থেকে অন্য 3 টি স্থানাঙ্কগুলি উপরের সেলটির বাউন্ডিং বাক্সে উপস্থিত থাকবে। মনে রাখবেন যে QGIS সীমান্ত বাক্সে এই আদেশ সংজ্ঞায়িত করা হয়: [xMin, yMin, xMax, yMax]

একটি সংখ্যার উদাহরণের জন্য আসুন 1 দৈর্ঘ্যের পক্ষের সাথে আয়তক্ষেত্রগুলি নেওয়া যাক বর্তমান কক্ষের সীমাবদ্ধ বাক্সটি হিসাবে সংজ্ঞায়িত হয়েছে bbox1=[0,0,1,1]। উপরের ঘরটির সীমানা বাক্সটি হিসাবে সংজ্ঞায়িত করা হবে bbox2=[0,1,1,2]। Bbox1 থেকে এক্স স্থানাঙ্কগুলি বক্সবক্স 2 এ উপস্থিত রয়েছে, অন্যদিকে বক্সবক্স 2 এর yMinওয়াই স্থানাঙ্কগুলিতে বক্সবক্স 1 অনুপস্থিত রয়েছে।

আমরা আমাদের 4 টি সম্পর্ককে এইভাবে সংজ্ঞায়িত করতে পারি (ও: বর্তমান, #: অনুপস্থিত):

right: [#,o,o,o]
above: [o,#,o,o]
left:  [o,o,#,o]
below: [o,o,o,#]

যেমন আপনি দেখতে পাচ্ছেন, অনুপস্থিত সূচকটি আমাদের প্রয়োজনীয় সমস্ত তথ্য দেয়।

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