前两天看了关于ArcGIS For Flex的资料,今天学着esri中的例子做了一个查看属性并缩放至结果的例子。
先建立一个地图和缩放的范围,然后添加控件,这里一个label,一个button还有一个textInput用于输入查询的条件,这些准备工作做好之后。
我们需要在Declarations中声明一个QueryTask,url就是服务的地址,最后的/5表示查找的图层。接下来还需要声明一个query,其中有几个参数需要注意一些,text就是查询的条件,也就是查询textInput的值,returnGeometry指是否返回图形,而outFields指的就是返回结果的属性字段,outSpatialReference则表示返回结果的地理参考。下来就是需要在ActionScript中加入代码,首先需要添加一个doQuery函数,querytask.execute(query,new AsyncResponder(onResult,faultResult))表示查询任务执行中需要的几个参数,第一个就是之前声明的查询条件,第二个表示查询同步相应的一个类,它有两个参数,它们都是函数:一个resulthandler,一个 faulthandler。即正常响应函数,另一个就是错误响应函数。在正常响应函数中我先是声明一个extent来取得当前的一个显示范围,可以将这个范围赋给map,从而缩放至结果。另一方面,需要将查询到的图形在数据集中遍历,并添加至graphicslayer中,这是客户端的一个图层,将服务器返回的结果加载到上边。onResult函数写好之后需要完成fault函数,这里写的很简单,就是讲错误字符串显示。这些完成后,需要在button中添加click事件,响应函数就是之前的doQuery函数。我还将查询到属性放到了一个datagrid中,其dataProvider="{querytask.executeLastResult.attributes}",这里需要注意的是querytask.executeLastResult下边可以选择attributes,在查询中同样可以得到features。完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:esri="http://www.esri.com/2008/ags"> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> <esri:QueryTask id="querytask" url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/5" /> <esri:Query id="query" text="{qtext.text}" returnGeometry="true" outFields="[STATE_NAME,POP2007]" outSpatialReference="{spatialreference}"/> </fx:Declarations> <fx:Script> <![CDATA[ import com.esri.ags.FeatureSet; import com.esri.ags.Graphic; import com.esri.ags.geometry.Extent; import com.esri.ags.utils.GraphicUtil; import mx.controls.Alert; import mx.rpc.AsyncResponder; private function doQuery():void { querytask.execute(query,new AsyncResponder(onResult,faultResult)); } private function onResult(featureset:FeatureSet,toke:Object=null):void { var graphicextent:Extent=GraphicUtil.getGraphicsExtent(featureset.features); for each(var graphic:Graphic in featureset.features) { graphicslayer.add(graphic); mymap.extent=graphicextent; } } private function faultResult(info:Object,token:Object=null):void { Alert.show(info.toString()); } ]]> </fx:Script> <esri:Map id="mymap" > <esri:extent> <esri:Extent xmin="-14298000" ymin="2748000" xmax="-6815000" ymax="7117000"> <esri:SpatialReference id="spatialreference" wkid="102100"/> </esri:Extent> </esri:extent> <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer"/> <esri:GraphicsLayer id="graphicslayer" /> </esri:Map> <mx:Label x="393" y="10" text="输入要查询条件"/> <mx:TextInput id="qtext" x="358" y="37" width="106" height="20"/> <mx:Button id="Query" label="查询" x="494" y="37" height="20" click="doQuery()"/> <mx:DataGrid x="667" y="34" dataProvider="{querytask.executeLastResult.attributes}"/> </s:Application>