क्या बहुभुज परत से एक विशेषता का चयन करने और फ़ील्ड कैलकुलेटर में "भीतर" का उपयोग करके एक बिंदु परत के आभासी क्षेत्र में मान सम्मिलित करने का एक तरीका है?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
क्या बहुभुज परत से एक विशेषता का चयन करने और फ़ील्ड कैलकुलेटर में "भीतर" का उपयोग करके एक बिंदु परत के आभासी क्षेत्र में मान सम्मिलित करने का एक तरीका है?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
जवाबों:
बॉक्स से बाहर, फ़ील्ड कैलकुलेटर फ़ीचर परतों में स्थानिक जोड़ का समर्थन नहीं करता है। लेकिन, यदि आप qgis अभिव्यक्तियों के लिए फंक्शन एडिटर पर नाथनव की पोस्ट पर एक नज़र डालते हैं, तो आप यह सुनिश्चित कर पाएंगे कि हम अपने स्वयं के डेटा इंटरैक्शन को स्क्रिप्ट कर सकते हैं।
निम्नलिखित स्क्रिप्ट आपको व्यक्त करने की अनुमति देगा कि आप क्या कर रहे हैं। यह बहुभुज परत पर सभी सुविधाओं के माध्यम से पुनरावृत्ति करके काम करता है और यदि कोई स्थानिक जुड़ता है, तो निर्दिष्ट कॉलम से संदर्भ सारणीबद्ध डेटा:
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
फ़िल्टरिंग सुविधाओं पर आधारित है अभिव्यक्ति पर (इस मामले में पैरेंट लेयर की ज्यामिति के साथ परत ज्यामिति का अंतर होता है)।
अधिक जानकारी के लिए जाँचें QGIS प्रलेखन एकत्र करें ।
स्वचालित अद्यतनों के लिए वर्चुअल फ़ील्ड का उपयोग किया जा सकता है या आप लेयर प्रॉपर्टीज़ में गुण प्रपत्र सेटिंग्स में डिफ़ॉल्ट मान के रूप में अभिव्यक्ति सेट कर सकते हैं ( अट्रैक्शन फॉर्म सेटिंग डॉक्यूमेंटेशन )।
geometry(@parent)
) केवल QGIS 3 से समर्थित हैं। बस किसी को भी यह पढ़ने में अभी भी 2.18 का उपयोग कर रहा है ...