Hình học từ nhiều tính năng được chọn thành một hình học


8

Hãy xem liệu tôi có thể giải thích những gì tôi đang cố gắng làm không. Trước hết tôi đã phát triển một AddIn cho ArcMap có thể lấy một tính năng được chọn (Đa giác) trên một lớp, lấy hình dạng của tính năng đó và lưu nó vào cơ sở dữ liệu SQL Server. Những gì tôi muốn làm là lưu nhiều tính năng được chọn, không phải là hình học riêng lẻ (ví dụ: một hàng cho mỗi tính năng / hình học) mà là một "hình dạng hình học" chứa đa giác được chọn. Đây là mã tôi có cho đến nay:

IFeatureLayer featureLayer = ArcMap.Document.CurrentContentsView.SelectedItem as IFeatureLayer;
        if (featureLayer != null)
        {
            IFeatureSelection featSel = featureLayer as IFeatureSelection;
            IEnumIDs idList = featSel.SelectionSet.IDs;

            int index = idList.Next();
            List<int> indexes = new List<int>();

            while (index != -1)
            {
                indexes.Add(index);
                index = idList.Next();
            }

            IFeatureClass featureClass = featureLayer.FeatureClass;
            IFeature feature = featureClass.GetFeature(indexes[0]);
            IGeometry geometry = feature.Shape as IGeometry;
            // Save to database
        }

Như bạn thấy tôi có thể lấy tất cả các chỉ mục của các tính năng được chọn của lớp đã chọn và lấy hình học, thử thách là "ghép" tất cả các hình học thành một ... hy vọng nó có ý nghĩa :)

Bất kỳ đề xuất?

PS ... và nếu bất kỳ ai trong số các bạn có cách lặp tốt hơn thông qua idList ... vui lòng cho tôi biết :)

CẬP NHẬT:

LỚN nhờ Petr! Làm theo hướng dẫn của bạn và nó đã làm việc trong lần thử đầu tiên!

Đây là mã tôi đã kết thúc với:

IFeatureSelection featSel = featureLayer as IFeatureSelection;

                if (featSel.SelectionSet.Count > 0)
                {
                    ITopologicalOperator resultPolygon = new Polygon() as ITopologicalOperator;
                    IGeometryCollection geometriesToUnion = new GeometryBag() as IGeometryCollection;

                    ICursor cursor;
                    featSel.SelectionSet.Search(null, false, out cursor);

                    IFeatureCursor featureCursor = cursor as IFeatureCursor;
                    IFeature feature;
                    while ((feature = featureCursor.NextFeature()) != null)
                    {
                        geometriesToUnion.AddGeometry(feature.Shape as IGeometry);
                    }

                    resultPolygon.ConstructUnion(geometriesToUnion as IEnumGeometry);

                    // Save resultPolygon to a database
                }

Chỉ là một bên, bạn đã nghĩ làm cho điều này một kịch bản arcpy? Đó là một cách dễ dàng hơn để làm việc.
Lông

@ Hairy - Tôi không có kinh nghiệm với arcpy, vì vậy .... :) Tôi có thể nói với bạn mặc dù mã ở trên là một phần của một bổ trợ mà chúng tôi gửi cho khách hàng của chúng tôi. Chúng tôi đã chọn bổ trợ vì chúng tôi muốn làm mọi thứ dễ dàng nhất có thể cho khách hàng của mình :)
Claus_L

Không thể đơn giản hơn python, một trong những ngôn ngữ đơn giản nhất tôi từng sử dụng. Có thể được gửi dưới dạng một công cụ bên trong hộp công cụ cho khách hàng của bạn. Tôi thực sự nghiêm túc nhìn vào điều này.
Lông

Câu trả lời:


8

Bạn có thể sử dụng ITopologicalOperator.ConstructUnion .

Các bước sẽ như sau:

  1. Tạo một thể hiện của Polygonlớp và chuyển nó tới ITopologicalOperator. Ví dụ đa giác này sẽ chứa kết quả.
  2. ITopologicalOperator.ConstructUnioncần một IEnumGeometrychỉ định hình học để hợp nhất (hoặc theo cách nói của bạn, nối), tạo một thể hiện của GeometryBaglớp, thực hiện IEnumGeometry.
  3. Truyền túi hình học để IGeometryCollectionbạn có thể thêm đa giác nguồn của mình vào đó.
  4. Truyền túi hình học của bạn cho ITopologicalOperator.ConstructUnionphương thức trên đa giác được tạo ở bước 1.

Theo như liệt kê lựa chọn có liên quan, phương pháp lấy danh sách ID của bạn và nhận hàng cho mỗi ID duy nhất là RẤT không hiệu quả. Hiệu suất sẽ tốt hơn nhiều nếu bạn chỉ sử dụng IFeatureSelection.SelectionSet.Search()phương pháp. Bạn sẽ chỉ định một nullđối số bộ lọc truy vấn khi gọi phương thức này vì bạn muốn tất cả các tính năng trong lựa chọn. Kết quả sẽ là một con trỏ mà bạn có thể liệt kê.


Cảm ơn rất nhiều vì đã giúp đỡ một người mới về GIS! Đã hoạt động hoàn hảo :)
Claus_L

1
Tôi đã phải thiết lập SpatialReferencetrên GeometryBagtrước khi thêm các yếu tố. Nếu không thì ConstructUnionsẽ thất bại.
kẹo cao su
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.