Cara menggunakan IRelationalOperator2 dan GeometryBag

9

Saya ingin menggunakan metode IsNear dari IRelationalOperator2. The dokumentasi mengatakan bahwa GeometryBag mendukung antarmuka IRelationalOperator2. Tapi ini tidak berfungsi dan menghasilkan pengecualian "... tidak dapat menampilkan objek COM ... Tidak ada antarmuka yang didukung ..."

IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;

Kode yang sama berfungsi dengan baik dengan IRelationalOperator tetapi tidak ada metode IsNear:

IRelationalOperator relationalOperator = (IRelationalOperator)geometry;

Apa yang salah - kode, dokumentasi atau itu bug? "geometri" adalah geometri tipe geometri esriGeometryBag dan berisi beberapa polyline. Saya menggunakan pemeran langsung untuk mendapatkan pengecualian .NET.

Georg Haefele
sumber
Saya lupa mengatakan bahwa saya menggunakan 10.0 SP2
Georg Haefele
1
Masalah ini masih ada di ArcGis 10.1 (dan juga ArcGis 10.0 SP 5). Sayangnya tidak ada yang mengirim bug ini ke ESRI sampai sekarang, jadi saya memberi tahu distributor lokal dan ESRI mendaftarkan bug ini sekarang. Saya berharap ini akan diperbaiki dengan paket layanan berikutnya.
dpalmetz

Jawaban:

6

Pasti ada sesuatu yang mencurigakan terjadi di sini dengan 10.0 sp2.

Saya dapat melemparkan tas geometri ke IRelationalOperator2, jika tidak tes ini akan mengatakan "tidak dapat melakukan casting", ditambah saya akan mendapatkan pengecualian referensi nol.

Namun, pada panggilan pertama ke IsNear saya mendapatkan pengecualian.

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

Inilah tesnya:

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");
}

Ini tes lain. Perhatikan bagaimana saya bisa melakukan tanpa pengecualian, tetapi dapatkan pengecualian InvalidCast saat memanggil 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");
}
Kirk Kuykendall
sumber
Kirk, saya melakukan hal yang sama. Tes Anda tidak akan pernah benar karena saat ini "relop" memiliki nilai {ESRI.ArcGIS.Geometry.GeometryBagClass} dengan jumlah 0. "Nol" atau pengecualian terjadi jika Anda mencoba memberikan GeometryBag nyata (termasuk data).
Georg Haefele
@ Georg Saya menambahkan kode yang menunjukkan bagaimana saya bisa menggunakan geometribag kosong ke IRelationalOperator2. Yang membingungkan bagi saya adalah bahwa pengecualian InvalidCast tidak dilemparkan ketika saya benar-benar melakukan pemeran - hanya saat memanggil IsNear.
Kirk Kuykendall
Kirk, terima kasih atas kodenya dan komentar Anda. Saya dapat mereproduksi hasil Anda. Satu hal aneh: setelah pemain benar-benar dan sebelum memanggil IsNear the Locals di Visual Studio menunjukkan beberapa masalah untuk "relop" - semua IGeometry5-Entri memiliki nilai "((ESRI.ArcGIS.Geometry.GeometryBagClass) (relop)). IGeometry5_xxxx 'Melontarkan pengecualian dari Tipe' System.Invalid.CastException '. Tapi pengecualian itu tidak benar-benar dilemparkan. Ini terjadi ketika memanggil IsNear.
Georg Haefele
Saya juga mengalami perilaku pemain aneh di 10 (tidak yakin apakah ada SPs diinstal), kali ini dengan kelas VariantStreamIO. Saya akan mencoba mengisolasi dan mereproduksi masalah. Jika ini adalah bug, itu memang serius.
Petr Krebs
0

Saya kira itu adalah bug dengan dokumentasi karena GeometryBag adalah kumpulan poin / garis / poligon. Melakukan beberapa operasi ITopologicalOperator pada kumpulan tipe geometri yang campuran dan cocok bisa menjadi mustahil. Jika Anda menggunakan IGeometryCollection dari polyline meskipun saya pikir solusi Anda akan berhasil.

Steve
sumber