IdentifyTask

1.功能:

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

2.效果图:

IdentifyTask_第1张图片

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 >

 

 

 

你可能感兴趣的:(task)