1.功能:

选择图层然后按照用户所画的点,线,面查询属性,并且对查到的地理元素进行高亮显示同时在右边的Grid中显示查到的数据。

2.效果图:

3.步骤

新建identifytest.mxml页面,然后在页面上添加map控件以及需要高亮显示被查询到的元素的GraphicsLayer:

 

View Code
    <esri:Map id="myMap">
        
        
<esri:ArcGISDynamicMapServiceLayer id="myMapServiceLayer" url="http://192.168.47.29:8399/arcgis/rest/services/China/MapServer" complete="mapHandler(event)">    
        
</esri:ArcGISDynamicMapServiceLayer>
        
<esri:GraphicsLayer id="myGraphicsLayer" symbolFunction="{mySymbolFunction}">
        
</esri:GraphicsLayer>
        
<esri:extent>
            
<esri:Extent  id = "esriMapExtent" xmin="73.4" ymin="13.33" xmax="135.2" ymax="63.4"/>
        
</esri:extent>
    
</esri:Map>

代码中给ArcGISDynamicMapServiceLayer添加了一个complete事件用来当地图载入完成后获取地图的图层名称显示在地图下方的ComboBox上:

<mx:ComboBox id="layerList" verticalCenter="500" x="139">
</mx:ComboBox>

View Code
//获取地图图层名称和index到combobox上
        private function mapHandler(event:Event):void{
            
//获取图层信息数组
            var layerInfos:Array;
            layerInfos
=myMapServiceLayer.layerInfos;
            var layers:Array
=new Array();
            
//遍历图层信息数组然后把图层的名称和index值添加到新的数组中
            for(var i:int = 0;i<layerInfos.length;i++){
                layers.push({label:layerInfos[i].name,data:i});
                
            }
            
//给Combox设定数据源
            layerList.dataProvider=layers;
        
        }

同时,在GraphicsLayer中也添加了一个symbolFunction的功能,这个功能是当有元素添加到GraphicLayer时进行元素显示样式的设置,这样分别对点、线、面进行样式设定:

<esri:SimpleMarkerSymbol id="sms" style="diamond" color="0x00ff00" size="15"/>
 <esri:SimpleLineSymbol id="sls" style="solid" color="0x00ff00" width="2" alpha="1"/>
 <esri:SimpleFillSymbol id="sfs"/>

View Code
//symbolFunction的功能是当有元素添加到graphiclayer时进行元素显示样式的设置,这样分别对点、线、面进行设定
        private function mySymbolFunction(graphic:Graphic):Symbol{
            var result:Symbol;
            
//根据元素的类型进行显示样式的设定
            switch(graphic.geometry.type){
                
case Geometry.MAPPOINT:{result=sms;break;}
                
case Geometry.POLYLINE:{result=sls;break;}
                
case Geometry.POLYGON:{result=sfs;break;}    
            }
            
return result;
        }

要有画图和一些常规按钮,实现放大,缩小等常规功能,以及实现能在GraphicsLayer上画点、线、面的功能,代码如下:

 

View Code
<esri:Navigation id="navToolbar" map="{myMap}"/>
    
<esri:Draw id="drawToolbar" map="{myMap}" graphicsLayer="{myGraphicsLayer}" drawEnd="drawEndHandler(event)"/>
    
<mx:HBox horizontalAlign="center" width="100%">
        
<mx:ControlBar horizontalGap="0" paddingBottom="0" paddingTop="0"> 
            
<mx:Button label="放大"   click="navToolbar.activate(Navigation.ZOOM_IN)"  />
            
<mx:Button label="缩小"   click="navToolbar.activate(Navigation.ZOOM_OUT)"  />  
            
<mx:Button label="漫游"   click="navToolbar.activate(Navigation.PAN)"  />          
            
<mx:Button label="上级窗口"   click="navToolbar.zoomToPrevExtent()" enabled="{!navToolbar.isFirstExtent}"/>           
            
<mx:Button label="下级窗口"   click="navToolbar.zoomToNextExtent()"    enabled="{!navToolbar.isLastExtent}"/>        
            
<mx:Button label="复位" click="navToolbar.zoomToFullExtent()"/>
            
            
<mx:Button label=""   click="drawToolbar.activate(Draw.MAPPOINT)"  />
            
<mx:Button label="线"   click="drawToolbar.activate(Draw.POLYLINE)"  />  
            
<mx:Button label="流线"   click="drawToolbar.activate(Draw.FREEHAND_POLYLINE)"  /> 
            
<mx:Button label="矩形"   click="drawToolbar.activate(Draw.EXTENT)"  />         
            
<mx:Button label="多边形"   click="drawToolbar.activate(Draw.POLYGON)"   />           
            
<mx:Button label="流多边形"      click="drawToolbar.activate(Draw.FREEHAND_POLYGON) "/>        
            
<mx:Button label="结束绘制"      click="drawToolbar.deactivate() "/>  
        
</mx:ControlBar>
    
</mx:HBox>

 最后,就是在esri:Draw组件中添加一个drawEnd属性,它的功能是当绘图完成后执行drawEndHandler(event)方法,我们在这个方法里实现Identify的功能。代码如下:

<esri:IdentifyTask id="identifyTask" identifyComplete="identifyCompleteHandler(event)" url="http://192.168.47.29:8399/arcgis/rest/services/China/MapServer%22/>

 

View Code
private function drawEndHandler(event:DrawEvent):void{
            
//获取绘图结果Geometry
            var geometry:Geometry=event.graphic.geometry;
            var identifyParams:IdentifyParameters
= new IdentifyParameters();
            
//查询结果需要返回Geometry
            identifyParams.returnGeometry=true;
            
//查询冗余范围
            identifyParams.tolerance=3;
            identifyParams.width
=myMap.width;
            identifyParams.height
=myMap.height;
            
//设置查询的geometry
            identifyParams.geometry=geometry;
            
//从ComboBox获取选择的图层index设置要查询的图层
            var layers:Array=new Array();
            layers.push(layerList.value);
            identifyParams.layerIds
=layers;
            
//查询可见图层
            identifyParams.layerOption=IdentifyParameters.LAYER_OPTION_VISIBLE;
            identifyParams.mapExtent
=myMap.extent;
            
//进行查询
            identifyTask.execute(identifyParams);
            
        }
//查询完成后执行的事件
        private function identifyCompleteHandler(event:IdentifyEvent):void{
            var datas:Array
=new Array();
            
//myGraphicsLayer.clear();
            
//遍历查询结果把查询到的feature添加到GraphicLayer进行高亮显示
            
//同时把查询到的元素的名称添加到datas对象数组用来datagrid显示用
            for each(var result:IdentifyResult in event.identifyResults){
                myGraphicsLayer.add(result.feature);
                
//datas.push(result.feature.attributes);
                datas.push({"value":result.value})
            }
            datalist.dataProvider
=datas;
        }

ok!做完以上事情后就大功告成了!

现附上全部代码如下:

 

View Code
<?xml version="1.0" encoding="utf-8"?>

<mx:Application
    
    xmlns:mx
="http://www.adobe.com/2006/mxml" 
    
    xmlns:esri
="http://www.esri.com/2008/ags"
    
    pageTitle
="Query Task"
    
    
>   
<mx:Script>
    
<![CDATA[
        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;
        
//获取地图图层名称和index到combobox上
        private function mapHandler(event:Event):void{
            
//获取图层信息数组
            var layerInfos:Array;
            layerInfos
=myMapServiceLayer.layerInfos;
            var layers:Array
=new Array();
            
//遍历图层信息数组然后把图层的名称和index值添加到新的数组中
            for(var i:int = 0;i<layerInfos.length;i++){
                layers.push({label:layerInfos[i].name,data:i});
                
            }
            
//给Combox设定数据源
            layerList.dataProvider=layers;
        
        }
        
//symbolFunction的功能是当有元素添加到graphiclayer时进行元素显示样式的设置,这样分别对点、线、面进行设定
        private function mySymbolFunction(graphic:Graphic):Symbol{
            var result:Symbol;
            
//根据元素的类型进行显示样式的设定
            switch(graphic.geometry.type){
                
case Geometry.MAPPOINT:{result=sms;break;}
                
case Geometry.POLYLINE:{result=sls;break;}
                
case Geometry.POLYGON:{result=sfs;break;}    
            }
            
return result;
        }
        
        
private function drawEndHandler(event:DrawEvent):void{
            
//获取绘图结果Geometry
            var geometry:Geometry=event.graphic.geometry;
            var identifyParams:IdentifyParameters
= new IdentifyParameters();
            
//查询结果需要返回Geometry
            identifyParams.returnGeometry=true;
            
//查询冗余范围
            identifyParams.tolerance=3;
            identifyParams.width
=myMap.width;
            identifyParams.height
=myMap.height;
            
//设置查询的geometry
            identifyParams.geometry=geometry;
            
//从ComboBox获取选择的图层index设置要查询的图层
            var layers:Array=new Array();
            layers.push(layerList.value);
            identifyParams.layerIds
=layers;
            
//查询可见图层
            identifyParams.layerOption=IdentifyParameters.LAYER_OPTION_VISIBLE;
            identifyParams.mapExtent
=myMap.extent;
            
//进行查询
            identifyTask.execute(identifyParams);
            
        }
        
        
//查询完成后执行的事件
        private function identifyCompleteHandler(event:IdentifyEvent):void{
            var datas:Array
=new Array();
            
//myGraphicsLayer.clear();
            
//遍历查询结果把查询到的feature添加到GraphicLayer进行高亮显示
            
//同时把查询到的元素的名称添加到datas对象数组用来datagrid显示用
            for each(var result:IdentifyResult in event.identifyResults){
                myGraphicsLayer.add(result.feature);
                
//datas.push(result.feature.attributes);
                datas.push({"value":result.value})
            }
            datalist.dataProvider
=datas;
        }
    ]]
>
</mx:Script>
    
<esri:SimpleMarkerSymbol id="sms" style="diamond" color="0x00ff00" size="15"/>
    
<esri:SimpleLineSymbol id="sls" style="solid" color="0x00ff00" width="2" alpha="1"/>
    
<esri:SimpleFillSymbol id="sfs"/>
    
<esri:Navigation id="navToolbar" map="{myMap}"/>
    
<esri:Draw id="drawToolbar" map="{myMap}" graphicsLayer="{myGraphicsLayer}" drawEnd="drawEndHandler(event)"/>
    
<esri:IdentifyTask id="identifyTask" identifyComplete="identifyCompleteHandler(event)" url="http://192.168.47.29:8399/arcgis/rest/services/China/MapServer"/>
    
    
<!--mx:Canvas width="490" height="311" borderStyle="solid" borderThickness="3" borderColor="#425DE2" verticalCenter="-20" x="11"-->
    
<esri:Map id="myMap">
        
        
<esri:ArcGISDynamicMapServiceLayer id="myMapServiceLayer" url="http://192.168.47.29:8399/arcgis/rest/services/China/MapServer" complete="mapHandler(event)">    
        
</esri:ArcGISDynamicMapServiceLayer>
        
<esri:GraphicsLayer id="myGraphicsLayer" symbolFunction="{mySymbolFunction}">
        
</esri:GraphicsLayer>
        
<esri:extent>
            
<esri:Extent  id = "esriMapExtent" xmin="73.4" ymin="13.33" xmax="135.2" ymax="63.4"/>
        
</esri:extent>
    
</esri:Map>
        
    
<mx:HBox horizontalAlign="center" width="100%">
        
<mx:ControlBar horizontalGap="0" paddingBottom="0" paddingTop="0"> 
            
<mx:Button label="放大"   click="navToolbar.activate(Navigation.ZOOM_IN)"  />
            
<mx:Button label="缩小"   click="navToolbar.activate(Navigation.ZOOM_OUT)"  />  
            
<mx:Button label="漫游"   click="navToolbar.activate(Navigation.PAN)"  />          
            
<mx:Button label="上级窗口"   click="navToolbar.zoomToPrevExtent()" enabled="{!navToolbar.isFirstExtent}"/>           
            
<mx:Button label="下级窗口"   click="navToolbar.zoomToNextExtent()"    enabled="{!navToolbar.isLastExtent}"/>        
            
<mx:Button label="复位" click="navToolbar.zoomToFullExtent()"/>
            
            
<mx:Button label=""   click="drawToolbar.activate(Draw.MAPPOINT)"  />
            
<mx:Button label="线"   click="drawToolbar.activate(Draw.POLYLINE)"  />  
            
<mx:Button label="流线"   click="drawToolbar.activate(Draw.FREEHAND_POLYLINE)"  /> 
            
<mx:Button label="矩形"   click="drawToolbar.activate(Draw.EXTENT)"  />         
            
<mx:Button label="多边形"   click="drawToolbar.activate(Draw.POLYGON)"   />           
            
<mx:Button label="流多边形"      click="drawToolbar.activate(Draw.FREEHAND_POLYGON) "/>        
            
<mx:Button label="结束绘制"      click="drawToolbar.deactivate() "/>  
        
</mx:ControlBar>
    
</mx:HBox>
<!--/mx:Canvas-->
    
<mx:ComboBox id="layerList" verticalCenter="500" x="139">
</mx:ComboBox>
<mx:DataGrid id="datalist" height="100" borderColor="#1b67d9" borderStyle="solid" borderThickness="3" verticalCenter="-20" left="509"/>
    
    
</mx:Application>

 

 

 

posted on 2011-03-19 17:42  pandy  阅读(779)  评论(0编辑  收藏  举报