5 votos

¿Cómo actualizar la geometría en ArcObjects?

Estoy empezando con ArcObjects y quiero actualizar las coordenadas de los vértices de la geometría. Específicamente, quiero intercambiar las coordenadas X, Y para cada vértice de los polígonos (que pueden ser multipartes y tener anillos interiores).

He encontrado un tema de ayuda en la web Actualización de la geometría de los elementos existentes donde ITransform2D se sugiere la interfaz. Pero sus métodos no parecen resolver mi problema directamente. Creo que puedo usar Move pero requiere calcular dx y dy.

¿Es posible hacer la sustitución de coordenadas en ArcObjects como en Python? vertex.X = vertex.Y pero sin recrear la geometría? (esto es bastante complicado en Python para polígonos con anillos interiores)

He adaptado el código de @vinayan, pero no hace nada. ¿Qué me falta?

protected override void OnClick()
{
    IMxDocument mxDocument = ((IMxDocument)(ArcMap.Application.Document)); // Explicit Cast   
    IContentsView currentContentsView = mxDocument.CurrentContentsView;
    IFeatureLayer featureLayer = (IFeatureLayer)currentContentsView.SelectedItem; // Explicit Cast
    IFeatureClass featureClass = featureLayer.FeatureClass;

    //Get the Feature or FeatureCursor as you like..
    IFeatureClass pFC = featureClass;
    IFeature polygonFeature = pFC.GetFeature(1);

    IPointCollection pPtsColl = (IPointCollection)polygonFeature.ShapeCopy;

    //swap X and Y
    double tempValue;
    IPoint pPoint;

    for (int i = 0; i < pPtsColl.PointCount; i++)
    {
        pPoint = pPtsColl.get_Point(i);
        tempValue = pPoint.X;
        pPoint.X = pPoint.Y;
        pPoint.Y = tempValue;
    }

    //Update Feature
    polygonFeature.Shape = (IGeometry)pPtsColl;
    polygonFeature.Store();
}

3voto

kjo Puntos 197

El siguiente fragmento podría ayudar

//Get the Feature or FeatureCursor as you like..
IMxDocument pMxdoc = (IMxDocument)m_application.Document;
IMap pMap = pMxdoc.FocusMap;

IFeatureLayer pFtrLyr = (IFeatureLayer)pMap.get_Layer(0);
IFeatureClass pFC = pFtrLyr.FeatureClass;

IFeature polygonFeature = pFC.GetFeature(yourobjectid);

IPointCollection pPtsColl = (IPointCollection)polygonFeature.ShapeCopy;

double tempValue;
IPoint pPoint;

IPointCollection updColl = new PolygonClass();

for (int i = 0; i < pPtsColl.PointCount; i++)
{
    pPoint = pPtsColl.get_Point(i);
    tempValue = pPoint.X;
    pPoint.X = pPoint.Y;
    pPoint.Y = tempValue;

    object missing = Type.Missing;

    updColl.AddPoint(pPoint, ref missing, ref missing);
}

polygonFeature.Shape = (IGeometry)updColl;
polygonFeature.Store();

La mejor solución sería seguir el comentario de @WHuber de hacer una transformación afín..algo que se puede hacer usando IAffineTransformation2D así que no habrá que preocuparse por los polígonos multiparte y los polígonos con agujero

1voto

FlySwat Puntos 61945

Sí. Mira IPointCollection y la interfaz IPoint.

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