AE开发之
题型:
1.填空
2.选择
3.注释
4.写代码
浏览角度,添加书签和书签的管理
随时添加感兴趣区,看所添加的书签,感兴趣哪一块区域就可以看哪一个。文本文字就是标签的名称,感兴趣的区域就是取得地图的区域,放在标签的location里面。
保存下来的感兴趣区域,进行查看,则可以用BookList。
鹰眼窗口的制作,主窗口范围进行更新,则会激发extendupdata事件。鹰眼窗口里面也是,鼠标进行mouseDown的时候,判断是左还是右键,获取地图位置
在上面
添加shapefile文件,鹰眼窗口不显示,因为没有激发replace事件,鹰眼窗口在添加图层的函数,mapreplace事件,或者在mapreplace事件,在添加一个图层的时候,就调用这个函数,当然在加入所有层之前,要先清除之前的层。
添加地理要素,
点选对象
拉框显示对象
拉框范围内有空间拓扑关系
点与点,点与线,线和线,面与面
矩形框内的,矩形框外的,与矩形框没有相接关系的
绘制高亮显示的形式是在哪里,是在图层里面绘制的嘛?但是一选择就高亮显示,选择集的选择。
另外一个要素集合,选择集集合,选择的是处于选择上的要素,都放在选择集里面,要放在这个集合里面就可以,颜色可以设定,选择有多种形式,点选,拉框,画多边形
选择集:地图的选择集。画点线面各种要素,地图它有选择集,地图有地图的选择集,要进行区分,选择集里面取消清空,可以取消高亮选中
缩放到所选要素
如何实现呢?
当前所选择所有要素,都显示在窗口内,最大窗口都可以看到
实现栅格计算器
(可以用现成文件,但最好自己写一遍)
在某一个指定层里面,选择图层,当前加载的所有图层,那么怎么把所有名称加入到这里面呢,怎么把图层名称放进来,图层加载会激发load事件,所以要在load事件把所有图层名称取下来,添加到这个地方,添加到列表当中
点击CITY,或者其他层,发生什么变化呢?
当前所选择到的层的所有字段,所有属性都加入到下面的框中。
选择一个层,把这个层所有字段名称都放在下面的框中,有了层,那么对应的数据源就可以找到,也就是feature class是一个数据源,会不会有字段集合呢?
矢量的图层和feature class,除了有空间数据和属性数据,都是用一个字段进行存储,字段进行存在,可以组合,形成一个字段集合,开始循环,依次把这个字段名称加入进来,
要素类的字段集合访问,每一个字段访问到,并把它取过来
获取属性唯一值
类别只有20类,code唯一值附上,前面的这些过程,主要就是用于构建,“cikou”查询,是干什么用的呢?
条件查询和查询条件,查询,code查询,==407的,在我当前的窗体里面code里面等于407的要素,进行查询到,点击确定,写入查询条件。
selet * from A 的形式
构建查询条件,实现属性查询,对featureclass字段和访问进行学习和熟悉
toolaction需要给其赋值
拉框这个动作也是激发这个mouse_Down事件里面做工作,
需要一个结构,进行点选的时候,e.X和e.Y是屏幕坐标的值,e.Map.x是地图里面的。
e.x-5等操作,是构建一个矩形框,若为e.map.x是是地图的地图坐标,是十个像素的。
选择一个线,若是一个点的话,则会发生,不选在那个像素上不准确则无法选择。我们这样构造一个10个像素的矩形,则不用担心这个。
当前视窗,有一个来回转换的对象,进行坐标转换,,这个“4”是转换方向
查transformRect 中的0 1 2 3 4 含义
把屏幕坐标转换为地图坐标,屏幕坐标到地图坐标的来回转换
地理坐标参考。
selectByShape (我们最后目的就是为了这个方法的实现)
进行框选,进行叠加运算,矩形框进行相交和框选的办法
使用矩形框进行要素的选择,选择到的要素放在哪里去了呢,放在地图的选择集当中,放进去后就会进行高亮显示
refresh里面加参数,绘制的阶段,绘制的接口,这里是一个枚举类型,我们绘制它的GeoSelection,(C++开发地图绘制的过程是什么,首先去访问到最底层的图层,如果是矢量层,一条条去访问,把其空间数据取出来,指定的空间范围内进行绘制,再到倒数第二层进行绘制,把所有层绘制完后,一次性显示到地图上)如果要素非常多,MapControl.refresh把所有要素重新绘制和刷新,绘制效率刷新效率会非常慢。
mapControl提供了一个阶段,我只刷新选择集里面的,在选择的位置进行绘制,刷新,其余位置不需要绘制刷新,提高了效率。很多view的阶段,目的是提高刷新效率。
拉框有无可能点了个点,没有拉出框来,在这个位置拉一个10*10的矩形框,转换成一个envelop,调用一个selectByShape,如果是一个多边形,则绘制一个多边形
出一个题目,让大家自己编,会嘛?
尝试性的做一做。
点击窗体,首先激发load函数,激发一个属性,一个Map属性,定义了好多的字段,表示的我们选择的哪一个,字段变量,字段表里面,我们需要主要找一个字段,当前选择的是哪一个层,是哪一个字段
查file对象,file的类,当前选择的层和对应的集合是什么
选择的层名称,选择的字段名称,编辑框的字符串,字段赋值,
窗体字段是什么含义呢
窗体被加载的时候,我们需要做什么事情呢,我们要在窗体上去,把图层名称加上,进行判定,图层名称的Eterms进行清空,如何layers属性,把所有图层,都存放在集合里面,IEnumLayer暴露出的这个接口,可以reset , next,可以依次的进行操作,栅格层我们进行加进来了,栅格层没有什么字段,只加矢量层,看看有无矢量层的这个接口,、、
把图层名称获取,进行添加
在command Box里面选择一个图层的时候,我们出现的情况是什么呢,在listBox选择图层的字段进行选择,在选中不同的图层的时候,进行加载,激发selectedIndexChanged函数,找到这个图层,再找数据源,再找字段集合,再依次循环访问,添加。
获取当前的图片名称,获取图层名称,编辑一个字符串,当前所有层里面做循环,循环到的名称和选择的名称一致,则找到我们需要的层了。
找到后,把下面select* from的名称进行替换,把层进行接口查询,,获得矢量要素层,获得矢量层对应的数据源特征类,获得要素类的字段集合,字段集合由字段对象组成,清除窗口中的listView控件中的显示的字段列表,获得第 i 个字段,获得字段名称,feature中有一个特殊字段存放空间信息,是一个二进制字段,唯一值不好找,所以提前找到这个字段,若字段不是几何字段则将字段名称添加到listView字段列表控件中
shapeFileName进行判断和选择,找到字段和字段名称进行添加
(循环去找)
唯一值是怎么获取呢?
点击按钮即可,获取唯一值是获取哪一个字段的唯一值呢,这个过程我们也要有,进行字段的选择,取得字段名称是什么呢,
所有唯一值放在listBox当中
、
查询QueryFileter
过滤条件的设置,对象有一个subField,我们这里只添加一个
现在有一个search方法,干什么用呢,用于对当前数据表,在所有数据记录里面,去找满足条件的记录,条件是参数,若没有条件,则全返回,生成pFeatureCursor一个表,返回来矢量的一个表,返回一个矢量游标,
对返回的这个字段,进行统计,统计唯一值,datastatistics唯一值选择的对象,有一个IDataStatistics的接口,指向这个Cursor这个表,进行统计,对当前指定的这个字段进行统计,获取之后我们可以生成,pEnumerator,依次进行循环了,和MoveNext,
current 如果非空,我们就把他变成一个字符串,如果是一个值的话,直接添加进唯一值
添加为唯一值后,在doubleCLick事件当中,组合textwhere当中组合字符串,设计了很多方法,我们用的目的是在这个Ok事件上进行最后一个查询操作,
QueryFilter
我要用什么样的条件呢,whereClause的方法,查询过滤器,我们把满足条件的要素进行查询,查询出来后,把其放入
依次访问列表中每一条记录,每一个记录都是一个feature
就是获取一个feature,所有选择到的,选择到的转换为IFeatureSelection,我们在当前的特征要素层的特征要素。这里面有什么内容呢?这里面有预先设置的两行文本,创建新选择集,还是添加到原有的选择集,两种情况。根据情况写代码,进行判定,创建新的选择集。首先清空原先的选择集,依次获得查询到的特征要素,找到了就添加到选择集中,如果不是选择创建新的,就将特征要素添加到本层的选择集中,地图刷新。
构造这个查询过滤器,依次获得查询到的特征要素,
地图刷新。
(属性查询)
老师代码可以参加大赛,
Ifeaturecursor和Icursor ,后者可以没有属性字段,前者可以包括属性字段和空间字段
https://blog.csdn.net/haizhongliangji/article/details/41686217
IFeatureCursor接口可用来访问要素类的一系列要素。虽然它没有继承ICursor接口,但它的操作和ICursor一样。
Cursor:存储在内存中的来自于一个Table或者featureclass的记录集合。Cursor对象允许在一个单个对象中管理记录集,单个移动对象,不允许返回以前的位置。NextRow,NextFeature方法第一次调用时,实际指向第一条记录,之后每一次调用都是指向下一条记录。使用Newrow 或 NewFeature将返回nothing,指示目前已经在Cursor的末尾。
Cursor VS FeatureCursor
Cursor:
用于操作Table(存储在传统数据库中的记录子集),Table对象用于产生一个Cursor类的实例;
FeatureCursor:
用于操作FeatureClass(地理数据集:shapefile,personal geodatabase,enterprise geodatabase)
FeatureClass对象用于产生一个FeatureCursor类的实例.
其它的区分:QueryFilter VS SpatialFilter
QueryFilter 和 SpatialFilter都是组件类。QueryFilter 用于属性查询,可以在内存中产生用于限制记录子集的对象。SpatialFilter是空间查询。空间查询只能用于FeatureClass,它是一种QueryFilter ,可以访问其所有的属性和方法,因而可以使用QueryFilter 的whereClass属性来绑定空间的属性限制。
1 ISpatialFilter pSpatialFilter = new SpatialFilterClass();
2 pSpatialFilter.Geometry = pFloodPolygon;
3 pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
4 pSpatialFilter.WhereClause = "Prop_val>1000000";
5 pFCursor = pFLayer.Search(pSpatialFilter, true);