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
}
Antworten:
Sie können ITopologicalOperator.ConstructUnion verwenden .
Die Schritte wären wie folgt:
Polygon
Klasse und wandeln Sie diese in umITopologicalOperator
. Diese Polygoninstanz enthält das Ergebnis.ITopologicalOperator.ConstructUnion
eine nimmtIEnumGeometry
die Geometrien zur Vereinigung zu spezifizieren (oder in Ihren Worten, verketten), eine Instanz schaffenGeometryBag
Klasse, die implementiertIEnumGeometry
.IGeometryCollection
so, dass Sie Ihre Quellpolygone hinzufügen können.ITopologicalOperator.ConstructUnion
Methode des in Schritt 1 erstellten Polygons.In Bezug auf die Aufzählung der Auswahl ist Ihre Methode zum Abrufen der ID-Liste und zum Abrufen der Zeile für jede einzelne ID SEHR ineffizient. Die Leistung ist viel besser, wenn Sie nur die
IFeatureSelection.SelectionSet.Search()
Methode verwenden. Sie würdennull
beim Aufrufen dieser Methode ein Abfragefilterargument angeben , da Sie alle Funktionen in der Auswahl haben möchten. Das Ergebnis ist ein Cursor, den Sie aufzählen können.quelle
SpatialReference
auf demGeometryBag
vor - Elemente hinzufügen. SonstConstructUnion
würde das scheitern.