关于ARCGIS中IDENTIFY功能的实现
一:功能实现的基本思路是这样的:
1. 点击时,先获取点击位置的屏幕坐标,然后转换到地图坐标;
2. 定义一个图层对象(Identify),调用相应的Identify方法生成点对象;
3. 提取图层中点击处的图形,提取属性,填充到事先设计好的窗口中;
4. 显示窗口。
二:代码
IIdentify pIdentify; //IIdentify接口(要素图层下的一个接口)定义了获得要素图层单个要素的属性的捷径方法。它有一Identify方法,返回一个IArray数组对象。
IPoint pPoint;
IArray pIDArray;
IFeatureIdentifyObj pFeatIdObj;//定义一个要素对象
IIdentifyObj pIdObj;
IMap pMap = axMapControl1.Map;//将当前地图赋给地图对象pMap
pIdentify = pMap.get_Layer(0) as IIdentify;//将图层赋给图层对象pIdentify
pPoint = new PointClass();//定义了一个实现IPoint接口的点对象
pPoint.PutCoords(e.mapX, e.mapY);//pPoint.PutCoords用来设置点的X,Y值从而创建一个点对象。
pPoint.SpatialReference = pMap.SpatialReference;
pIDArray = pIdentify.Identify(pPoint);//Identify方法返回一个Array数组对象
if (pIDArray != null)
{
pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj;//获得要素集数组中的第一个元素
pIdObj = pFeatIdObj as IIdentifyObj;
pIdObj.Flash(axMapControl1.ActiveView.ScreenDisplay);//选中要素闪烁
MessageBox.Show("Layer˖ + pIdObj.Layer.Name +
System.Environment.NewLine + "Feature˖ + pIdObj.Name);//显示要素所在图层的名字,要素的的名字
}
else
MessageBox.Show("没有要素选中");
程序的运行结果如图,说明Identify方法生成的数组为空,如下图;
三:程序调试
问题分析:
出现上述问题的原因是IPoint没有和图层建立关系,即无论你有没有点到图层中的点,程序都会通过pPoint.PutCoords(e.MapX,e.MapY)生成点对象,但是pIdentify.identify()方法对参数(pPoint)的传递无响应,该方法只会识别图层中的元素,因此返回的数组始终是空NULL;
问题解决:
参考AE帮助中的DEMO,在此不用point对象,建立一个Envelop对象pEnv(相当于缓冲区), 将该对象作为参数传递给Identify方法就可以了
最终运行结果
四:相关理论知识总结
用到的相关对象 方法 接口:
IMap接口 是开始多数GIS任务的起点,它主要用于管理Map对象中的layer对象,要素选择集、MapSourround对象、标注引擎和空间参考等对象。IMap接口中定义了大量的方法来操作它其中的图层对象(如:AddLayer 、ClearLayers)。
IIdentify接口定义了获得要素图层单个要素的属性的捷径方法。它有一个Identify方法,返回一个IArray数组对象。
IPoint接口定义了Point对象的属性和方法,ID属性可以返回点队形的ID号。使用IPoint::X和IPoint::Y用户可以获得一个点的X和Y的坐标值。
IPoint::PutCoords用于设置一个点的X、Y坐标值,当用户new完成一个Point后,可以用这个方法来建立一个实际的点对象。
包络线Envelop:
Envelop通过它的最大和最小X,Y坐标来定义一个矩形形状,因此包络线对象相对于它的空间参考而言总是直角的。包络线也定义了最大的和最小的Z值、M值,这两个值分别通过IZAware,IMAware接口来定义。
IEnvelope::PutCoords:提供了一种构造了包络线的方法,它通过传入XMin,YMin,XMax,YMax四个点对象而返回一个包络线;IEnvelop::Query则可以返回一个包络线的四个值。
五:
该程序的属性显示用了一个MESSAGEBOX,功能过于简单,没法对元素所有属性字段的显示,需要找一个合适的控件对其属性进行展示。