8 votos

La geometría de múltiples características seleccionadas en una geometría

Vamos a ver si puedo explicar lo que estoy tratando de hacer. Primero de todo, he desarrollado un programa de ayuda para ArcMap que puede tomar una función seleccionada (Polígono) en una capa, se agarra la geometría de esa característica, y guardarlo en una base de datos SQL Server. Lo que me gustaría hacer es guardar varias características seleccionadas, no como individuo geometrías (es decir. una fila por cada característica/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 se puede ver que puedo conseguir todos los índices de las características seleccionadas de la capa seleccionada y obtener la geometría, el reto es "concatenar" todas las geometrías en una sola...la esperanza tiene sentido :)

Alguna sugerencia?

P. S ...y si alguno de ustedes tiene una mejor manera de recorrer la idList...por favor, hágamelo saber :)

ACTUALIZACIÓN:

Un GRAN agradecimiento a Petr! Seguido sus instrucciones y funcionó en el primer intento!

Aquí está el código que terminó con:

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
                }

8voto

Nathan Bedford Puntos 3157

Usted puede utilizar ITopologicalOperator.ConstructUnion.

Los pasos serían como sigue:

  1. Crear una instancia de la Polygon de clase y de reparto que a ITopologicalOperator. Este polígono instancia contiene el resultado.
  2. Desde ITopologicalOperator.ConstructUnion lleva un IEnumGeometry para especificar la geometría de la unión (o, en sus palabras, concatenar), crear una instancia de GeometryBag de la clase que implementa IEnumGeometry.
  3. Elenco de la geometría de la bolsa de a IGeometryCollection , de modo que usted puede agregar a su fuente de polígonos.
  4. Pase su geometría de la bolsa a la ITopologicalOperator.ConstructUnion método en el polígono creado en el paso 1.

Tan lejos como la enumeración de la selección de que se trate, su método de obtención de la lista de los Identificadores y llegar a la fila para cada uno de los ID es MUY ineficiente. El rendimiento es mucho mejor si usted acaba de uso IFeatureSelection.SelectionSet.Search() método. Debe especificar un null de filtro de consulta argumento al llamar a este método desde que se desea que todas las características en la selección. El resultado será un cursor que se puede enumerar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X