Vamos ver se consigo explicar o que estou tentando fazer. Primeiro, desenvolvi um AddIn for ArcMap que pode levar um recurso selecionado (Polygon) a uma camada, pegar a geometria desse recurso e salvá-lo em um banco de dados do SQL Server. O que eu gostaria de fazer é salvar vários recursos selecionados, não como geometrias individuais (ou seja, uma linha por recurso / geometria), mas como uma "peça de geometria" que contém os polígonos selecionados. Este é o código que tenho até agora:
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 você pode ver, posso obter todos os índices dos recursos selecionados da camada selecionada e obter a geometria, o desafio é "concatenar" todas as geometrias em uma só ... espero que faça sentido :)
Alguma sugestão?
PS ... e se algum de vocês tem uma maneira melhor de percorrer o idList ... por favor me avise :)
ATUALIZAR:
MUITO obrigado a Petr! Seguiu suas instruções e funcionou na primeira tentativa!
Aqui está o código que eu acabei com:
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
}
Respostas:
Você pode usar ITopologicalOperator.ConstructUnion .
As etapas seriam as seguintes:
Polygon
classe e faça a conversão paraITopologicalOperator
. Esta instância de polígono conterá o resultado.ITopologicalOperator.ConstructUnion
leva umIEnumGeometry
para especificar as geometrias a serem unidas (ou, em suas palavras, concatenar), crie uma instância daGeometryBag
classe que implementaIEnumGeometry
.IGeometryCollection
que você possa adicionar seus polígonos de origem.ITopologicalOperator.ConstructUnion
método no polígono criado na etapa 1.No que diz respeito à enumeração da seleção, seu método de recuperar a lista de IDs e obter a linha para cada ID é MUITO ineficiente. O desempenho é muito melhor se você apenas usar o
IFeatureSelection.SelectionSet.Search()
método. Você especificaria umnull
argumento de filtro de consulta ao chamar esse método, pois deseja todos os recursos da seleção. O resultado será um cursor que você pode enumerar.fonte
SpatialReference
oGeometryBag
antes de adicionar elementos. Caso contrário,ConstructUnion
isso falharia.