要素闪烁的另一种方法
以前曾经写过一篇blog介绍如何使用自定义的方法来实现要素闪烁,除了使用控件的flash方法,的确可以通过自己编写代码的方法,其实就是拿ScreenDisplay对象做文章。今天再看《Exploring ArcObjects》的时候,突然发现一个接口IIdentify的返回对象IFeatureIdentifyObj也可以实现这个功能。特摘录代码如下:
Dim pEnvs As IEnvelope
pEnvs = AxMapControl1.TrackRectangle
Dim pLayer As IFeatureLayer
pLayer = pMainMap.Layer(0)
Dim pIdentify As IIdentify
pIdentify = pLayer
Dim pArr As IArray
pArr = pIdentify.Identify(pEnvs)
Dim pFtIdenObj As IFeatureIdentifyObj
Dim pIdenObj As IIdentifyObj
If Not pArr Is Nothing Then
Dim j As Integer
For j = 0 To pArr.Count - 1
pFtIdenObj = pArr.Element(j)
pIdenObj = pFtIdenObj
pIdenObj.Flash(pMainAV.ScreenDisplay)
pIdenObj = Nothing
pFtIdenObj = Nothing
Next
End If
Related Items
Comments
这不是什么渲染的问题,而是AO最简单的问题。方法如下:
dim pMap As IMap
pMap=***(获得MAP对象的方式依据你开发方式不同而不同)
dim pAV As IActiveView
pAV=pMap
pAV.Extent=***(将视图范围设置为你想设置的范围,这是一个IEnvelope对象)
谢谢哈,我试试看
我是用JAVA开发,这个代码有点看不懂,我慢慢翻译看看(能提供点JAVA代码就好了,嘿嘿)
而且我说的区域是指地图上某个市区,县区什么的,这个区域怎么提取确定下来我还不清楚.
麻烦你了哈
您好,我已经在网上订购了您出的书籍,我是个初学者,能不能知道您的联系方式呢,比如MSN ,QQ什么的,有很多问题想要请教,我的邮箱:dingky@163.com.
那个《关于我》里面就有啊
现在有一个要素pfeature,想知道该要素的名字,也就是在字段中相当于Name字段的值(但也不一定是Name,也可能是STATE_NAME等),如果是上面这种情形,可以通过pIdenObj.Name属性得到这个要素的名字.但是如果不是这种情况,是否还有其他的方法得到这个要素的名字呢?作者能够给出一两种方法?在此谢过!
这个东西恐怕你理解错了,一个feature除了自动生成OID字段来进行唯一标识外,系统本身不提供其它任何的文本或数字字段来标识要素。因此,name或者是state_name这种字段,你自己设计了,它就有,你没有设计,就没有。pIdenObj.Name返回的并不是要素的名字,而是一个要素的“primary display field”的值。而这个字段到底是什么,可以使用IFeatureLayer.DisplayField属性来设置或获取。
哦,我本来也觉得奇怪.但是上面的例子中pIdenObj.Name返回的这个值是怎么得到的,经作者上面的解说,了解了一些.但是还有不明白的地方是:一个要素的“primary display field”的值在编程的时候可能并没有设置,不知它的默认情况是怎样设置的.另外,在点击查询的时候,例如如果ArcMap中有一个USA的States的要素类,在使用IdentifyDialog时,在图层的下面将会显示要素的STATE_NAME字段的值,这个值是怎么得到的.当然这里的要素类不一定是States.这里好像也可以使用上面的pIdenObj.Name属性来得到,不知道从其他的方式如何得到.另外是否可以介绍一下IndentifyDialog查询的机理.
看来你没有查阅文档的习惯,开发帮助上写的很清楚:
Usually this field name contains the string "name", or is the first string field found in the layer's attributes. This field is used to show map tips for the layer. The value of this property must match the name of one of the fields in the layer's FeatureClass
IndentifyDialog被封装为DLL,所以我不清楚其查询的机理,但个人猜测如下:
1.点击鼠标,将点击获得的Point对象做一个buffer
2.将Map中所有存在的图层分别进行空间运算,如点要素类的点是否在该buffer内?线要素类的线是否与buffer相交,该buffer是否在面要素类的要素中
3.将存在的要素取出保存到一个集合对象中,显示
不知以为然否?
hello teacher..
What can i do,if i select some line
and the line can change color.
ex.select features 's application
i develope AO by VBA.
please help me teacher.
你的这个问题不是AO所关注的,它是数据显示的一部分,通常是使用MXD来定义和保存这些要素的外观.
这个方法似乎不能在ArcEngine环境下用哦,不知道是不是需要装ArcInfo desktop,还是这个方法本身的Bug。
由于客户需求,需要在Engine下实现一个类似于identify tool的工具,显示某个点的一些信息。当点击一个点时,需要进行闪烁提示,在开发计算机(装了9.1的Desktop和Engine,打了sp2)上,一切正常。但是拿到其他只装了runtime的计算机上后(我试了3台计算机,一台还是刚安装的系统),到IIdentifyObj.Flash时,不会产生闪烁效果。而且更要命的是,此时还会产生一个无法捕获的异常,导致flash以后的语句无法执行,费了好大力气才把这个问题找到,还是以前用异或笔去画的方法好使
是的,这个方法是不能在AE上运行,因为IIdentifyObj类不包含在AE库中,但我的blog上也介绍了一种使用异或画笔的方法,我自己开发的程序都是使用这种画笔来闪烁要素的。
你好,为什么我用上面的方法,要素不闪烁?代码如下:
IEnvelope pEnv = (IEnvelope)axMapControl1.TrackRectangle();
IFeatureLayer pFLayer = (IFeatureLayer)axMapControl1.Map.get_Layer(0);
IIdentify pIIdty = (IIdentify)pFLayer;
IArray pArr;
IFeatureIdentifyObj pFObj;
IIdentifyObj pObj;
IPoint pPoint = new PointClass();
pPoint.PutCoords(e.mapX,e.mapY);
pArr = pIIdty.Identify((IGeometry)pEnv);
for (int i = 0; i < pArr.Count; i++)
{
pFObj = (IFeatureIdentifyObj)pArr.get_Element(i);
pObj = (IIdentifyObj)pFObj;
pObj.Flash(axMapControl1.ActiveView.ScreenDisplay);
pFObj = null;
pObj = null;
}
谢谢!
你好,我是大连理工的研究生,我正在用vc和ae进行开发。咨询一个要素闪烁问题。我的本意是这样的:当鼠标滑过或单击在要素点上时,可以用tip的方式显示要素的简要信息。要怎么做,用到哪些接口?谢谢你了。你这段代码我看的不是很明白。
IFeatureLayer的DisplayField,ShowTips,TipText均可。
你好,我现在在做符号库的开发,新学有不懂的地方。我想先获取一个图层中的所有点要素,然后挨个用字符匹配,期间的问题是:无法获取点要素的坐标,请问怎样才能获取啊?点要素在地图上确定位置的时候,是根据什么确定的?谢谢啊 !
IFeatureLayer--IFeatureClass--IFeature--SHAPE--x和y
For j = 0 To pArr.Count - 1
pFtIdenObj = pArr.Element(j)
pIdenObj = pFtIdenObj
pIdenObj.Flash(pMainAV.ScreenDisplay)
//测试用,
MessageBox.Show("Layer:" + pIdenObj.Layer.Name + " Feature:" + pIdenObj.Name);
pIdenObj = Nothing
pFtIdenObj = Nothing
Next
在进行pIdenObj.Flash时,第一次循环时,就跳出去了也不会有message提示出来,不知道为什么?
这个方法因为采用了循环的方式,如果一次选中多个要素,那么会循环闪烁,不是一个最好的方法,但是只选中一个要素的时候,是完全可以的。
21楼的,你有什么好的方法吗?可以一下闪烁选择的多个要素吗?我按照网上的代码,一直没有弄好。留一下我的QQ;17082209,希望能像你请教。谢谢
Leave a comment
Or, take a look at Archives and Categories
你好,我是北航计算机学院的学生,现在正开始使用ArcObjects做开发,有个地图渲染的问题(我猜应该是渲染方面的)想请教你一下,就是如何改变地图上一个区域(应该是polygon吧)的颜色,要用到哪些接口什么的,ArcObjects的接口什么的太多了,实在无从找起。
先谢谢哈!