结果,对结果在客户端处理。
1.4.2在mxml文档中嵌入 ActionScript
在使用QueryTask,FindTask,IdentifyTask之前,首先介绍一下如何在mxml文档中嵌入 ActionScript.。通过在mxml文档中嵌入 ActionScript脚本我们可以更加灵活的使用ArcGIS API for Flex。
关于ActionScript的语法可以参考ActionScript的相关书籍。
要在mxml文档中嵌入ActionScript,需要使用
ActionScript是一种类java语言,它本身有一个AVM,把ActionScript编译成java的代码,然后再通过JVM转换成字节码执行。
1.4.3 QueryTask
在ArcGIS API for Flex中进行查询操作,需要定义一个查询任务面板。使用
url=%us_USA/MapServer/5\ returnGeometry=\ spatialRelationship=\
id唯一标识这个查询任务,url指定查询服务的地址。
QueryTask定义好之后,在界面上定义一个文本输入框和一个查询按钮来调用这个QueryTask:
layout=\ 11 文本输入框用来输入查询的内容,button用来执行查询的动作。下面实现查询功能: 首先,使用import指令引入我们需要的命名空间,和java基本一样。 import com.esri.ags.Graphic; import com.esri.ags.tasks.FeatureSet; import com.esri.ags.tasks.Query; import mx.controls.Alert; import mx.rpc.AsyncResponder; ]]> 其次,定义doQuery()函数(注意ActionScript代码要放到 private function doQuery() : void { queryTask.execute( query, new AsyncResponder( onResult, onFault ));} 在doQuery()函数中直接调用了queryTask的execute方法,这是一个异步调用。成功响应onResult函数,失败则响应onFault函数。最后查询得到的结果将在onResult函数中处理。 下面是onResult函数的定义以及实现: private function onResult( featureSet : FeatureSet, token : Object = null ) : void{ var displayFieldName : String = featureSet.displayFieldName; for each ( var myGraphic : Graphic in featureSet.features ) { // ToolTip myGraphic.toolTip = \ + myGraphic.attributes[displayFieldName] + \ + myNumberFormatter.format(myGraphic.attributes.POP2007) + \ // show on map myGraphicsLayer.add( myGraphic ); }} 查询结果返回一个 FeatureSet,在onResult函数中遍历这个 FeatureSet,然后把每个feature绘制到GraphicLayer上,并显示ToolTip。 12 如果查询失败,则在onFault函数中对失败进行处理,如下代码: private function onFault( info : Object, token : Object = null ) : void { Alert.show( info.toString() ); } 弹个对话框出来告诉用户失败的详细信息。 完整例子可以在samples/1.4/3目录下找到。 1.4.4 FindTask 在ArcGIS API for Flex中执行Find任务,需要使用FindTask。使用 id唯一标识FindTask,executeComplete事件指定Find任务完成后调用的函数,url指定提供Find服务的地址。 使用FindTask,还需要一个FindParameters对象来指定查找的参数。 id唯一标识FindParameters,searchText指定查找的字符串,searchFields指定在哪些字段查找。 定义好FindTask和FindParameters之后,在界面上定义一个文本输入框和一个button来完成Find功能的调用工作。 horizontalAlign=\ 文本输入框用来输入查找的内容,button用来执行查询的动作。实现Find功能: 首先,使用import指令引入需要的命名空间: import com.esri.ags.events.FindEvent; 其次,定义doFind()函数: 13 Private function doFind():void { findTask.execute( myFindParams );} 在doFind()函数中FindTask对象直接调用了execute方法,并把FindParameters对象做为传入参数。 下面实现 executeCompleteHandler()函数,这个函数在定义FindTask的时候被指定为响应executeComplete事件的函数,即当Find任务完成的时候会响应executeCompleteHandler()函数,Find得到的结果将在这个函数里进行处理。 private function executeCompleteHandler( event : FindEvent ) : void{ myGraphicsLayer.clear(); var graphic : Graphic; resultSummary.text = \\ for (var i : Number = 0; i < event.findResults.length; i++) { graphic = event.findResults[i].feature; graphic.toolTip = event.findResults[i].foundFieldName + \\+ event.findResults[i].value; myGraphicsLayer.add(graphic); }} 在executeCompleteHandler函数中遍历Find的结果,给每一个graphic添加 一个toolTip,显示该结果对应的字段名和字段值。 同时把查询到的结果显示到DataGrid中: dataProvider=\ scroll=\width=\height=\ headerText=\ 只要把DataGrid的dataProvider绑定到findTask.executeLastResult就可以了。完整例子可以在samples/1.4/4目录下找到。 14 1.4.5 IdentifyTask Identify是GIS中比较常用的工具之一,在ArcGIS API for Flex中,使用 IdentifyTask来实现Identify的功能。 使用 identifyComplete=\ url=\CitiesRivers_USA/MapServer\ id唯一标识IdentifyTask,identifyComplete事件绑定identifyCompleteHandler()函数,url指定IdentifyTask服务的地址。 执行Identify,需要定义一个IdentifyParameters对象。下面使用ActionScript来定义一个IdentifyParameters对象,使用 var identifyParams : IdentifyParameters = new IdentifyParameters(); identifyParams.returnGeometry = true; identifyParams.tolerance = 3; identifyParams.width = 600; identifyParams.height = 550; identifyParams.geometry = geometry; identifyParams.layerOption = IdentifyParameters.LAYER_OPTION_ALL; identifyParams.mapExtent = map.extent; identifyTask.execute( identifyParams ); 其中tolerance是容差半径,geometry是用来做identify的几何。 下面在界面上使用鼠标交互来完成Identify:首先,定义一个draw控件: graphicsLayer=\ drawEnd事件绑定到drawEndHandler(event)函数,这个事件会在绘制完成后触发。 使用ActionScript脚本实现drawEndHandler和identifyCompleteHandler函数:首先,引入命名空间: import com.esri.ags.Graphic; import com.esri.ags.events.DrawEvent; import com.esri.ags.events.IdentifyEvent; import com.esri.ags.geometry.Geometry; import com.esri.ags.symbol.Symbol; import com.esri.ags.tasks.IdentifyParameters; import com.esri.ags.tasks.IdentifyResult; 15