ক্ষেত্র ক্যালকুলেটরের অন্য একটি স্তরকে কীভাবে উল্লেখ করবেন?


26

বহুভুজ স্তর থেকে কোনও বৈশিষ্ট্য নির্বাচন করার এবং ক্ষেত্র ক্যালকুলেটরে "ভিতরে" ব্যবহার করে কোনও বিন্দু স্তরের ভার্চুয়াল ক্ষেত্রে মান সন্নিবেশ করার কী উপায় আছে?

CASE
 WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END

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


1
কেন এটির জন্য 'পয়েন্ট স্যাম্পলিং সরঞ্জাম' প্লাগইন ব্যবহার করবেন না?
জাকোব

কারণ নতুন পয়েন্টগুলি তৈরি করার সময় বা বিদ্যমান পয়েন্টগুলি সরানোর সময় আমার গতিশীল আপডেট দরকার।
চন্দ্র সমুদ্র

আপনি বাক্সের সরঞ্জামগুলির উপর নির্ভর না করে এই ইন্টারঅ্যাকশনটিকে স্ক্রিপ্ট করা থেকে ভাল।
নাগেইটেক

দুর্ভাগ্যক্রমে আমার কোনও স্ক্রিপ্টিং অভিজ্ঞতা নেই।
চন্দ্র সমুদ্র

@ লুনারসিয়া আপনার অনুসরণের জন্য আমি নীচে একটি উদাহরণ লিখেছি, তবে আপনার প্রয়োজন অনুসারে আপনাকে এটি টুইট করতে হতে পারে।
নাগেইটেক

উত্তর:


22

স্থানীয় সংযুক্তিগুলি রিফফিউশন প্লাগইন ইনস্টল করার পরে মাঠের ক্যালকুলেটরে উপলব্ধ।

geomwithin(targetLayer,targetField)

কাস্টম স্ক্রিপ্ট ব্যবহারের চেয়ে প্লাগ-ইনগুলি অনেক সহজ। ধন্যবাদ!
jpmc26

geomwithin ( 'targetLayer', 'targetField')।
রাজা

19

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

নীচের স্ক্রিপ্টটি আপনাকে যা পরে তা প্রকাশ করার অনুমতি দেবে। এটি বহুভুজ স্তরতে সমস্ত বৈশিষ্ট্যগুলির মাধ্যমে পুনরাবৃত্তি করে এবং যদি কোনও স্থানিক যোগ থাকে, তবে নির্দিষ্ট কলাম থেকে টেবুলার ডেটা উল্লেখ করে:

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

allfeatures = None
index = QgsSpatialIndex()
indexMade = 0
refLayer = None

@qgsfunction(args="auto", group='Custom')
def spatialJoinLookup(layerName, refColumn, defaultValue, geom, feature, parent):

    if geom is None:
        return defaultValue

    # globals so we don't create the index, refLayer more than once
    global allfeatures
    global index
    global indexMade
    global refLayer

    # Get the reference layer
    if refLayer is None:
        for layer in iface.mapCanvas().layers():
            if layerName == layer.name():
                refLayer = layer
                break
    if refLayer is None:
        raise Exception("Layer [" + layerName + "] not found")

    # Create the index if not exists
    if indexMade == 0:
        index = QgsSpatialIndex()
        allAttrs = layer.pendingAllAttributesList()
        layer.select(allAttrs)
        allfeatures = {feature.id(): feature for (feature) in refLayer.getFeatures()}
        for f in allfeatures.values():
            index.insertFeature(f)
        indexMade = 1

    # Use spatail index to find intersect 
    fid = None
    ids = index.intersects(geom.boundingBox())
    for id in ids:
        fid = id
        break # Only get the first match.
    if fid is not None:
        return allfeatures[fid].attribute(refColumn)

    # Default
    return defaultValue

বহুভুজ স্তর উদাহরণ

নীচে আপনার কাছে থাকতে পারে বহুভুজ স্তরটির একটি উদাহরণ দেওয়া আছে। আমি একটি অনুরূপ পয়েন্ট স্তরও তৈরি করেছি যা আপনি চূড়ান্ত চিত্রে দেখতে পাবেন।

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

এক্সপ্রেশন ব্যবহার

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

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

ফল

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

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


অনেক ধন্যবাদ, আপনার স্ক্রিপ্ট প্রথম 'যদি' বিবৃতিতে 'জ্যামিতি' এর পরিবর্তে 'জিম' ব্যবহার করে দুর্দান্ত কাজ করছে। এইভাবে জ্যামিতিতে যোগদান করা বেশ কার্যকর হতে পারে যেমন বহুভুজগুলিতে একাধিক লেবেল তৈরি করার জন্য।
চন্দ্র সমুদ্র

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

কেবল 100+ পয়েন্ট বৈশিষ্ট্যযুক্ত কিউজিআইএস পারফরম্যান্স সমস্যার সাথে লড়াই করে। একটি নতুন পয়েন্ট বৈশিষ্ট্য যুক্ত করা সত্যই এক ব্যথা, এমনকি অ্যাকুটাল ক্যানভাসে কোনও পয়েন্ট বৈশিষ্ট্য প্রদর্শিত হয় না। অন্যথায় কিউজিআইএস জুম করার সময় গতি বাড়ায়। আমি 'কেস WHEN $ স্কেল <10000 তত স্থানিক জয়নলুকআপ (' বহুভুজ ',' অঞ্চল নাম ',' কিছুই নয় ', $ জ্যামিতি) সমাপ্তি চেষ্টা করেছি কিন্তু এটি কাজ করছে না। পারফরম্যান্স উন্নত করতে আমি কি কিছু করতে পারি?
চন্দ্র সমুদ্র

@ লুনারসিএ আমি একটি স্থানিক সূচক ব্যবহার করতে ফাংশনটি আপডেট করেছি। এটি যুক্তিসঙ্গত দ্রুত হওয়া উচিত।
নাগেইটেক

আপনার সাহায্যের জন্য ধন্যবাদ. স্থানগত যোগদান এখন অনেক দ্রুত তবে দুর্ভাগ্যজনকভাবে কিছু সঠিকভাবে কাজ করছে না। আমি এক এবং একই বহুভুজের মধ্যে পয়েন্টগুলির জন্য পৃথক ফলাফল পাচ্ছি।
চন্দ্র সমুদ্র

8

এটি ফাংশন সহ ফিল্ড ক্যালকুলেটরে করা যেতে পারে aggregate()। পয়েন্ট লেয়ারে ফিল্ড ক্যালকুলেটর এক্সপ্রেশন সহ নতুন ক্ষেত্র তৈরি করুন:

aggregate(
layer:= 'polygon_layer_name',
aggregate:='concatenate',
expression:=joining_field_name,
concatenator:=', ',
filter:=intersects($geometry, geometry(@parent))
)

যেখানে layerবহুভুজ স্তরের নাম স্ট্রিংয়ের মতো লেখা হয়, aggreagateএটি সমষ্টিগত ফাংশন (যোগফলও যোগ করতে পারে ইত্যাদি), expressionমান থেকে ক্ষেত্রটি নেওয়া হবে, concatenatorঅক্ষরের স্ট্রিংয়ে যোগ দেওয়া হচ্ছে (এমনকি এই ক্ষেত্রেও সেট করতে হবে) এবং filterবৈশিষ্ট্যগুলি ভিত্তিক ফিল্টার করছে অভিব্যক্তিতে (এই ক্ষেত্রে প্যারেন্ট লেয়ারের জ্যামিতির সাথে স্তর জ্যামিতিকে আন্তঃসংযোগ দেয়)।

আরও তথ্যের জন্য সমষ্টি কিউজিআইএস ডকুমেন্টেশন চেক করুন ।

স্বয়ংক্রিয় আপডেটের জন্য ব্যবহার করা যেতে পারে ভার্চুয়াল ক্ষেত্র অথবা আপনি অভিব্যক্তি সেট করতে পারেন যেমন ডিফল্ট মান মধ্যে গুণাবলী ফরম সেটিংস লেয়ার প্রোপার্টি ( অ্যাট্রিবিউট ফর্ম সেটিং ডকুমেন্টেশন )।

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


3
এটি লক্ষ করা উচিত যে স্থানিক ক্রিয়াকলাপগুলি (সহ geometry(@parent)) কেবলমাত্র QGIS 3 এর পরে সমর্থিত। এই ক্ষেত্রে যে কেউ পড়তে পারে সে ক্ষেত্রে এখনও ২.১৮ ... ব্যবহার করা হচ্ছে
সে

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