Chcę użyć metody IsNear z IRelationalOperator2. Dokumentacja mówi, że GeometryBag obsługuje interfejs IRelationalOperator2. Ale to po prostu nie działa i powoduje wyjątek „... nie można rzutować obiektu COM ... Nie obsługuje takiego interfejsu ..."
IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;
Ten sam kod działa poprawnie z IRelationalOperator, ale nie ma metody IsNear:
IRelationalOperator relationalOperator = (IRelationalOperator)geometry;
Co jest nie tak - kod, dokumentacja czy błąd? „geometria” to geometria typu geometrii esriGeometryBag i zawiera pewne polilinie. Użyłem prostej rzutowania, aby uzyskać wyjątek .NET.
arcgis-10.0
arcobjects
Georg Haefele
źródło
źródło
Odpowiedzi:
Na pewno dzieje się tu coś podejrzanego z 10.0 sp2.
Mogę rzucić torbę geometrii na IRelationalOperator2, w przeciwnym razie ten test powie „nie można rzucić”, a ponadto dostanę wyjątek odniesienia o wartości zerowej.
Jednak przy pierwszym wywołaniu IsNear dostaję wyjątek.
Oto test:
Oto kolejny test. Zwróć uwagę, jak mogę rzucać bez wyjątku, ale otrzymuję wyjątek InvalidCast podczas wywoływania IsNear.
źródło
Domyślam się, że jest to błąd w dokumentacji, ponieważ GeometryBag to zbiór punktów / linii / wielokątów. Wykonanie niektórych operacji ITopologicalOperator na mieszanym i dopasowanym zbiorze typów geometrii może być niemożliwe. Jeśli użyłeś IGeometryCollection polilinii, myślę, że twoje rozwiązanie zadziałałoby.
źródło