IRelationalOperator2 ve GeometryBag nasıl kullanılır


9

IRelationalOperator2 IsNear yöntemini kullanmak istiyorum. Dokümantasyon GeometryBag IRelationalOperator2 arabirimini desteklediğini söylüyor. Ancak bu işe yaramıyor ve "... COM nesnesini kullanamıyor ... Böyle bir arabirim desteklenmiyor ..."

IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;

Aynı kod IRelationalOperator ile iyi çalışır, ancak IsNear yöntemi yoktur:

IRelationalOperator relationalOperator = (IRelationalOperator)geometry;

Sorun nedir - kod, belgeler mi yoksa bir hata mı? "geometri" esriGeometryBag geometri tipinde bir geometridir ve bazı çoklu çizgiler içerir. .NET istisnasını almak için düz döküm kullandım.


10.0 SP2
Georg Haefele

1
Bu sorun hala ArcGis 10.1'de (ve ayrıca ArcGis 10.0 SP 5'te) bulunmaktadır. Ne yazık ki kimse bugüne kadar bu hatayı ESRI'ya göndermedi, bu yüzden yerel distribütöre bilgi verdim ve ESRI hatayı şimdi kaydetti. Umarım bir sonraki servis paketi ile sabitlenir.
dpalmetz

Yanıtlar:


6

Kesinlikle burada 10.0 sp2 ile balık oluyor bir şey var.

Bir geometri torbasını IRelationalOperator2'ye atabilirim, aksi takdirde bu test "yayınlayamıyor" diyebilir, ayrıca boş bir referans istisnası alırdım.

Ancak, ilk IsNear çağrısında istisna alıyorum.

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

İşte test:

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

İşte başka bir test. Ben istisnasız nasıl döküm dikkat edin, ancak IsNear çağırırken bir InvalidCast istisna olsun.

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, ben de aynısını yaptım. Testiniz asla doğru olmayacaktır çünkü şu anda "relop" değeri {ESRI.ArcGIS.Geometry.GeometryBagClass} değerinde 0 değerine sahiptir. Gerçek bir GeometryBag (içerdiği) için "null" veya istisna oluşur veri).
Georg Haefele

@Georg IRelationalOperator2'ye boş olmayan bir geometri torba sınıfını nasıl atabileceğimi gösteren bir kod ekledim. Şaşırtıcı olan şey, aslında oyuncu kadrosu yaptığımda bir InvalidCast istisnasının atılmaması - sadece IsNear'ı çağırırken.
Kirk Kuykendall

Kirk, kod ve yorumlarınız için teşekkür ederim. Sonuçlarınızı çoğaltabilirim. Garip bir şey: gerçekten yayınlandıktan sonra ve IsNear'ı çağırmadan önce Visual Studio'daki Yerliler "relop" için bazı problemler gösteriyor - tüm IGeometry5-Entries'in değeri "((ESRI.ArcGIS.Geometry.GeometryBagClass) (relop)). 'System.Invalid.CastException' türünde bir istisna attı.Ancak istisna gerçekte atılmadı.Bu IsNear çağrılırken olur
Georg Haefele

Ayrıca VariantStreamIO sınıfıyla 10'da garip oyuncu davranışı yaşadım (herhangi bir SP'nin kurulu olup olmadığından emin değilim). Sorunu izole etmeye ve yeniden üretmeye çalışacağım. Bu bir hataysa, gerçekten de ciddi bir hatadır.
Petr Krebs

0

Bir GeometryBag puan / çizgiler / çokgenler bir koleksiyon olduğundan bu belgeleri ile bir hata olduğunu tahmin ediyorum. Karışık ve eşleştirilmiş geometri türleri koleksiyonunda bazı ITopologicalOperator işlemleri yapmak imkansız olabilir. Bir IGeometryKoleksiyonlar kullandıysanız, çözümünüzün işe yarayacağını düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.