[转]ArcGIS.Server.9.3和ArcGIS API for Flex实现自己的Toc控件(三)

目的:
1.ArcGIS API for Flex没有提供现成的Toc控件,这里来实现自己的Toc控件。
准备工作:
1.在ArcGIS.Server.9.3发布一个叫USA的Map Service,并且把这个Service启动起来。
完成后的效果图:

tocccc.jpg
开始:
1.启动Flex Builder3新建工程以及引入ArcGIS API for Flex library的开发包,这个过程前面2篇都讲过了这里就不啰嗦了。
2.新建LayersOnAndOff.mxml页面,然后在页面上添加Map控件以及设置ArcGISDynamicMapServiceLayer,添加一个ComboBox控件用来地图切换显示。具体代码如下:

 1None.gif<?xml version="1.0" encoding="utf-8"?>
 2None.gif<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="white" xmlns:esri="http://www.esri.com/2008/ags" >
 3None.gif    <mx:Array id="arr">
 4None.gif        <mx:Object label="USA"  data="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" />
 5None.gif        <mx:Object label="USA_2D"  data="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer" />
 6None.gif    </mx:Array>
 7None.gif    <mx:ComboBox id="myURL" selectedIndex="0" horizontalCenter="-329" dataProvider="{arr}"  y="10">
 8None.gif    </mx:ComboBox>
 9None.gif    <esri:Map logoVisible="false" panArrowsVisible="true" width="463" height="288" x="33" y="40" borderStyle="solid" borderThickness="3">
10None.gif    <esri:ArcGISDynamicMapServiceLayer id="myDynamicService" url="{myURL.selectedItem.data}" load="myDynamicService.defaultVisibleLayers()"/>
11None.gif    </esri:Map>
12None.gif</mx:Application>

3.对上面的代码做一下解释,首先添加了一个id为arr的对象数组作为ComboBox的数据源,arr的对象数组包含2个对象:一个是上面发布的USA得rest地址,一个是Esri提供的在线的rest地址。然后在Map控件的ArcGISDynamicMapServiceLayer的url属性绑定ComboBox的选择值,这样当ComboBox选择发生变化时地图也会根据rest地址进行切换显示。
4.接下来做Toc控件了,首先在src目录下新添加一个叫uc的目录,然后在uc下新建TreeToc.mxml文件这个就是用来实现Toc功能的。Toc控件这里是用Flex提供的Tree控件的基础上实现的,具体代码如下:

  1None.gif<?xml version="1.0" encoding="utf-8"?>
  2None.gif<mx:Tree xmlns:mx="http://www.adobe.com/2006/mxml"  width="100%" height="100%"  fontSize="12">
  3None.gif<mx:Script>
  4None.gif    <![CDATA[
  5None.gif        import mx.collections.ArrayCollection;
  6None.gif        import com.esri.ags.layers.ArcIMSMapServiceLayer;
  7None.gif            import com.esri.ags.layers.ArcGISDynamicMapServiceLayer;
  8None.gif            import com.esri.ags.events.LayerEvent;
  9None.gif            import com.esri.ags.layers.Layer;
 10None.gif            import com.esri.ags.layers.LayerInfo;
 11None.gif            import mx.utils.ObjectUtil;
 12None.gif            
 13None.gif            private var layerInfos:Array;
 14None.gif            //图层
 15None.gif            private var _layer:Layer;
 16None.gif            //图层是否更新标识
 17None.gif            private var _layerChanged:Boolean;
 18None.gif            //获取图层
 19None.gif            public function get layer():Layer
 20None.gif            {
 21None.gif                return _layer;
 22None.gif            }
 23None.gif            //设置图层
 24None.gif            public function set layer(value:Layer):void
 25None.gif            {
 26None.gif                _layer = value;
 27None.gif                _layerChanged=true;
 28None.gif                invalidateProperties();
 29None.gif            }
 30None.gif            //设置组件属性
 31None.gif            override protected function commitProperties():void
 32None.gif            {
 33None.gif                if (_layerChanged)
 34None.gif                {
 35None.gif                    _layerChanged = false;
 36None.gif                    if(layer)
 37None.gif                    {
 38None.gif                        //为layer添加完成后取消鼠标忙碌显示的监听事件
 39None.gif                        layer.addEventListener(Event.COMPLETE, removeBusyCursor, false, 0, true);
 40None.gif                        //为layer添加发生错误后取消鼠标忙碌显示的监听事件
 41None.gif                        layer.addEventListener(IOErrorEvent.IO_ERROR, removeBusyCursor, false, 0, true);
 42None.gif                        
 43None.gif                        if(layer.loaded)
 44None.gif                        {
 45None.gif                            //如果layer载入完成为DataGrid设置数据源
 46None.gif                            setDataProvider();
 47None.gif                        }
 48None.gif                        else
 49None.gif                        {
 50None.gif                            //如果未载入完成为layer添加载入监听事件
 51None.gif                            layer.addEventListener(LayerEvent.LOAD, layerLoadHandler, false, 0, true);
 52None.gif                        }
 53None.gif                    }
 54None.gif                }
 55None.gif                super.commitProperties();
 56None.gif            }
 57None.gif            //设置数据源
 58None.gif            private function setDataProvider():void
 59None.gif            {
 60None.gif                if(layer is ArcGISDynamicMapServiceLayer)
 61None.gif                {
 62None.gif                    layerInfos=ArcGISDynamicMapServiceLayer(layer).layerInfos;
 63None.gif                }
 64None.gif                else if(layer is ArcIMSMapServiceLayer)
 65None.gif                {
 66None.gif                    layerInfos = ArcIMSMapServiceLayer(layer).layerInfos;
 67None.gif                }
 68None.gif                registerClassAlias("com.esri.ags.layers.LayerInfo", LayerInfo);
 69None.gif                //ObjectUtil.copy方法接受一个对象做为参数而返回一个在内存的新位置的此对象的深度拷贝,类似克隆
 70None.gif                layerInfos = ObjectUtil.copy(layerInfos) as Array;
 71None.gif                dataProvider = layerInfos;
 72None.gif                //labelField="name";
 73None.gif                
 74None.gif            }
 75None.gif            
 76None.gif            private function layerLoadHandler(event:LayerEvent):void
 77None.gif            {
 78None.gif                setDataProvider();
 79None.gif            }
 80None.gif            //显示图层方法
 81None.gif            public function showLayer(layerInfo:LayerInfo):void
 82None.gif            {
 83None.gif                var visibleLayers:ArrayCollection;
 84None.gif                if(layer is ArcGISDynamicMapServiceLayer)
 85None.gif                {
 86None.gif                    //获取当前可见图层列表
 87None.gif                    visibleLayers=ArcGISDynamicMapServiceLayer(layer).visibleLayers;
 88None.gif                    //在当前可见图层列表中加入要显示的图层
 89None.gif                    visibleLayers.addItem(layerInfo.id);
 90None.gif                }
 91None.gif                else if(layer is ArcIMSMapServiceLayer)
 92None.gif                {
 93None.gif                    //获取当前可见图层列表
 94None.gif                    visibleLayers=ArcIMSMapServiceLayer(layer).visibleLayers;
 95None.gif                    //在当前可见图层列表中加入要显示的图层
 96None.gif                    visibleLayers.addItem(layerInfo.id);
 97None.gif                }
 98None.gif                //设置鼠标显示状态
 99None.gif                if (visibleLayers)
100None.gif                {
101None.gif                    cursorManager.setBusyCursor();
102None.gif                }
103None.gif            }
104None.gif            //隐藏图层方法
105None.gif            public function hideLayer(layerInfo:LayerInfo):void
106None.gif            {
107None.gif                var visibleLayers:ArrayCollection;
108None.gif                if(layer is ArcGISDynamicMapServiceLayer)
109None.gif                {
110None.gif                    //获取当前可见图层列表
111None.gif                    visibleLayers=ArcGISDynamicMapServiceLayer(layer).visibleLayers;
112None.gif                    //查找要隐藏的图层的index
113None.gif                    var index:int=visibleLayers.getItemIndex(layerInfo.id);
114None.gif                    //在当前可见图层列表中去除要隐藏的图层
115None.gif                    if (index != -1)
116None.gif                    {
117None.gif                        visibleLayers.removeItemAt(index);
118None.gif                    }
119None.gif                }
120None.gif                else if(layer is ArcIMSMapServiceLayer)
121None.gif                {
122None.gif                    //获取当前可见图层列表
123None.gif                    visibleLayers=ArcIMSMapServiceLayer(layer).visibleLayers;
124None.gif                    //查找要隐藏的图层的index
125None.gif                    var index2:int=visibleLayers.getItemIndex(layerInfo.id);
126None.gif                    //在当前可见图层列表中去除要隐藏的图层
127None.gif                    if (index2 != -1)
128None.gif                    {
129None.gif                        visibleLayers.removeItemAt(index2);
130None.gif                    }
131None.gif                }
132None.gif                //设置鼠标显示状态
133None.gif                if (visibleLayers)
134None.gif                {
135None.gif                    cursorManager.setBusyCursor();
136None.gif                }
137None.gif            }
138None.gif            
139None.gif            private function removeBusyCursor(event:Event):void
140None.gif            {
141None.gif                //删除忙光标
142None.gif                cursorManager.removeBusyCursor();
143None.gif            }
144None.gif    ]]>
145None.gif</mx:Script>
146None.gif<mx:itemRenderer>
147None.gif    uc.TreeRenderer
148None.gif</mx:itemRenderer>
149None.gif</mx:Tree>
150None.gif

5.对上面的代码做一下解释,首先Toc控件是在Tree控件的基础上实现的,这个Tree控件获取Layers数据作为数据源进行绑定显示,同时提供了显示图层隐藏图层等方法。最后这个Tree添加了一个叫uc.TreeRenderer的itemRenderer(项渲染器),也就是说Tree的每一个节点都是由这个itemRenderer来负责显示。那也就是说还需要实现uc.TreeRenderer的功能。
6.在uc目录下新增加TreeRenderer.mxml的文件,这个因为是itemRenderer所以需要implements="mx.controls.listClasses.IDropInListItemRenderer",具体代码如下:

 1None.gif<?xml version="1.0" encoding="utf-8"?>
 2None.gif<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="left" implements="mx.controls.listClasses.IDropInListItemRenderer">
 3None.gif    <mx:Script>
 4None.gif        <![CDATA[
 5None.gif            import com.esri.ags.layers.LayerInfo;
 6None.gif            import mx.controls.listClasses.BaseListData;
 7None.gif            
 8None.gif            //图标图片
 9None.gif            [Bindable] 
10None.gif            [Embed(source="assets/Dataframe.GIF")]
11None.gif            public var layericon:Class; 
12None.gif            
13None.gif            private var _listData:BaseListData;
14None.gif            
15None.gif            public function get listData():BaseListData
16None.gif            {
17None.gif                return _listData;
18None.gif            }
19None.gif            
20None.gif            public function set listData(value:BaseListData):void
21None.gif            {
22None.gif                _listData = value;
23None.gif            }
24None.gif            //checkbox的点击事件
25None.gif            private function clickHandler(event:MouseEvent):void
26None.gif            {
27None.gif                var layerInfo:LayerInfo = LayerInfo(data);
28None.gif                
29None.gif                if (cb.selected)
30None.gif                {
31None.gif                    layerInfo.defaultVisibility = true;
32None.gif                    //调用TreeToc显示图层方法
33None.gif                    TreeToc(listData.owner).showLayer(layerInfo);
34None.gif                }
35None.gif                else
36None.gif                {
37None.gif                    layerInfo.defaultVisibility = false;
38None.gif                    //调用TreeToc隐藏图层方法
39None.gif                    TreeToc(listData.owner).hideLayer(layerInfo);
40None.gif                }
41None.gif            }
42None.gif        ]]>
43None.gif    </mx:Script>
44None.gif    <mx:CheckBox id="cb" selected="{data.defaultVisibility}" click="clickHandler(event)"/>
45None.gif    <mx:Image source="{layericon}"/>
46None.gif    <mx:Label text="{data.name}"/>
47None.gif    
48None.gif</mx:HBox>
49None.gif

7.上面的代码中主要是在HBox控件中放了一个CheckBox、一个Image、一个Label,并且为CheckBok添加了点击事件可以控制图层的隐藏显示。
8.这样完成了Toc控件的开发,接下来是要在LayersOnAndOff.mxml页面使用这个控件,增加如下代码(红色部分):

 1None.gif<?xml version="1.0" encoding="utf-8"?>
 2None.gif<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundColor="white" xmlns:esri="http://www.esri.com/2008/ags" xmlns:uc="uc.*"  >
 3None.gif    <mx:Array id="arr">
 4None.gif        <mx:Object label="USA"  data="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" />
 5None.gif        <mx:Object label="USA_2D"  data="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer" />
 6None.gif    </mx:Array>
 7None.gif    <mx:ComboBox id="myURL" selectedIndex="0" horizontalCenter="-329" dataProvider="{arr}"  y="10">
 8None.gif    </mx:ComboBox>
 9None.gif    <esri:Map logoVisible="false" panArrowsVisible="true" width="463" height="288" x="33" y="40" borderStyle="solid" borderThickness="3">
10None.gif    <esri:ArcGISDynamicMapServiceLayer id="myDynamicService" url="{myURL.selectedItem.data}" load="myDynamicService.defaultVisibleLayers()"/>
11None.gif    </esri:Map>
12None.gif    <uc:TreeToc layer="{myDynamicService}" height="288" width="210" x="504" y="40" borderThickness="3"/>
13None.gif</mx:Application> 
14None.gif
9.上面代码的红色部分添加了TreeToc,并且设置了一个layer的属性值是绑定myDynamicService。这样完成了所有功能就可以运行查询效果了。

转载于:https://www.cnblogs.com/xranycall/archive/2010/08/18/1802597.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值