实现类似于Identity功能中要素闪烁的另一种方法
为
实现类似于ArcMap中的Identity功能,
昨天找了半天资料,今天又整了将近一天才基本上完成了,实属不易啊。这里我先不说获取要素信息的部分,主要说一下要素闪烁的功能。
网上找的资料大同小异,我都转载到我的博客里了,至少我试了三种方法,但是多多少少都有问题。不是选不中,就是选中不闪烁。
大多数人用的方法是
IIdentifyObj.Flash Method,那我也就试试吧,敲啊敲啊敲,调试运行,有信息但是要素不闪烁,那我就一行一行调,调到
pIdObj.Flash(axMapControl1.ActiveView.ScreenDisplay);//选中要素闪烁
它就是不运行,肿么办呢,查AE帮助呗,我查啊查啊查,
然后我又尊淳教导向IHookActions.DoActions() method进军,搞了两个多小时还是没搞出来,╮(╯▽╰)╭真郁闷! 突然,我想到为啥一定要闪烁呢?我让它高亮也行啊!这个选择要素功能我已经实现了,只不过是框选,圆选等,还没有实现点选,话不多说我就类似于其他的选择方法写点击选择要素添加到 Identity功能模块里 ,写完之后调试运行,点击选择,要素高亮,并且弹出要素信息对话框,偶也\(^o^)/ 上图先!
具体代码如下:
//当然他是写在axMapControl1_OnMouseDown里
//IIdentify接口(要素图层下的一个接口)定义了获得要素图层单个要素的属性的捷径方法。
//它有一Identify方法,返回一个IArray数组对象。
IIdentify pIdentify;
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;
IEnvelope pEnvelope = new EnvelopeClass() as IEnvelope;
IGeometry bufGeo;
ITopologicalOperator bufferPoint = pPoint as ITopologicalOperator;
bufGeo = bufferPoint.Buffer(axMapControl1.ActiveView.Extent.Width / 300);
pEnvelope = bufGeo.Envelope;
pIDArray = pIdentify.Identify(pEnvelope);//Identify方法返回一个Array数组对象
IGeometry pGG = null;
pGG = pPoint;
if (pIDArray != null)
{
pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj;//获得要素集数组中的第一个元素
pIdObj = pFeatIdObj as IIdentifyObj;
//让鼠标点击的点闪烁一次,当然可以根据自己需要调整
axMapControl1.FlashShape(pPoint, 1, 500, null);
axMapControl1.Map.ClearSelection();
axMapControl1.Map.SelectByShape(pGG, null, false);
axMapControl1.Refresh();
//显示要素所在图层的名字,要素的的名字
MessageBox.Show("Layer Name:" + pIdObj.Layer.Name + "\n" + "Feature Name:" + pIdObj.Name);
//点击messagebox确定按钮后,清除选择
axMapControl1.Map.ClearSelection();
axMapControl1.Refresh();
}
else
MessageBox.Show("没有要素选中");
pIdObj.Flash(axMapControl1.ActiveView.ScreenDisplay);//选中要素闪烁
它就是不运行,肿么办呢,查AE帮助呗,我查啊查啊查,
Product Availability
Available with ArcGIS Engine, ArcGIS Desktop, and ArcGIS Server.
没错可以用啊,但是!但是,当我看到Remarks的时候我的心都凉了
坑爹啊!有木有!我想最悲催的事莫过于此了!没错可以用啊,但是!但是,当我看到Remarks的时候我的心都凉了
Remarks
The Flash method is not supported with ArcGIS Engine, use the IHookActions.DoActions() method with the esriHookActionsFlash for this functionality.
The Flash method is not supported with ArcGIS Engine!然后我又尊淳教导向IHookActions.DoActions() method进军,搞了两个多小时还是没搞出来,╮(╯▽╰)╭真郁闷! 突然,我想到为啥一定要闪烁呢?我让它高亮也行啊!这个选择要素功能我已经实现了,只不过是框选,圆选等,还没有实现点选,话不多说我就类似于其他的选择方法写点击选择要素添加到 Identity功能模块里 ,写完之后调试运行,点击选择,要素高亮,并且弹出要素信息对话框,偶也\(^o^)/ 上图先!

//当然他是写在axMapControl1_OnMouseDown里
//IIdentify接口(要素图层下的一个接口)定义了获得要素图层单个要素的属性的捷径方法。
//它有一Identify方法,返回一个IArray数组对象。
IIdentify pIdentify;
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;
IEnvelope pEnvelope = new EnvelopeClass() as IEnvelope;
IGeometry bufGeo;
ITopologicalOperator bufferPoint = pPoint as ITopologicalOperator;
bufGeo = bufferPoint.Buffer(axMapControl1.ActiveView.Extent.Width / 300);
pEnvelope = bufGeo.Envelope;
pIDArray = pIdentify.Identify(pEnvelope);//Identify方法返回一个Array数组对象
IGeometry pGG = null;
pGG = pPoint;
if (pIDArray != null)
{
pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj;//获得要素集数组中的第一个元素
pIdObj = pFeatIdObj as IIdentifyObj;
//让鼠标点击的点闪烁一次,当然可以根据自己需要调整
axMapControl1.FlashShape(pPoint, 1, 500, null);
axMapControl1.Map.ClearSelection();
axMapControl1.Map.SelectByShape(pGG, null, false);
axMapControl1.Refresh();
//显示要素所在图层的名字,要素的的名字
MessageBox.Show("Layer Name:" + pIdObj.Layer.Name + "\n" + "Feature Name:" + pIdObj.Name);
//点击messagebox确定按钮后,清除选择
axMapControl1.Map.ClearSelection();
axMapControl1.Refresh();
}
else
MessageBox.Show("没有要素选中");