Cách sử dụng IRelationalOperator2 và GeometryBag


9

Tôi muốn sử dụng phương thức IsNear của IRelationalOperator2. Các tài liệu nói rằng GeometryBag hỗ trợ giao diện IRelationalOperator2. Nhưng điều này chỉ không hoạt động và dẫn đến một ngoại lệ "... không thể truyền đối tượng COM ... Không hỗ trợ giao diện như vậy ..."

IRelationalOperator2 relationalOperator = (IRelationalOperator2)geometry;

Mã tương tự hoạt động tốt với IRelationalOperator nhưng không có phương thức IsNear:

IRelationalOperator relationalOperator = (IRelationalOperator)geometry;

Điều gì là sai - mã, tài liệu hoặc là một lỗi? "hình học" là một hình học của loại hình học esriGeometryBag và chứa một số polylines. Tôi đã sử dụng các diễn viên thẳng để có được ngoại lệ .NET.


Tôi quên nói rằng tôi sử dụng 10.0 SP2
Georg Haefele

1
Vấn đề này vẫn tồn tại trong ArcGis 10.1 (và cả ArcGis 10.0 SP 5). Thật không may, không ai gửi lỗi này cho ESRI cho đến bây giờ, vì vậy tôi đã thông báo cho nhà phân phối địa phương và ESRI đã đăng ký lỗi ngay bây giờ. Tôi hy vọng nó sẽ được sửa chữa với gói dịch vụ tiếp theo.
dpalmetz

Câu trả lời:


6

Chắc chắn có điều gì đó đáng nghi đang xảy ra ở đây với 10.0 sp2.

Tôi có thể truyền túi hình học cho IRelationalOperator2, nếu không, bài kiểm tra này sẽ nói "không thể truyền", cộng với tôi sẽ nhận được một ngoại lệ tham chiếu null.

Tuy nhiên, trong cuộc gọi đầu tiên tới IsNear, tôi nhận được ngoại lệ.

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

Đây là bài kiểm tra:

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

Đây là một thử nghiệm khác. Lưu ý cách tôi có thể truyền mà không có ngoại lệ, nhưng nhận được ngoại lệ UnlimitedCast khi gọi 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, tôi cũng làm như vậy. Thử nghiệm của bạn sẽ không bao giờ đúng vì tại thời điểm này "relop" có giá trị {ESRI.ArcGIS.Geometry.GeometryBagClass} với số đếm 0. "null" hoặc ngoại lệ xảy ra nếu bạn cố gắng sử dụng GeometryBag thật (bao gồm dữ liệu).
Georg Haefele

@Georg Tôi đã thêm mã cho biết làm thế nào tôi có thể truyền một lớp hình học không trống vào IRelationalOperator2. Điều khó hiểu với tôi là một ngoại lệ UnlimitedCast không bị ném khi tôi thực sự thực hiện vai diễn - chỉ khi gọi IsNear.
Kirk Kuykendall

Kirk, cảm ơn bạn đã mã và ý kiến ​​của bạn. Tôi có thể tái tạo kết quả của bạn. Một điều kỳ lạ: sau khi thực sự chọn và trước khi gọi IsNear the Locals trong Visual Studio cho thấy một số vấn đề đối với "relop" - tất cả các IGeometry5-Entries đều có giá trị "((ESRI.ArcGIS.Geometry.GeometryBagClass) (relop)). IGeometry5_xx 'đã ném một ngoại lệ của Loại' System.Invalid.CastException '. Nhưng ngoại lệ không thực sự bị ném. Điều này xảy ra khi gọi IsNear.
Georg Haefele

Tôi cũng đã trải nghiệm hành vi diễn viên kỳ lạ ở tuổi 10 (không chắc có SP nào được cài đặt không), lần này là với lớp VariantStreamIO. Tôi sẽ cố gắng cô lập và tái tạo vấn đề. Nếu đây là một lỗi, nó thực sự là một lỗi nghiêm trọng.
Petr Krebs

0

Tôi đoán rằng đó là một lỗi với tài liệu vì GeometryBag là một tập hợp các điểm / đường / đa giác. Thực hiện một số thao tác ITopologicalOperator trên một bộ sưu tập các loại hình học hỗn hợp và phù hợp có thể là không thể. Nếu bạn đã sử dụng IGeometryCollection của polylines mặc dù tôi nghĩ rằng giải pháp của bạn sẽ hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.