4 votos

Obtener el país de GeoFeatureLayer

Actualmente estoy usando ArcGIS y estoy tratando de crear una aplicación básica donde puede hacer clic en un país y luego volver a la información, tales como la forma, el tamaño, etc.

He mirado en los fragmentos de código y la documentación y hasta la fecha esto es lo que yo he venido para arriba con.

IPoint pt = new PointClass();
pt.X = e.X; 
pt.Y = e.Y;

IGeoFeatureLayer layer = myMapControl.get_Layer(0) as IGeoFeatureLayer;
ESRI.ArcGIS.Geodatabase.IFeatureCursor cursor = GetAllFeaturesFromPointSearchInGeoFeatureLayer(1.0 , IPoint , layer , myMapControl.ActiveView)

Así que en este punto puede hacer clic en el mapa, obtener la X,Y las coordenadas del ratón llegar a la base de la capa del mapa de control y, a continuación, obtener la FeatureCursor. Mirando el cursor info, que me hacen ver las cosas como CNTRY_NAME, pero nada de uso. Voy a hacer acerca de esto en el totalmente equivocado de dirección? He mirado en http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html bastante últimamente además de este sitio, pero estoy llegando en blanco.

4voto

bastibe Puntos 3569

Puede que no sea la forma más rápida de obtener la función solicitada utilizando la interfaz de identificación II, pero funciona bastante bien:

 IMxDocument doc = m_application.Document as IMxDocument;
IIdentify2 ident = featLayer as IIdentify2;
int tol = doc.SearchTolerancePixels;

// consruct a small rectangle out of the x,y coord and the document's pixel tolerance
tagRECT r;
r.left = x - tol;
r.top = y - tol;
r.right = x + tol;
r.bottom = y + tol;

// Tranform the device rectange into a geographic rectangle via the display transformation
IEnvelope env = new EnvelopeClass();
int opt = esriDisplayTransformationEnum.esriTransformPosition.GetHashCode()+
          esriDisplayTransformationEnum.esriTransformToMap.GetHashCode();
app.Display.DisplayTransformation.TransformRect(env, ref r, opt);

// setup the spatial reference on the newly hydrated envelope
env.SpatialReference = doc.FocusMap.SpatialReference;

// identify with the envelope
ident.Scale = m_application.Display.DisplayTransformation.ScaleRatio;
IArray ids = ident.Identify(env, null);

if(ids == null || ids.Count == 0) {
    return null;
}

IIdentifyObj obj = ids.get_Element(0) as IIdentifyObj;
IRowIdentifyObject row = obj as IRowIdentifyObject;
return row.Row;
 

m_application es de tipo IApplication, una referencia a su instancia de ArcMap. Y mira el ejemplo en ArcObjects .

2voto

Isaac Solomon Puntos 16554

2voto

John Nolan Puntos 16633

Ya casi estás ahí. Solo tienes que añadir el siguiente código:

     int countryNameIndex = featureClass.Fields.FindField("CNTRY_NAME");

    IFeature feature;
    while((feature = cursor.NextFeature()) != null)
    {
        object countryName = feature.get_Value(countryNameIndex);
        Console.WriteLine(countryName);
    }
 

Si no te gusta el bucle while, puedes agregar el siguiente método de extensión:

     public static IEnumerable<IFeature> ToEnumerable(this IFeatureCursor cursor)
    {
        IFeature feat;
        while ((feat = cursor.NextFeature()) != null)
        {
            yield return feat;
        }
        yield break;
    }
 

Y reemplaza el bucle while con:

     foreach(var feature in cursor.ToEnumerable())
    {
         // add your code here
    }
 

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