Як користуватися IRelationalOperator2 та GeometryBag


9

Я хочу використовувати метод IsNear IRelationalOperator2. У документації зазначено, що GeometryBag підтримує інтерфейс IRelationalOperator2. Але це просто не працює і призводить до винятку "... не вдається віддати об'єкт COM ... Не підтримується такий інтерфейс ..."

IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;

Цей же код добре працює з IRelationalOperator, але немає методу IsNear:

IRelationalOperator relationalOperator = (IRelationalOperator)geometry;

Що не так - код, документація чи помилка? "геометрія" - це геометрія типу геометрії esriGeometryBag і містить деякі полілінії. Я використовував прямий ролик, щоб отримати виняток .NET.


Я забув сказати, що використовую 10.0 SP2
Георг Хафеле

1
Ця проблема все ще існує в ArcGis 10.1 (а також ArcGis 10.0 SP 5). На жаль, поки що ніхто не надсилав цю помилку в ESRI, тому я повідомив місцевого розповсюджувача і ESRI зареєстрував помилку зараз. Я сподіваюся, що це виправиться із наступним пакетом обслуговування.
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");
}

Кірк, я зробив те саме. Ваш тест ніколи не буде правдивим, тому що в цей час "повтор" має значення {ESRI.ArcGIS.Geometry.GeometryBagClass} з кількістю 0. "Нуль" або виняток трапляється, якщо ви спробуєте передати справжній GeometryBag (включає дані).
Георг Хефеле

@Georg Я додав код, який показує, як я можу передавати не порожній геометричнийкласс до IRelationalOperator2. Для мене дивовижне те, що виняток InvalidCast не кидається, коли я насправді роблю акторський склад - лише при виклику IsNear.
Кірк Куйкендалл

Кірк, дякую за код та Ваші коментарі. Я можу відтворити ваші результати. Одне дивне: після фактичного виступу та перед викликом IsNear the Locals у Visual Studio виявляють деякі проблеми для "relop" - всі записи IGeometry5-Entries мають значення "((ESRI.ArcGIS.Geometry.GeometryBagClass) (relop)). IGeometry5_xxxx "кинув виняток типу" System.Invalid.CastException ". Але виняток насправді не викинуто. Це відбувається під час дзвінка на IsNear.
Георг Хефеле

Я також відчував дивну поведінку в ролях в 10 (не впевнений, чи встановлені якісь SP), на цей раз з класом VariantStreamIO. Я спробую виділити та відтворити проблему. Якщо це помилка, вона справді є серйозною.
Петро Кребс

0

Я б здогадався, що це помилка з документацією, оскільки GeometryBag - це сукупність точок / ліній / багатокутників. Виконання деяких операцій ITopologicalOperator на змішаній та збіганій колекції типів геометрії може бути неможливим. Якщо ви використовували IGeometryCollection поліліній, хоча, я думаю, ваше рішення спрацювало б.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.