วิธีใช้ IRelationalOperator2 และ GeometryBag


9

ฉันต้องการใช้วิธี IsNear ของ IRelationalOperator2 เอกสารกล่าวว่า GeometryBag รองรับการเชื่อมต่อ IRelationalOperator2 แต่นี่ใช้งานไม่ได้และส่งผลให้เกิดข้อยกเว้น "... ไม่สามารถส่งวัตถุ COM ... ไม่มีส่วนต่อประสานที่รองรับ ... "

IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;

รหัสเดียวกันทำงานได้ดีกับ IRelationalOperator แต่ไม่มีวิธี IsNear:

IRelationalOperator relationalOperator = (IRelationalOperator)geometry;

มีอะไรผิดปกติ - รหัสเอกสารหรือเป็นข้อผิดพลาด? "geometry" เป็นรูปทรงเรขาคณิตของประเภทเรขาคณิตesriGeometryBagและมีโพลิลีนบางส่วน ฉันใช้เพี้ยนตรงเพื่อรับข้อยกเว้น. NET


ฉันลืมที่จะบอกว่าฉันใช้ 10.0 SP2
Georg Haefele

1
ปัญหานี้ยังคงมีอยู่ใน ArcGis 10.1 (และ ArcGis 10.0 SP 5) โชคไม่ดีที่ไม่มีใครส่งบั๊กนี้ให้ ESRI จนกระทั่งตอนนี้ดังนั้นฉันจึงแจ้งผู้จัดจำหน่ายในพื้นที่และ ESRI ลงทะเบียนบั๊กทันที ฉันหวังว่ามันจะได้รับการแก้ไขด้วย service pack ถัดไป
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");
}

นี่คือการทดสอบอื่น สังเกตว่าฉันสามารถส่งโดยไม่มีข้อยกเว้น แต่ได้รับข้อยกเว้น InvalidCast เมื่อโทร IsNear

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" มีค่าเป็น {ESRI.ArcGIS.Geometry.GeometryBagClass} ด้วยจำนวน 0 "ว่าง" หรือข้อยกเว้นเกิดขึ้นหากคุณพยายามโยน GeometryBag จริง (รวมถึง ข้อมูล).
Georg Haefele

@Georg ฉันเพิ่มรหัสที่แสดงว่าฉันสามารถส่งรูปทรงเรขาคณิตที่ไม่ว่างเปล่าไปยัง IRelationalOperator2 ได้อย่างไร สิ่งที่น่าประหลาดใจสำหรับฉันก็คือข้อยกเว้น InvalidCast จะไม่เกิดขึ้นเมื่อฉันโยนตัวจริง - เฉพาะเมื่อเรียก IsNear
Kirk Kuykendall

โบสถ์ขอบคุณสำหรับรหัสและความคิดเห็นของคุณ ฉันสามารถทำซ้ำผลลัพธ์ของคุณ สิ่งหนึ่งที่แปลกประหลาด: หลังจากการแสดงจริงและก่อนที่จะเรียก IsNear the Locals ใน Visual Studio แสดงปัญหาบางอย่างสำหรับ "relop" - รายการ IGeometry5-Entries ทั้งหมดมีค่าเป็น "((ESRI.ArcGIS.Geometry.GeometryBagClass) (relop) 'โยนข้อยกเว้นของ Type' System.Invalid.CastException 'แต่ข้อยกเว้นไม่ได้เกิดขึ้นจริงเมื่อโทร IsNear
Georg Haefele

ฉันยังพบกับพฤติกรรมการร่ายแปลก ๆ ที่ 10 (ไม่แน่ใจว่าติดตั้ง SP ใด) ในครั้งนี้ด้วยคลาส VariantStreamIO ฉันจะพยายามแยกและทำให้เกิดปัญหาอีกครั้ง หากนี่เป็นข้อผิดพลาดมันเป็นสิ่งที่ร้ายแรงแน่นอน
Petr Krebs

0

ฉันเดาว่ามันเป็นข้อผิดพลาดของเอกสารเนื่องจาก GeometryBag เป็นชุดของคะแนน / บรรทัด / รูปหลายเหลี่ยม การดำเนินการบางอย่างของ ITopologicalOperator ในคอลเล็กชั่นรูปแบบเรขาคณิตที่จับคู่กันอาจเป็นไปไม่ได้ ถ้าคุณใช้ IGeometryCollection ของ polylines แม้ว่าฉันคิดว่าวิธีแก้ปัญหาของคุณจะใช้ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.