IRelationalOperator2およびGeometryBagの使用方法


9

IRelationalOperator2のIsNearメソッドを使用したいと思います。ドキュメントは 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がバグを登録しました。次のサービスパックで修正されることを願っています。
dpalmetz 2012

回答:


6

10.0 sp2を使用すると、確実に問題が発生します。

ジオメトリバッグをIRelationalOperator2にキャストできます。それ以外の場合、このテストでは「キャストできません」と表示され、さらにnull参照例外が発生します。

ただし、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"の値は{ESRI.ArcGIS.Geometry.GeometryBagClass}の値が0であるため、テストが真になることはありません。実際のGeometryBag(を含む)をキャストしようとすると、「null」または例外が発生します。データ)。
Georg Haefele、2011

@Georg空でないgeometrybagclassをIRelationalOperator2にキャストする方法を示すコードを追加しました。私にとって不可解なことは、実際にキャストを行ったときにInvalidCast例外がスローされないことです-IsNearを呼び出すときだけです。
カークカイケンダル2011

カーク、コードとコメントをありがとう。あなたの結果を再現できます。1つの奇妙なこと:実際にキャストした後、IsNearを呼び出す前に、Visual Studioのローカルで "relop"の問題がいくつか表示されます-すべてのIGeometry5-Entriesの値は "((ESRI.ArcGIS.Geometry.GeometryBagClass)(relop))。IGeometry5_xxxxですSystem.Invalid.CastException 『'型の例外投げた』しかし、例外が実際にスローされませんIsNearを呼び出すときにこれが起こる。。。
ゲオルクHaefele

今回はVariantStreamIOクラスを使用して、10で奇妙なキャスト動作(SPがインストールされているかどうかは不明)も経験しました。問題を特定して再現するようにします。これがバグの場合、それは本当に深刻なものです。
Petr Krebs

0

GeometryBagはポイント/ライン/ポリゴンのコレクションであるため、ドキュメントのバグだと思います。ジオメトリタイプの混合および一致したコレクションに対して、いくつかのITopologicalOperator操作を実行することは不可能である可能性があります。ポリラインのIGeometryCollectionを使用した場合、ソリューションは機能すると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.