示例数据路径:C:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Samples\data\StreamflowDateTime
大体效果:
代码段解析:
1.查询容差的获取
pMxDoc = (IMxDocument)ArcMap.Application.Document; // calculate tolerance rectangle to identify features inside it int Tolerance = 0; Tolerance = pMxDoc.SearchTolerancePixels; IDisplayTransformation pDispTrans = null; pDispTrans = pMxApp.Display.DisplayTransformation; tagRECT pToleranceRect = new tagRECT(); pToleranceRect.left = X - Tolerance; pToleranceRect.right = X + Tolerance; pToleranceRect.top = Y - Tolerance; pToleranceRect.bottom = Y + Tolerance; IEnvelope pSearchEnvelope = null; pSearchEnvelope = new EnvelopeClass(); pDispTrans.TransformRect(pSearchEnvelope, ref pToleranceRect, (int)(esriDisplayTransformationEnum.esriTransformPosition | esriDisplayTransformationEnum.esriTransformToMap));通过IMxDocument.SearchTolerancePixels获取像素容差,之后通过IDisplayTransformation接口,将鼠标点击的平面坐标x,y生成一个tagRect。
在之前的工作中,用到鼠标拾取要素之类的功能,通常的做法是获取鼠标点的位置,按照一定距离缓冲之后进行查询,这个一定距离是在代码中写死的,该功能只适用于某种业务场景,比如,一般缓冲0.5。这种查询方式存在问题:对于投影坐标,0.5的缓冲还算合适,可对于地理坐标系,缓冲0.5代表的是缓冲0.5度,这时候空间查询的范围相当大。Sample中的查询方式,通过读取地图中的查询像素容差,再将像素容差转换为地图图形进行空间查询。
2.要素拾取
IIdentify pIdentify = null; pIdentify = (IIdentify)pMxDoc.FocusMap.get_Layer(0); if (pIdentify == null) { MessageBox.Show("No layer"); return; } IArray pIDArray = null; pIDArray = pIdentify.Identify(pSearchEnvelope);在之前的工作中,用到鼠标拾取要素时,通常的做法是构建ISpatialFilter对象,以鼠标当前的位置进行空间查询。Sample中通过IIdentify接口实现查询,FeatureLayer等图层对象都实现该接口,查询结果为IArray对象。
IArray对象中的具体对象为IIdentifyObj对象(大体翻译为 图层的被识别对象),该对象包含Flash()方法,可以用于实现对拾取对象的闪烁。
3.IDisplayTable接口 Provides access to members that work with the display table associated with a standalone table.
通常,使用IFeatureLayer.FeatureClass接口,获取的Table对象,为要素图层数据源的表,
而使用IDisplayTable接口获取的Table对象,包含Join的表。
官方帮助建议,如果想让你的程序足够通用,使用IDisplayTable接口。
4.IFeatureLayerDefinition接口,获取图层的选择集,大致同ArcMap中的定义查询功能。
5.获取要素的Symbol,使用ILookupSymbol接口
ILookupSymbol pLookupSymbol = null; pLookupSymbol = (ILookupSymbol)pGeoFeatureLayer.Renderer; IFeature pFeature = null; pFeature = (IFeature)pRowIDObj.Row; IMarkerSymbol pSymbol = null; pSymbol = (IMarkerSymbol)pLookupSymbol.LookupSymbol(false, pFeature);6.IDataGraphWindow2 :Provides access to members that control the DataGraph Window. ESRI自带的专题图窗口