বহুভুজ স্তর থেকে কোনও বৈশিষ্ট্য নির্বাচন করার এবং ক্ষেত্র ক্যালকুলেটরে "ভিতরে" ব্যবহার করে কোনও বিন্দু স্তরের ভার্চুয়াল ক্ষেত্রে মান সন্নিবেশ করার কী উপায় আছে?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
বহুভুজ স্তর থেকে কোনও বৈশিষ্ট্য নির্বাচন করার এবং ক্ষেত্র ক্যালকুলেটরে "ভিতরে" ব্যবহার করে কোনও বিন্দু স্তরের ভার্চুয়াল ক্ষেত্রে মান সন্নিবেশ করার কী উপায় আছে?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
উত্তর:
বাক্সের বাইরে, ফিল্ড ক্যালকুলেটর বৈশিষ্ট্য স্তরগুলি জুড়ে স্থানিক যোগদানগুলিকে সমর্থন করে না। তবে, কিউগিস এক্সপ্রেশনগুলির জন্য আপনার যদি ফাংশন সম্পাদকের উপর নাথানডাব্লু'র পোস্টে এক নজর থাকে আপনি এটি তৈরি করতে সক্ষম হবেন যে আমরা আমাদের নিজস্ব ডেটা ইন্টারঅ্যাকশন স্ক্রিপ্ট করতে পারি।
নীচের স্ক্রিপ্টটি আপনাকে যা পরে তা প্রকাশ করার অনুমতি দেবে। এটি বহুভুজ স্তরতে সমস্ত বৈশিষ্ট্যগুলির মাধ্যমে পুনরাবৃত্তি করে এবং যদি কোনও স্থানিক যোগ থাকে, তবে নির্দিষ্ট কলাম থেকে টেবুলার ডেটা উল্লেখ করে:
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
নীচে আপনার কাছে থাকতে পারে বহুভুজ স্তরটির একটি উদাহরণ দেওয়া আছে। আমি একটি অনুরূপ পয়েন্ট স্তরও তৈরি করেছি যা আপনি চূড়ান্ত চিত্রে দেখতে পাবেন।
দ্রষ্টব্য, আপনি যদি একটি পৃথক কলাম ব্যবহার করতে চান তবে বহুভুজ ডেটাসেটে কলামের নামটি মিলানোর জন্য আপনাকে অবশ্যই দ্বিতীয় যুক্তিটি পরিবর্তন করতে হবে। উদাহরণস্বরূপ, আপনি 'এরিয়া নাম্বার' কলামটি ব্যবহার করতে পারেন, তবে ফিল্ড ক্যালকুলেটর সেটিংসে কলামের ধরণটি মিলাতে হবে।
আপনি দেখতে পাচ্ছেন যে যেখানে স্থানিক সংযুক্তি নেই সেখানে ডিফল্ট কলাম মান প্রয়োগ করা হয়েছে এবং অন্যটির সঠিক ডেটার সাথে মেলে। আমার দেওয়া স্ক্রিপ্টটি নোট করুন কেবলমাত্র প্রথম ম্যাচে যোগ দেবে। আপনার বহুভুজ ওভারল্যাপিং হয়ে থাকলে আপনাকে অন্য কিছু ব্যবসায়িক যুক্তি তৈরি করতে হবে।
এটি ফাংশন সহ ফিল্ড ক্যালকুলেটরে করা যেতে পারে aggregate()
। পয়েন্ট লেয়ারে ফিল্ড ক্যালকুলেটর এক্সপ্রেশন সহ নতুন ক্ষেত্র তৈরি করুন:
aggregate(
layer:= 'polygon_layer_name',
aggregate:='concatenate',
expression:=joining_field_name,
concatenator:=', ',
filter:=intersects($geometry, geometry(@parent))
)
যেখানে layer
বহুভুজ স্তরের নাম স্ট্রিংয়ের মতো লেখা হয়, aggreagate
এটি সমষ্টিগত ফাংশন (যোগফলও যোগ করতে পারে ইত্যাদি), expression
মান থেকে ক্ষেত্রটি নেওয়া হবে, concatenator
অক্ষরের স্ট্রিংয়ে যোগ দেওয়া হচ্ছে (এমনকি এই ক্ষেত্রেও সেট করতে হবে) এবং filter
বৈশিষ্ট্যগুলি ভিত্তিক ফিল্টার করছে অভিব্যক্তিতে (এই ক্ষেত্রে প্যারেন্ট লেয়ারের জ্যামিতির সাথে স্তর জ্যামিতিকে আন্তঃসংযোগ দেয়)।
আরও তথ্যের জন্য সমষ্টি কিউজিআইএস ডকুমেন্টেশন চেক করুন ।
স্বয়ংক্রিয় আপডেটের জন্য ব্যবহার করা যেতে পারে ভার্চুয়াল ক্ষেত্র অথবা আপনি অভিব্যক্তি সেট করতে পারেন যেমন ডিফল্ট মান মধ্যে গুণাবলী ফরম সেটিংস লেয়ার প্রোপার্টি ( অ্যাট্রিবিউট ফর্ম সেটিং ডকুমেন্টেশন )।
geometry(@parent)
) কেবলমাত্র QGIS 3 এর পরে সমর্থিত। এই ক্ষেত্রে যে কেউ পড়তে পারে সে ক্ষেত্রে এখনও ২.১৮ ... ব্যবহার করা হচ্ছে