




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Flex+ArcGis的开发Flex本身是一项非常容易上手的技术,他主要是由描述应用程序界面的XML语言(MXML)和脚本语言AS以及基础类库组成的。Flex最大的一个特性之一就是可以很方便的和多种服务器端进行交互。ArcGIS Server for Flex 实际上就是利用一个封装好的类库来开发应用程序,这就极大的方便了初学者,因为有太多太多的AO接口你是不用接触的,你只需要调用ArcGis提供的方法接口就能实现大部分的功能。尤其是在ArcGIs10推出后,REST接口变得越发强大了。首先我们先来了解下Map。Map是WebGIS中最核心的控件了,基本上所有的操作都要围绕着他来实现。map首先是由数个layer组成的。每个图层又是由多个图形组成的,而每个图形里又包含很多属性等等。具体的分级是这样的:MAPlayersGraphicattributesfiledname+value地图图层图形属性字段字段名和字段值所以只有把Map这个概念细化了,我们才能真正的了解如何开发他。那么,我们把map的概念闹懂了,就可以来开发各种功能了。首先我们第一步要做的,那就是把我们的地图展现在用户眼前。那么我们就需要esri:map这个控件了。这个控件的作用很强大,稍后我们会详细的讲的。既然有了展示的控件,那么没有内容也不行啊,这里我们用到了ArcGisServier 发布的服务了。我们把需要的地图.mxd文件发布到ArcGisServier中,那么我们怎么从Flex得到呢?实际上ArcGisServier 发布的地图服务他很像一种WebService你只需要知道服务地址就能用他的服务了。所以我们就给MAP控件提供一个URL,他就表示我们使用了这个地图服务。当然了你也可以直接在浏览器中输入这个URL,你会发现几乎所有的地图信息都可以在这里边看到。好了,到这里我们的地图就显示出来了,下一步我们就可以开始根据这个显示的地图开发功能了。这时候你就会发现了,MAP不单单只显示了一个地图,还实现了很多常用的操作呢,比如放大缩小、漫游等等,当然MAP的功能还不止这么多。这就是MAP的强大之处了,当然你也可以不用他自带的功能,下面我们就自己开发一个导航栏。我们要实现的功能很简单,就是放大缩小,上下左右漫游。首先我们先把MAP自带的放大缩小按钮禁用了。Map有很多属性,其中有一个ScaleBarVisible就是是否显示放大缩小功能条的,给他一个False值就可以了。那么我们先把用到的按钮显示在界面上,然后编辑他们的click事件,其实自己开发这些功能还是很简单,因为arcGisforFlex的API实在是很“傻瓜”,比如我们要实现放大,那么我们直接用map.zoom()方法就行了,再比如我们实现向下漫游,就用map.panDown()实现。所以你根本就不用关心他是如何实现的,只需要调用就行了。 基本的操作功能已经实现了,下面我们要实现一个比较复杂也是比较重要的功能-查询。查询需要用到的控件呢除了map还需要一个GraphicsLayer,这个控件呢是包含在map里的他的主要功能呢是显示客户端绘制的图形要素,我们需要他是为了突出显示查询到的要素。还有一个很重要的QueryTask控件和Query控件,他们都是属于非显示控件。其主要功能分是在图层中定义查询任务和根据输入的值进行查询。然后我们还需要一个文本框和一个按钮给用户操作。这些控件定义好后,我们开始写查询的方法了。首先我们先得给定义的QueryTask定义一个查询的URL,这URL实际上就是把map的URL详细到了层。然后我们需要给Query一个查询的条件。这里的条件跟SQL里的WHERE很像,直接把输入的值按照应该的格式写好就行了。然后我们就可以进行查询了,QueryTask.execute()方法就是执行查询语句的方法。它主要带有两个参数,一个就是Query,另一个则是数据和处理函数构造 responder 实例,他是一个回调函数,主要的功能就是获取查询结果和查询是否正确。如果正确的话我们可以获取到查询到的值,将他显示在datagrid中并突出显示了。/查询方法private function doQuery(oid:String):void/ 清除图层graphicslayer.clear();if(fieldsList.value = null)Alert.show(没有需要查询的字段,请重新选择.);return;queryTask.url=http:/lizhenqian:8399/arcgis/rest/services/ttfw/MapServer/+layerList.value;if(oid=null)query.where = fieldsList.value+ like %+fText.text+%;elsequery.where = OBJECTID like +oid+;/query.where = fieldsList.value+ = +fText.text+;/Alert.show(fieldsList.value+ = +fText.text+);var fiels:Array = new Array();fiels.push(fieldsList.value);fiels.push(OBJECTID);query.outFields =fiels;/调用查询queryTask.execute(query, new AsyncResponder(onResult, onFault);/查询正确function onResult(featureSet:FeatureSet, token:Object = null):voidvar resultlist:Array=new Array();if (featureSet.features.length = 0)Alert.show(对不起没有找到您想查找的地点!);elseif(layerList.value = 0 & featureSet.features.length = 1)for each(var griphics:Graphic in featureSet.features)graphicslayer.add(griphics);resultlist.push(griphics.attributes);var geo:Geometry= griphics.geometry;if(geo.type = Geometry.MAPPOINT)var pnt :MapPoint = geo as MapPoint ;/定位中心map.centerAt(pnt);lists.dataProvider=resultlist;to2.play();to3.play();else/对查询结果进行定位var graphicsExtent:Extent = GraphicUtil.getGraphicsExtent(featureSet.features);if (graphicsExtent) for each(var griphic:Graphic in featureSet.features) resultlist.push(griphic.attributes); /Grid设置数据源进行查询结果显示 lists.dataProvider=resultlist; map.extent = graphicsExtent;graphicslayer.graphicProvider = queryTask.executeLastResult.features;/调用特效to2.play(); to3.play();/查询出错function onFault(info:Object, token:Object = null):voidAlert.show(错误:+info.toString();那么基本的查询功就实现了,我们现在可以实现图层管理功能了。其实呢图层管理也是很简单的,首先我们先通过Map中显示地图的图层获取到map的所有图层,直接通过图层.layerInfos就可以得到,然后将获取到的图层集存到Araay中,再将他显示在DataGrid中就可以了。然后我们还需要实现显示和隐藏图层的功能,主要就是获取当前可见图层的列表layer.visibleLayers,然后在当前可见图层列表中加入要显示的图层visibleLayers.addItem(图层ID),就能实现显示图层了,隐藏图层也差不多visibleLayers.removeItemAt (图层ID)就行了。/图层 private var _layer:Layer;/图层是否更新标识private var _layerChanged:Boolean;/获取图层public function get layer():Layerreturn _layer;/设置图层public function set layer(value:Layer):void_layer = value;_layerChanged=true;invalidateProperties(); /设置组件属性 override protected function commitProperties():void if (_layerChanged) _layerChanged = false; if(layer) /为layer添加完成后取消鼠标忙碌显示的监听事件 layer.addEventListener(Event.COMPLETE, removeBusyCursor, false, 0, true); /为layer添加发生错误后取消鼠标忙碌显示的监听事件 layer.addEventListener(IOErrorEvent.IO_ERROR, removeBusyCursor, false, 0, true); if(layer.loaded) /如果layer载入完成为DataGrid设置数据源 setDataProvider(); else /如果未载入完成为layer添加载入监听事件 layer.addEventListener(LayerEvent.LOAD, layerLoadHandler, false, 0, true); mitProperties(); /设置数据源 private function setDataProvider():void if(layer is ArcGISDynamicMapServiceLayer) layerInfos=ArcGISDynamicMapServiceLayer(layer).layerInfos; else if(layer is ArcIMSMapServiceLayer) layerInfos = ArcIMSMapServiceLayer(layer).layerInfos; registerClassAlias(com.esri.ags.layers.LayerInfo, LayerInfo); /ObjectUtil.copy方法接受一个对象做为参数而返回一个在内存的新位置的此对象的深度拷贝,类似克隆 layerInfos = ObjectUtil.copy(layerInfos) as Array; dataProvider = layerInfos; /labelField=name; private function layerLoadHandler(event:LayerEvent):void setDataProvider(); /显示图层方法 public function showLayer(layerInfo:LayerInfo):void var visibleLayers:ArrayCollection; if(layer is ArcGISDynamicMapServiceLayer) /获取当前可见图层列表 visibleLayers=ArcGISDynamicMapServiceLayer(layer).visibleLayers; /在当前可见图层列表中加入要显示的图层 visibleLayers.addItem(layerInfo.id); else if(layer is ArcIMSMapServiceLayer) /获取当前可见图层列表 visibleLayers=ArcIMSMapServiceLayer(layer).visibleLayers; /在当前可见图层列表中加入要显示的图层 visibleLayers.addItem(layerInfo.id); /隐藏图层方法 public function hideLayer(layerInfo:LayerInfo):void var visibleLayers:ArrayCollection; if(layer is ArcGISDynamicMapServiceLayer) /获取当前可见图层列表 visibleLayers=ArcGISDynamicMapServiceLayer(layer).visibleLayers; /查找要隐藏的图层的index var index:int=visibleLayers.getItemIndex(layerInfo.id); /在当前可见图层列表中去除要隐藏的图层 if (index != -1) visibleLayers.removeItemAt(index); else if(layer is ArcIMSMapServiceLayer) /获取当前可见图层列表 visibleLayers=ArcIMSMapServiceLayer(layer).visibleLayers; /查找要隐藏的图层的index var index2:int=visibleLayers.getItemIndex(layerInfo.id); /在当前可见图层列表中去除要隐藏的图层 if (index2 != -1) visibleLayers.removeItemAt(index2); 好了,下一步我们要实现点查功能。点查功能和查询虽然都是查,但确不太一样。他用到一个IdentifyTask控件作为查询的依据,同样的他也需要一个服务的URL。既然是点查,就必然得在地图上点,这就用到了MAP的mapClick事件,实际上这个事件和控件默认的Click事件是有很大的区别的。当然,我们不能让用户点下地图就出现点查,所以我们要在事件中坐判断,只在允许的时候才进行点查操作。首先点查我们需要获取到我们所点的那个点,然后根据这个点所在的图形进行查询,这里我们就要用到identifyTask.execute()方法了。这个方法同样也带2个参数,一个是我们点查到的图形,另一个就是回调函数了。同样的回调函数也是有点查到的值返回和判断是否查到。当然了获取到的值实际上就是某个图层的一个图形。这个图形的属性和值都在里边,我们可以将这个图形重点突出并在DataGrid里展示他的属性。/* *点查功能 */* * 触发点查事件 */private function mapClickHandler(event:MapMouseEvent):voidif(dianbtn.selectedIndex = 0)clickGraphicsLayer.clear();var identifyParams:IdentifyParameters = new IdentifyParameters();identifyParams.returnGeometry = true;identifyParams.tolerance = 3;identifyParams.width = map.width;identifyParams.height = map.height;identifyParams.geometry = event.mapPoint;identifyParams.mapExtent = map.extent;identifyParams.spatialReference = map.spatialReference;var clickGraphic:Graphic = new Graphic(event.mapPoint, clickPtSym);clickGraphicsLayer.add(clickGraphic);identifyTask.execute(identifyParams, new AsyncResponder(myResultFunction, myFaultFunction, clickGraphic);elseclickGraphicsLayer.clear();cz.clear();/声明全局变量private var update:UpdateDS = new UpdateDS();private var attices:Object = new Object();private function myResultFunction(results:Array, clickGraphic:Graphic = null):voidif (results & results.length 0)viewstack1.selectedIndex = 2;list3.selectedIndex = 2;var result:IdentifyResult = results0;/层ID赋值update.layderId = result.layerId;/查询出当前层的限制字段listgisBiz.findAllList(update.layderId);/查询字典表node.findTN();region.findTR();var resultGraphic:Graphic = result.feature;/根据点查到的类型,绘图switch (resultGraphic.geometry.type)case Geometry.MAPPOINT:resultGraphic.symbol = smsIdentify;break;case Geometry.POLYLINE:resultGraphic.symbol = slsIdentify;break;case Geometry.POLYGON:resultGraphic.symbol = sfsIdentify;break;lastIdentifyResultGraphic = resultGraphic;/clickGraphic.symbol = new InfoSymbol(); /clickGraphic.attributes = resultGraphic.attributes;/for each(var fas:Field in results)/dats.push(字段名:,值:fas.alias);/var attribures:Object = NAME:john, VALUE:male;/lists2.dataProvider=attribures;lists2.dataProvider= resultGraphic.attributes;attices = resultGraphic.attributes;update.oId = resultGraphic.attributes.OBJECTID;下边我们讲一下如何实现与服务器端的交互,为什么要和服务器端交互呢?因为Flex提供的这些功能并不能完全满足我们的业务需求,所以我们就需要扩展,这里我采用了和java端的对象交互。我们可以通过java端的编程实现一些ArcGis for Fex API中不能实现而java的ArcGisObject却能实现的功能,比如REST修改等。同时我们还可以更好的与数据库进行连接。下面我们就看一下如何将Flex与java端进行交互。Flex与java端交互有三种方式,分别是WebService、HttpService、RemoteObject这三种方式各有特点,我们现在要用的就是Remote Object也就是远程对象调用。这种方法要用到Adobe的LCDS或BlazeDS,这两个组件的作用差不多,在这里我们选用了LCDS来作为交互组件。首先我们先通过一个简单的例子来试验下Flex和java端的是否可以交互。我们在java端创建一个实体类和一个业务类,写一些简单的代码。这里我们需要配置的文件有WEB-INF中flex中的remoting-config.xml,在里边添加一个destination标签,由于这个配置文件没有提示,所以要写的仔细不要写错,然后添加他的一个子标签properties,再给他一个属性source,然后给他值为你业务类的包名全称。然后我们在flex_src中创建和src中实体类包一样结构的文件夹,并在里边创建一个AS的实体类,名称和其属性都必须和java端的一样。然后在AS实体类的类开头加上BindableRemoteClass(alias=实体类包名),这样你的就完成了基本的对象关系映射了。下一步我们需要做的是在flex中调用java业务类中的方法。我们首先需要创建一个对象mx:RemoteObject,然后给他一个destination属性,属性值就是刚在配置文件里destination标签的ID,然后通过这个对象就可以访问相应的类方法了。需要注意的是由于版本的问题,可能会出现交互出错的问题,我们只需要修改下配置文件就可以了。具体操作为,打开services-config.xml配置文件,将id为my-amf的channel-definition标签的url改为:server.port/ArcGis/messagebroker/amf就可以了。这样基本的远程对象交互就完成了,依据这种原理我们可以实现很多flex不可以实现的功能。 com.gis.util.EditAO false package com.gis.entityBindableRemoteClass(alias=com.gis.entity.FieldLimit) public class FieldLimitpublic function FieldLimit()public var fid:int;public var field:int;public var fname:String;public var faname:String;public var layerId:int;public var layerName:String;public var fieldType:int;public var isNoLimit:int;public var limit:String;public var isNoShow:Boolean;public var isNoLock:Boolean;好了,我们下面将修改功能实现。首先呢,我们需要先从java实现修改功能,java端如何实现呢?这里就要用到AO的很多API了。ArcGis Object API实际上就是对ArcisServer的底层进行操作,所以他的功能是很强大的。我们要想对我们的地图服务进行修改操作,首先就必须要连接到ArcGisServer。所以我们需要用ArcGis的用户名、密码、主机名、服务名等,创建一个连接,并且获得到连接的服务,因为只有这样你才能对其进行操作。private String password = 123456;private String user = administrator;private String domain = lizhenqian;private String host = lizhenqian;private String servicesName = ttfw;new ServerInitializer().initializeServer(domain, user, password);conn = new ServerConnection();conn.connect(host);som = conn.getServerObjectManager();serverContext = som.createServerContext(servicesName, MapServer);mapserver = (MapServer) serverContext.getServerObject();maps = mapserver.getMap(mapserver.getDefaultMapName();System.out.println(已连接到ArcGIS Sever);如果连接到ArcGisServer后,你就可以操作了,但是我们需要修改的只是一个图层中的一个图形的有一个属性,那么我们就必须通过你所要的信息获取到你需要的那个Filed,然后对其进行修改。代码写好后,我们可以先在java端测试下是否能成功修改,如果能够成功,那么我们就可以和Flex前台进行交互了。我们的修改功能是在点查结果的基础上进行的,所以我们修改所需要的层ID、字段名、OID、修改后的值就都得到了。我们直接通过远程对象交互的方式调用我们刚才在java端编写的修改方法就可以了。List list =layerList();IFeatureLayer pFeatLayer = (IFeatureLayer)list.get(update.getLayderId();IFeatureClass pFeatureClass = pFeatLayer.getFeatureClass();IFeature pFeature = pFeatureClass.getFeature(update.getoId();IDataset pDataset = new IDatasetProxy(pFeatureClass);IWorkspaceEdit pWorkspaceEdit = new IWorkspaceEditProxy(pDataset.getWorkspace();/if (pFeature = null) return false;int iField = pFeature.getFields().findFieldByAliasName(update.getFieldName();if (pFeature.getFields().getField(iField).getType() = esriFieldType.esriFieldTypeGeometry| pFeature.getFields().getField(iField).getType() = esriFieldType.esriFieldTypeGlobalID| pFeature.getFields().getField(iField).getType() = esriFieldType.esriFieldTypeGUID| pFeature.getFields().getField(iField).getType() = esriFieldType.esriFieldTypeBlob) System.out.print(该字段不可以修改);return false;pWorkspaceEdit.start
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阜阳界首市教师招聘考试真题2024
- 扁鹊考试题及答案
- 考试题及答案数学
- 切线考试题及答案
- 系统解剖学模拟练习题(含参考答案)
- 眼科基础知识模考试题与参考答案
- 高级养老护理员理论测试试题含答案
- 中学数学教学设计与案例分析知到智慧树答案
- 2025版三方公司环保设备更新借款合同
- 2025独家销售合同:智能家居系统区域独家代理协议
- 景观生态学课件
- 丁苯橡胶乳液聚合生产工艺
- LY/T 2738-2016古树名木普查技术规范
- GB/T 30790.8-2014色漆和清漆防护涂料体系对钢结构的防腐蚀保护第8部分:新建和维护技术规格书的制定
- 幼儿急症救助
- 期末复习放射物理与防护大专习题集
- 主通风机司机培训教材课件
- 酒店运营管理课件
- 2022年红河产业投资集团有限公司招聘笔试题库及答案解析
- 肺心病(课)课件
- 中国烟草PPT模板
评论
0/150
提交评论