zoukankan      html  css  js  c++  java
  • IdentifyTask

    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>
  • 相关阅读:
    【家庭记账本】Android开发日记(七)
    每日总结【2020/02/08】
    每日总结【2020/02/07】
    【家庭记账本】Android开发日记(六)
    每日总结【2020/02/06】
    【家庭记账本】Android开发日记(五)
    【iOS开发】 CoreText 使用教程:以创建一个简单的杂志应用为例
    用NSLogger代替NSLog输出调试信息
    iOS开发常用国外网站清单
    Xcode快捷键 2(转)
  • 原文地址:https://www.cnblogs.com/pandy/p/1988919.html
Copyright © 2011-2022 走看看