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
}
Jawaban:
Anda dapat menggunakan ITopologicalOperator.ConstructUnion .
Langkah-langkahnya adalah sebagai berikut:
Polygon
kelas dan melemparkannya keITopologicalOperator
. Instance poligon ini akan berisi hasilnya.ITopologicalOperator.ConstructUnion
dibutuhkanIEnumGeometry
untuk menentukan geometri yang akan disatukan (atau dengan kata-kata Anda, menyatukan), buat instanceGeometryBag
kelas, yang mengimplementasikanIEnumGeometry
.IGeometryCollection
sehingga Anda dapat menambahkan poligon sumber ke dalamnya.ITopologicalOperator.ConstructUnion
metode 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 menentukannull
argumen filter kueri saat memanggil metode ini karena Anda ingin semua fitur dalam seleksi. Hasilnya akan menjadi kursor yang dapat Anda hitung.sumber
SpatialReference
padaGeometryBag
sebelum menambahkan elemen. Kalau tidak,ConstructUnion
akan gagal.