Quiero obtener la función en donde el ratón se hizo clic en mapa. Así que me preguntaba cómo obtener características que cruza con ese punto. Además me preguntaba ¿cómo puedo comprobar qué tipo de objeto es (punto, poli línea, polígono)?
Respuesta
¿Demasiados anuncios?Seleccione en el mapa mediante la selección actual entorno (puede desactivar selectability y visibilidad de las capas, a continuación, este no recogerlos.
En primer lugar usted necesita para ser la creación de una herramienta:
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geodatabase;
namespace RED
{
public class REd : ESRI.ArcGIS.Desktop.AddIns.Tool
A continuación, en el evento OnMouseDown de la herramienta:
protected override void OnMouseDown(MouseEventArgs arg)
{
//if (arg.Button == System.Windows.Forms.MouseButtons.Left) // check for left mouse button if you like
// convert point from 'screen' to 'map' coordinates
IPoint MouseMapPoint = (ArcMap.Document.FocusMap as IActiveView).ScreenDisplay.DisplayTransformation.ToMapPoint(arg.X, arg.Y);
// clear selection first
ArcMap.Document.FocusMap.ClearSelection();
// Select using the shape (point) to
// select the feature(s) - false to select any intersecting, true to select just the first
ArcMap.Document.FocusMap.SelectByShape(MouseMapPoint,(ArcMap.Application as IMxApplication).SelectionEnvironment,false);
// get the (now) selected features
IEnumFeature EnumFeatures = (IEnumFeature)ArcMap.Document.FocusMap.FeatureSelection;
IFeature ThisFeature = EnumFeatures.Next();
do
{
// get the geometry
IGeometry ThisGeom = ThisFeature.ShapeCopy; // IMPORTANT! USE SHAPECOPY not SHAPE
// do something different for each geometry type
if (ThisGeom.GeometryType == esriGeometryType.esriGeometryPoint)
{
// something for points (note: does not include multipoint)
}
else if (ThisGeom.GeometryType == esriGeometryType.esriGeometryPolygon)
{
// something for polygons
}
else if (ThisGeom.GeometryType == esriGeometryType.esriGeometryPolyline)
{
// something for polylines (note: polylines are different to lines)
}
else
{
// unrecognized geometry type
}
ThisFeature = EnumFeatures.Next();
} while (ThisFeature != null);
}
Lo que funciona bien para seleccionar el uso de un punto de... este va a tener problemas al intentar seleccionar un punto o línea de modo para contador que uso un aumento de la búsqueda de búfer (polígono) para hacer la selección:
// to increase the search
IGeometry selectionGeometry = (MouseMapPoint as ITopologicalOperator).Buffer(SmallDistance); // make a buffer
ArcMap.Document.FocusMap.SelectByShape(selectionGeometry, (ArcMap.Application as IMxApplication).SelectionEnvironment, false);
Leer acerca de IMap.SelectByShape, IEnumFeature, ITopologicalOperator y Esri Geometría de las Constantes de Tipo
Normalmente no lo hago de esa manera - la selección de medio ambiente pone en el camino, así que el uso de IMap.Capas para iterar a través de cada capa, a continuación, con un ISpatialFilter hacer una selección en contra de cada capa... que funciona incluso si la capa es invisible y/o no se pueden seleccionar.