Mal sehen, ob ich erklären kann, was ich versuche zu tun. Zunächst habe ich ein AddIn für ArcMap entwickelt, mit dem ein ausgewähltes Feature (Polygon) auf einer Ebene übernommen, die Geometrie dieses Features erfasst und in einer SQL Server-Datenbank gespeichert werden kann. Ich möchte mehrere ausgewählte Features speichern, nicht als einzelne Geometrien (dh eine Zeile pro Feature / Geometrie), sondern als ein "Stück Geometrie", das die ausgewählten Polygone enthält. Dies ist der Code, den ich bisher habe:
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
}
Wie Sie sehen können, kann ich alle Indizes der ausgewählten Features der ausgewählten Ebene und die Geometrie abrufen. Die Herausforderung besteht darin, alle Geometrien zu einer "zu verketten" ... hoffe, es macht Sinn :)
Irgendwelche Vorschläge?
PS ... und wenn einer von euch eine bessere Möglichkeit hat, die IdList zu durchlaufen ... lass es mich wissen :)
AKTUALISIEREN:
Ein großes Dankeschön an Petr! Befolgen Sie Ihre Anweisungen und es hat beim ersten Versuch funktioniert!
Hier ist der Code, mit dem ich gelandet bin:
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
}