import com.esri.ags.toolbars.Draw;
其次,定义并实现drawEndHandler()函数:
private function drawEndHandler(event:DrawEvent):void {
var geometry : Geometry = event.geometry;
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 );}
在drawEndHandler()函数中定义了一个identifyParams,每次调用drawEndHandler的时候,identifyTask都会把identifyParams作为传入参数调用execute方法去执行。执行完成后会响应identifyCompleteHandler()函数。
定义并实现identifyCompleteHandler()函数:
private function identifyCompleteHandler(event:IdentifyEvent):void{
for each (var result:IdentifyResult in event.identifyResults) {
myGraphicsLayer.add(result.feature);
switch (result.feature.geometry.type)
{
case Geometry.MAPPOINT:
{
var mp:MapPoint = result.feature.geometryas MapPoint;var txt :Text=new Text();
txt.text=\;
myMap.infoWindow.content=txt; myMap.infoWindow.show(mp);
break;
}
case Geometry.POLYLINE:
{
var lin:Polyline = result.feature.geometryas Polyline;var txt :Text=new Text();
txt.text=\;
myMap.infoWindow.content=txt;
myMap.infoWindow.show(lin.extent.center);
16
break;
}
case Geometry.POLYGON:
{
var pgn:Polygon= result.feature.geometryas Polygon;var txt :Text=new Text();
txt.text=\;
myMap.infoWindow.content=txt;
myMap.infoWindow.show(pgn.extent.center);
break;
} } } }
在identifyCompleteHandler()函数中,遍历identifyResults,将identifyResults添加到GraphicsLayer上。
完整例子可以在samples/1.4/4目录下找到。
1.4.6 InfoWindow
InfoWindow是ArcGIS API for Flex中提供的类似于标注的窗口,可以用来显示用户自定义的信息,可以是文本、图片,也可以是复杂的自定义组件。
使用InfoWindow,只要设置map的infoWindow属性即可。如下面代码:
var canvas:Canvas = new Canvas();var txtTem :Text = new Text();txtTem.Text= \
canvas.addChild(txtTem);
myMap.infoWindow.content = canvas;
var mapPnt2:MapPoint = new MapPoint(114.1547298,30.5127677); myMap.infoWindow.show(mapPnt2);
content设置infoWindow的内容,show方法设置infoWindow的显示位置。关于InfoWindow的使用已经结合在上一小节中(IdentifyTask),例子以及代码请参考上例。
17
二中级篇
2.1地理定位(Locator)2.1.1概述
地理定位(Locator)即地理编码(Geocode)又称地址匹配(address-matching),是指建立地理位置坐标与给定地址一致性的过程。也是指在地图上找到并标明每条地址所对应的位置。地理编码是GIS中比较重要的一个功能。
2.1.2地理编码(GeoCode)
在ArcGIS API for Flex中使用地理编码和执行查询任务类似,首先使用
url=\A/GeocodeServer\ id唯一标识Locator,url指向提供Locator服务的地址。 Locator定义之后,在界面上定义一组文本输入框和一个执行按钮来调用这个Locator: 18 文本输入框用来输入地址的详细信息,button用来执行查询的动作。实现地理编码的功能: 首先,定义一个Object来存储地址的详细信息,包括Address,City,State,Zip,Country等信息。 然后,定义一个Array来存储输出字段的名称。 最后,把myAddress和myOutFields作为输入参数调用locateTask对象的addressToLocations方法。 具体代码请参考下面的代码: privatefunction doGeoCode() :void{ var myAddress:Object = { Address:a ddress.text, City:c ity.text, State:s tate.text, Zip:z ip.text, Country:c ountry.text }; var myOutFields:Array = [\]; locateTask.addressToLocations(myAddress, myOutFields,new AsyncResponder(onResult,onFault)); function onResult( candidates : Array, token : Object =null ) :void { if (candidates.length > 0) { var addressCandidate : AddressCandidate = candidates[0];var myGraphic : Graphic =new Graphic(); myGraphic.geometry= a ddressCandidate.location; myGraphic.symbol= m ySymbol; 19 myGraphic.toolTip = addressCandidate.address.toString();myGraphic.id= \;myGraphicsLayer.add(m yGraphic) ;myMap.centerAt(a ddressCandidate.location) ;myInfo.htmlText= \+addressCandidate.address.toString(); }else { myInfo.htmlText= \nothing :(\; Alert.show(\ +\ + address.text +\ + city.text +\ + zip.text +\ + state.text +\ + country.text); } } function onFault( info : Object, token : Object =null ) :void { myInfo.htmlText= \ + info.toString(); Alert.show(\ + info.toString()); }} 其中,addressToLocations的定义为: public function addressToLocations(address:Object, outFields:Array = null, responder:IResponder= null):void 关于该函数的详细信息请参考下面地址: http://resources.esri.com/help/9.3/arcgisserver/apis/flex/apiref/index.html该方法是一个异步调用的方法,成功则调用onResult()函数,失败则调用onFault函数。这个过程和查询任务的调用过程相同。在onResult函数中我们处理返回的结果,地图中心平移到返回的地址,并增加一个点来标识。在onFault中我们处理失败,将通过对话框返回错误信息。 2.1.3逆地理编码(Reverse Geocode) 逆地理编码就是把地理坐标解析成对应的地址。Locator也提供的进行逆地理编码的函数,即locationToAddress方法。该方法的调用方式和 20