5 votos

¿Cómo puedo aumentar el rendimiento de la inserción de elementos con geometría poligonal?

Tengo un problema al insertar características con la clase de característica de polígono en FGDB. Este es mi código:

    ... initialising some fields (does not affect performance)
    m_featureBuffer.Shape = CreateShape(feature);
    m_insertCursor.InsertFeature(m_featureBuffer);

Crear forma:

    protected override ESRI.ArcGIS.Geometry.IGeometry CreateShape(IAbstractFeature feature)
    {
        IArea area = (IArea)feature;

        ESRI.ArcGIS.Geometry.IPointCollection polygon = new ESRI.ArcGIS.Geometry.PolygonClass();
        foreach (Point2D point2d in area.Polygon.OuterBoundaryIs.Coordinates)
        {
            ESRI.ArcGIS.Geometry.IPoint point = new ESRI.ArcGIS.Geometry.PointClass();
            point.PutCoords(point2d.X, point2d.Y);
            polygon.AddPoint(point);
        }
        return (ESRI.ArcGIS.Geometry.IGeometry)polygon;
    }

En este caso, la inserción de ~1500 polígonos lleva unos ~110 segundos. Si comento esta línea

m_featureBuffer.Shape = CreateShape(feature);

¡la inserción tarda ~10 segundos! Si creo polígonos vacíos y los paso en la propiedad Shape del buffer de características, también tarda ~10 segundos.

He intentado utilizar el IFeatureClassLoad según el ejemplo de ESRI, pero no ayuda al rendimiento.

0 votos

¿Para qué sirve la función CreateShape? ¿Está construyendo nuevos polígonos a partir de los límites exteriores de los polígonos entrantes? Parece como si tuvieras que hacer un bucle a través de un número potencialmente desconocido de vértices dependiendo del tamaño del polígono y la complejidad y construir un nuevo polígono a partir de vértices individuales. Creo que esta es la parte lenta. ¿Has considerado construir la geometría que quieres a partir de anillos de polígonos en lugar de vértices?

0 votos

Tengo un array de puntos como entrada. Traté de construir anillos de ellos y pasar a AddGeometry método de IGeometryCollection interfaz de polígono, pero no ayudó.

0 votos

¿Por qué puntos? ¿Es necesario hacer en un nivel tan bajo? ¿Por qué no iterar a través de los anillos poligonales y utilizar el que desee?

2voto

Portable Mind Puntos 53

Solución (del ejemplo de ESRI):

public void CreatePolygonByPoints()
{
    IGeometryBridge2 geometryBridge2 = new GeometryEnvironmentClass();
    IPointCollection4 pointCollection4 = new PolygonClass();

    // aWKSPointBuffer - array of WKSPoint structures (input points in my case)
    // WKSPoint[] aWKSPointBuffer;
    geometryBridge2.SetWKSPoints(pointCollection4, ref aWKSPointBuffer);
}

En mi caso creo anillos para los límites exteriores e interiores mediante este método y luego los añado al polígono mediante el método AddGeometry.

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