फ़ील्ड कैलकुलेटर में एक और परत कैसे देखें?


26

क्या बहुभुज परत से एक विशेषता का चयन करने और फ़ील्ड कैलकुलेटर में "भीतर" का उपयोग करके एक बिंदु परत के आभासी क्षेत्र में मान सम्मिलित करने का एक तरीका है?

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

यहाँ छवि विवरण दर्ज करें


1
इसके लिए 'प्वाइंट सैंपलिंग टूल' प्लगइन का उपयोग क्यों नहीं किया जाता है?
जैकब

क्योंकि मुझे नए बिंदु बनाते समय या मौजूदा बिंदुओं को स्थानांतरित करते हुए गतिशील अपडेट की आवश्यकता होती है।
चंद्र सागर

आप बॉक्स टूल्स से भरोसा करने के बजाय इस इंटरैक्शन को स्क्रिप्ट करना बेहतर समझेंगे।
नगिटेच

दुर्भाग्य से मेरे पास कोई स्क्रिप्टिंग अनुभव नहीं है।
चंद्र सागर

@LunarSea मैंने आपके लिए अनुसरण करने के लिए नीचे एक उदाहरण लिखा है, लेकिन आपको अपनी आवश्यकताओं को पूरा करने के लिए इसे ट्वीक करना पड़ सकता है।
नगिटेच

जवाबों:


22

रीफैक्शन्स प्लग इन स्थापित करने के बाद क्षेत्र कैलकुलेटर में स्थानिक जोड़ उपलब्ध हैं।

geomwithin(targetLayer,targetField)

प्लग-इन एक कस्टम स्क्रिप्ट का उपयोग करने की तुलना में बहुत सरल हैं। धन्यवाद!
jpmc26

geomwithin ( 'targetLayer', 'टारगेट फील्ड')।
राजा

19

बॉक्स से बाहर, फ़ील्ड कैलकुलेटर फ़ीचर परतों में स्थानिक जोड़ का समर्थन नहीं करता है। लेकिन, यदि आप 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

बहुभुज परत उदाहरण

नीचे एक बहुभुज परत का एक उदाहरण है जो आपके पास हो सकता है। मैंने एक संबंधित बिंदु परत भी बनाई है जिसे आप अंतिम छवि में देखेंगे।

यहाँ छवि विवरण दर्ज करें

अभिव्यक्ति का उपयोग

ध्यान दें, यदि आप एक अलग कॉलम का उपयोग करना चाहते हैं, तो आपको बहुभुज डेटासेट में कॉलम नाम से मिलान करने के लिए दूसरा तर्क बदलना होगा। उदाहरण के लिए, आप 'एरियानंबर' कॉलम का उपयोग कर सकते हैं, लेकिन फ़ील्ड कैलकुलेटर सेटिंग्स में कॉलम प्रकार से मेल खाना होगा।

यहाँ छवि विवरण दर्ज करें

परिणाम

आप देख सकते हैं कि डिफ़ॉल्ट स्तंभ मान को लागू किया गया है जहां कोई स्थानिक जुड़ाव नहीं है, और दूसरे ने सही डेटा से मिलान किया है। ध्यान दें कि मैंने जो स्क्रिप्ट दी है वह केवल पहले मैच में शामिल होगी । यदि आपके बहुभुज ओवरलैप हो रहे थे, तो आपको कुछ अन्य व्यावसायिक तर्क बनाने की आवश्यकता होगी।

यहाँ छवि विवरण दर्ज करें


बहुत धन्यवाद, आपकी स्क्रिप्ट पहले 'अगर' कथन में 'ज्यामिति' के बजाय 'जियोम' का उपयोग करके ठीक काम कर रही है। बहुभुजों पर कई लेबल बनाने के लिए इस तरह से ज्यामितीय जुड़ना काफी उपयोगी हो सकता है।
चंद्र सागर

क्षमा करें, मुझे नहीं पता कि मैं कैसे चूक गया। उम्मीद है कि कोई प्रदर्शन समस्या नहीं है - मैंने केवल रिकॉर्ड के बहुत छोटे उपसमूह के साथ इसकी कोशिश की।
नागटेक

केवल 100+ पॉइंट वाले फ़ीचर QGIS प्रदर्शन समस्याओं से जूझते हैं। एक नई बिंदु सुविधा जोड़ना वास्तव में एक दर्द है यहां तक ​​कि एक्यूटल कैनवास में प्रदर्शित कोई बिंदु सुविधा नहीं है। अन्यथा जब QGIS में जूमिंग में तेजी आती है। मैंने कोशिश की है `` $ पैमाने पर जब <10000 से अधिक स्थानिक 'लुक्कुपी (' बहुभुज ',' क्षेत्रनाम ',' कोई नहीं ', $ ज्यामिति) END' लेकिन यह काम नहीं कर रहा है। क्या प्रदर्शन में सुधार के लिए मैं कुछ भी कर सकता हूं?
चंद्र सागर

@LunarSea मैंने एक स्थानिक सूचकांक का उपयोग करने के लिए फ़ंक्शन को अपडेट किया है। यह यथोचित तेजी से होना चाहिए।
नगिटेच

आपकी सहायता के लिए धन्यवाद। स्थानिक जुड़ाव अब बहुत तेज है लेकिन दुर्भाग्य से कुछ ठीक से काम नहीं कर रहा है। मैं एक और एक ही बहुभुज के बिंदुओं के लिए अलग-अलग परिणाम प्राप्त कर रहा हूं।
चंद्र सागर

8

यह फ़ंक्शन के साथ फ़ील्ड कैलकुलेटर में किया जा सकता है aggregate()। बिंदु परत में इस तरह क्षेत्र कैलकुलेटर अभिव्यक्ति के साथ नया क्षेत्र बनाएं:

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

जहां layerबहुभुज परत नाम स्ट्रिंग की तरह लिखा aggreagateजाता है , कुल कार्य (उपयोग भी किया जा सकता है आदि), expressionमान लिया जाएगा से फ़ील्ड है, concatenatorवर्ण स्ट्रिंग में शामिल हो रहा है (सेट किया जाना है, इस मामले में भी) और filterफ़िल्टरिंग सुविधाओं पर आधारित है अभिव्यक्ति पर (इस मामले में पैरेंट लेयर की ज्यामिति के साथ परत ज्यामिति का अंतर होता है)।

अधिक जानकारी के लिए जाँचें QGIS प्रलेखन एकत्र करें

स्वचालित अद्यतनों के लिए वर्चुअल फ़ील्ड का उपयोग किया जा सकता है या आप लेयर प्रॉपर्टीज़ में गुण प्रपत्र सेटिंग्स में डिफ़ॉल्ट मान के रूप में अभिव्यक्ति सेट कर सकते हैं ( अट्रैक्शन फॉर्म सेटिंग डॉक्यूमेंटेशन )।

यहाँ छवि विवरण दर्ज करें


3
यह ध्यान दिया जाना चाहिए कि स्थानिक कार्यों (के साथ geometry(@parent)) केवल QGIS 3 से समर्थित हैं। बस किसी को भी यह पढ़ने में अभी भी 2.18 का उपयोग कर रहा है ...
she_weeds

धन्यवाद। एक जादू की तरह काम करता है।
स्थानिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.