Geometri dari berbagai fitur yang dipilih menjadi satu geometri

8

Mari kita lihat apakah saya bisa menjelaskan apa yang saya coba lakukan. Pertama-tama saya telah mengembangkan AddIn untuk ArcMap yang dapat mengambil satu fitur yang dipilih (Polygon) pada layer, ambil geometri fitur itu, dan menyimpannya ke database SQL Server. Apa yang ingin saya lakukan adalah menyimpan beberapa fitur yang dipilih, bukan sebagai geometri individu (mis. Satu baris per fitur / geometri) tetapi sebagai satu "potongan geometri" yang berisi poligon yang dipilih. Ini adalah kode yang saya miliki sejauh ini:

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
        }

Seperti yang Anda lihat, saya bisa mendapatkan semua indeks dari fitur yang dipilih dari lapisan yang dipilih dan mendapatkan geometri, tantangannya adalah untuk "menggabungkan" semua geometri menjadi satu ... harap masuk akal :)

Ada saran?

PS ... dan jika ada di antara Anda yang memiliki cara yang lebih baik untuk mengulang melalui idList ... beri tahu saya :)

MEMPERBARUI:

Terima kasih banyak untuk Petr! Ikuti instruksi Anda dan itu berhasil pada percobaan pertama!

Inilah kode yang akhirnya saya dapatkan:

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
                }
Claus_L
sumber
Selain itu, pernahkah Anda berpikir untuk membuat ini skrip yang tidak jelas? Ini cara yang jauh lebih mudah dalam melakukan sesuatu.
Berbulu
@ Hairy - Saya tidak punya pengalaman dengan arcpy, jadi .... :) Saya dapat memberitahu Anda bahwa kode di atas adalah bagian dari add-in yang kami kirimkan kepada pelanggan kami. Kami memilih add-in karena kami ingin membuat semuanya semudah mungkin bagi pelanggan kami :)
Claus_L
Tidak bisa lebih sederhana dari python, salah satu bahasa termudah yang pernah saya gunakan. Dapat dikirim sebagai alat di dalam kotak alat ke klien Anda. Saya serius akan melihat ini.
Berbulu

Jawaban:

8

Anda dapat menggunakan ITopologicalOperator.ConstructUnion .

Langkah-langkahnya adalah sebagai berikut:

  1. Buat instance Polygonkelas dan melemparkannya ke ITopologicalOperator. Instance poligon ini akan berisi hasilnya.
  2. Karena ITopologicalOperator.ConstructUniondibutuhkan IEnumGeometryuntuk menentukan geometri yang akan disatukan (atau dengan kata-kata Anda, menyatukan), buat instance GeometryBagkelas, yang mengimplementasikan IEnumGeometry.
  3. Keluarkan tas geometri IGeometryCollectionsehingga Anda dapat menambahkan poligon sumber ke dalamnya.
  4. Berikan tas geometri Anda ke ITopologicalOperator.ConstructUnionmetode pada poligon yang dibuat pada langkah 1.

Sejauh menyangkut penghitungan pilihan, metode Anda mengambil daftar ID dan mendapatkan baris untuk setiap ID tunggal SANGAT tidak efisien. Kinerja jauh lebih baik jika Anda hanya menggunakan IFeatureSelection.SelectionSet.Search()metode. Anda akan menentukan nullargumen filter kueri saat memanggil metode ini karena Anda ingin semua fitur dalam seleksi. Hasilnya akan menjadi kursor yang dapat Anda hitung.

Petr Krebs
sumber
Terima kasih banyak telah membantu pemula GIS! Bekerja dengan sempurna :)
Claus_L
1
Aku harus mengatur SpatialReferencepada GeometryBagsebelum menambahkan elemen. Kalau tidak, ConstructUnionakan gagal.
Gumo