IRelationalOperator2 और GeometryBag का उपयोग कैसे करें


9

मैं IRNationalOperator2 की IsNear विधि का उपयोग करना चाहता हूं। प्रलेखन का कहना है कि GeometryBag IRelationalOperator2 इंटरफ़ेस का समर्थन करता है। लेकिन यह सिर्फ एक अपवाद के रूप में काम नहीं करता है और परिणाम "... COM ऑब्जेक्ट कास्ट करने में असमर्थ ... ऐसा कोई इंटरफ़ेस समर्थित नहीं है ..."

IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;

समान कोड IRelationalOperator के साथ ठीक काम करता है लेकिन कोई IsNear विधि नहीं है:

IRelationalOperator relationalOperator = (IRelationalOperator)geometry;

क्या गलत है - कोड, प्रलेखन या यह एक बग है? "ज्योमेट्री" ज्योमेट्री प्रकार के एग्रीग्रोमेट्रीबैग की ज्यामिति है और इसमें कुछ पॉलीइन्स होते हैं। मैंने .NET कास्ट पाने के लिए स्ट्रेट कास्ट का इस्तेमाल किया।


मैं यह कहना भूल गया कि मैं 10.0 SP2 का उपयोग करता हूं
जॉर्ज हैफेल

1
यह समस्या अभी भी ArcGis 10.1 (और भी ArcGis 10.0 SP 5) में मौजूद है। दुर्भाग्य से किसी ने अब तक इस बग को ईएसआरआई को नहीं भेजा है, इसलिए मैंने स्थानीय वितरक को सूचित किया और ईएसआरआई ने अब बग को पंजीकृत किया। मुझे उम्मीद है कि यह अगले सर्विस पैक के साथ तय हो जाएगा।
dpalmetz

जवाबों:


6

10.0 sp2 के साथ निश्चित रूप से यहाँ कुछ गड़बड़ चल रही है।

मैं IRelationalOperator2 पर एक ज्यामिति बैग डाल सकता हूं, अन्यथा यह परीक्षण "कास्ट करने में असमर्थ" कहेगा, साथ ही मुझे एक शून्य संदर्भ अपवाद मिलेगा।

हालाँकि, IsNear के लिए पहली कॉल पर मुझे अपवाद मिलता है।

System.InvalidCastException occurred
  Message=Unable to cast COM object of type 'ESRI.ArcGIS.Geometry.GeometryBagClass' to interface type 'ESRI.ArcGIS.Geometry.IRelationalOperator2'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{839F5C7E-ED5F-4B3F-8F97-C0A9CC4817EE}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).
  Source=ESRI.ArcGIS.Geometry

यहाँ परीक्षण है:

private void GBTest(IPoint pnt)
{
    // this line does not fail
    var relop = new GeometryBagClass() as IRelationalOperator2;

    if (relop == null)
        Debug.Print("unable to cast"); // this doesn't print out

    var coll = relop as IGeometryCollection;
    coll.AddGeometry(pnt);
    //((ISpatialIndex)coll).AllowIndexing = true;
    //((ISpatialIndex)coll).Invalidate();

    var pnt2 = ((IClone)pnt).Clone() as IPoint;
    ((ITransform2D)pnt2).Move(100.0, 100.0);
    if (relop.IsNear(pnt2, 1000.0)) // exception here
        Debug.Print("test 1 fail");

    if (!relop.IsNear(pnt2, 10.0))
        Debug.Print("test 2 fail");
}

यहाँ एक और परीक्षा है। ध्यान दें कि मैं बिना किसी अपवाद के कैसे जा सकता हूं, लेकिन IsNear कहते समय एक InvalidCast अपवाद प्राप्त करें।

private void GBTest(IPoint pnt)
{
    var coll = new GeometryBagClass();
    ((IGeometry)coll).SpatialReference = pnt.SpatialReference;

    coll.AddGeometry(pnt);
    coll.GeometriesChanged();

    var relop = (IRelationalOperator2)coll; // would expect the exception here

    var pnt2 = ((IClone)pnt).Clone() as IPoint;
    ((ITransform2D)pnt2).Move(100.0, 100.0);
    if (relop.IsNear(pnt2, 1000.0)) // exception here
        Debug.Print("test 1 fail");

    if (!relop.IsNear(pnt2, 10.0))
        Debug.Print("test 2 fail");
}

कर्क, मैंने भी यही किया है। आपका परीक्षण कभी भी सत्य नहीं होगा क्योंकि इस समय "relop" में 0. ES की गणना के साथ {ESRI.ArcGIS.Geometry.GeometryBagClass} का मान होता है। यदि आप वास्तविक ज्योमेट्रीबैग को सम्मिलित करने का प्रयास करते हैं, तो अपवाद होता है। डेटा)।
जॉर्ज हैफेल

@Georg मैंने यह कहते हुए कोड जोड़ा कि मैं एक गैर-खाली ज्यामिति को IRelationalOperator2 में कैसे डाल सकता हूं। मेरे लिए हैरान करने वाली बात यह है कि जब मैं वास्तव में कॉल कर रहा होता हूं तो केवल एक InvalidCast अपवाद नहीं फेंका जाता है - केवल IsNear को कॉल करते समय।
कर्क कुक्केंडल

कर्क, कोड और आपकी टिप्पणियों के लिए धन्यवाद। मैं आपके परिणामों को पुन: पेश कर सकता हूं। एक अजीब बात है: वास्तव में डाली जाने के बाद और विज़ुअल स्टूडियो में IsNear the Locals को कॉल करने से पहले "relop" के लिए कुछ समस्याएं दिखाते हैं - सभी IGeometry5-Entries का मान होता है ((ESRI.ArcGIS.Geometry.GeometryBagClass) (relop)। IGeometry5_xxxx। 'Type' System का एक अपवाद फेंक दिया। System.Invalid.CastException '। लेकिन अपवाद वास्तव में फेंका नहीं गया है। ऐसा तब होता है जब Isear को कॉल किया जाता है।
जॉर्ज हैफेल

मैंने 10 पर अजीब कलाकारों के व्यवहार का भी अनुभव किया (निश्चित रूप से अगर कोई एसपी स्थापित नहीं किया गया था), इस बार वेरिएंटस्ट्रीमियो वर्ग के साथ। मैं समस्या को अलग करने और पुन: पेश करने की कोशिश करूँगा। यदि यह एक बग है, तो यह वास्तव में एक गंभीर है।
पेट्र क्रेब्स

0

मुझे लगता है कि यह दस्तावेज के साथ एक बग है क्योंकि एक ज्यामिति बैग अंक / लाइनों / बहुभुजों का एक संग्रह है। ज्यामिति प्रकारों के मिश्रित और मिलान वाले संग्रह पर कुछ ITopologicalOperator संचालन करना असंभव हो सकता है। यदि आपको लगता है कि आपके समाधान से काम चलेगा, तो मैं पॉलिनेन्स का IGeometryCollection इस्तेमाल करता हूँ।

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