Veamos si puedo explicar lo que estoy tratando de hacer. En primer lugar, he desarrollado un complemento para ArcMap que puede tomar una entidad seleccionada (Polígono) en una capa, tomar la geometría de esa entidad y guardarla en una base de datos de SQL Server. Lo que me gustaría hacer es guardar varias entidades seleccionadas, no como geometrías individuales (es decir, una fila por entidad / geometría) sino como una "pieza de geometría" que contiene los polígonos seleccionados. Este es el código que tengo hasta ahora:
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
}
Como puede ver, puedo obtener todos los índices de las características seleccionadas de la capa seleccionada y obtener la geometría, el desafío es "concatenar" todas las geometrías en una ... espero que tenga sentido :)
¿Alguna sugerencia?
PD ... y si alguno de ustedes tiene una mejor manera de recorrer la idList ... hágamelo saber :)
ACTUALIZAR:
¡Muchas gracias a Petr! ¡Seguí tus instrucciones y funcionó en el primer intento!
Aquí está el código con el que terminé:
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
}