arcgis api for flex开发入门(五) 查询(转)

本文介绍如何使用ArcGIS API for Flex进行地理信息系统(GIS)要素查询。通过定义查询任务面板并设置查询参数,可以搜索特定地理区域的数据。文章详细讲解了查询任务的创建、查询结果的显示及错误处理。

在gis中,针对要素的查询是一个最基本的操作,也是最常用的操作之一。
下面我们介绍如何使用arcgis api for flex 来查询我们需要的东西。
要在arcgis api for flex中进行查询操作,首先需要定义一个查询任务面板。
使用<esri:queryTask>标签就可以了。
  <esri:queryTask id="queryTask"
url=phics/ESRI_Census_USA/MapServer/5>
        <esri:query id="query"
            text="{qText.text}"
            returnGeometry="true"
            spatialRelati>
            <esri:outFields>
                <mx:String>MED_AGE</mx:String>
                <mx:String>POP2007</mx:String>
            </esri:outFields>
        </esri:query>
    </esri:queryTask>
id 唯一标识这个查询任务,url告诉查询面板去哪查。

完整代码如下:


<esri:query>定义一个查询,text是你需要查询的东西,<esri:outFields>子标签告诉Query 查询的结果返回哪些字段的内容。
QueryTask 定义好之后,我们还需要在界面上来调用这个QueryTask。因此我们定义一个文本输入框和一个查询按钮
<mx:panel title="Query a layer (search for a state)"
layout="horizontal" backgroundColor="0xB2BFC6" borderStyle="solid">    
   <mx:TextInput width="100%" id="qText" enter="doQuery()"
text="California"/>        <mx:Button label="Do Query" click="doQuery
()"/>                </mx:panel>
文本输入框 用来输入你想要查询的内容,button 用来执行查询的动作。
那么这个doQuery()怎么实现呢?我们在mxml的标签中已经无法实现,这就需要引入activescript脚本。我们需要在mxml中使用activescript脚本历来编写代码,实现我们想要的功能。
关于activescript的语法大家可以参考activescript的相关书籍。
要在mxml文档中插入activescript,需要使用<mx:Script>标签
<mx:Script>
        <![CDATA[
        ]]>
    </mx:Script>
activescript 是一种类java 语言,它本身有一个AVM,把activescript编译成java 的代码,然后再通过JVM转换成字节码执行。
我们下面就开始实现doQuery();
首先,我们要用import 指令引入我们需要的命名空间,和java基本一样
<mx:Script>
        <![CDATA[
            import com.esri.ags.Graphic;
            import com.esri.ags.tasks.FeatureSet;
            import com.esri.ags.tasks.Query;
            import mx.controls.Alert;
            import mx.rpc.AsyncResponder;
        ]]>
    </mx:Script>
然后我们定义doQuery()函数: 注意activescript代码 要放到<mx:Script>标签

private function doQuery() : void
            {
                queryTask.execute( query, new AsyncResponder( onResult, onFault ));
在doQuery()函数中直接调用了queryTask的execute方法,这是一个异步调用。
成功响应onResult函数,失败则响应onFault函数。
查询已经写好了,那么我们怎么得到查询的结果呢?得到结果后怎么表现呢?
这就需要我们在onResult函数中做一些事情了。
首先,定义onResult函数
function onResult( featureSet : FeatureSet, token : Object = null ) : void
                {  
                    var displayFieldName : String =
featureSet.displayFieldName;
                    for each ( var myGraphic : Graphic in featureSet.features )
                    {
                        // ToolTip
                        myGraphic.toolTip = "The 2007 population of "
                            + myGraphic.attributes[displayFieldName] +
" was "
                            + myNumberFormatter.format
(myGraphic.attributes.POP2007)
                            + "\nMedian Age: " +
myGraphic.attributes.MED_AGE + ".";      
                        // show on map
                        myGraphicsLayer.add( myGraphic );
                    }
                }
查询结果返回一个 FeatureSet,我们现在遍历这个 FeatureSet,然后把每个feature 绘制到GraphicLayer上。
如果查询失败了怎么办呢,我们是不是要弹个东西出来告诉用户呢?
这就需要我们在onFault函数中做一些工作
function onFault( info : Object, token : Object = null ) : void
                {
                    Alert.show( info.toString() );
                }                        
            }
我们弹个对话框出来告诉用户,查找失败啦!

 

ExpandedBlockStart.gif 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.tasks.FeatureSet;
            import com.esri.ags.tasks.Query;
            import mx.controls.Alert;
            import mx.rpc.AsyncResponder;
                        
            
private  function doQuery() :  void
            {
                queryTask.execute( query, 
new  AsyncResponder( onResult, 
onFault ));
                function onResult( featureSet : FeatureSet, token : 
Object 
=   null  ) :  void
                {   
                    var displayFieldName : String 
=  
featureSet.displayFieldName;
                    
for  each ( var myGraphic : Graphic  in  
featureSet.features )
                    {
                        
//  ToolTip
                        myGraphic.toolTip  =   " The 2007 population of  "  
                            
+  myGraphic.attributes[displayFieldName]  +  
"  was  "  
                            
+  myNumberFormatter.format
(myGraphic.attributes.POP2007)
                            
+   " \nMedian Age:  "   +  
myGraphic.attributes.MED_AGE 
+   " . " ;       
                        
//  show on map
                        myGraphicsLayer.add( myGraphic ); 
                    }
                }
                function onFault( info : Object, token : Object 
=   null  
) : 
void
                {
                    Alert.show( info.toString() );
                }                         
            }
        ]]
>
    
</ mx:Script >
    
< mx:NumberFormatter id = " myNumberFormatter "  
useThousandsSeparator
= " true " />
    
<!--  Layer with US States  -->
    
< esri:QueryTask id = " queryTask "  
url
= " http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demogra
phics / ESRI_Census_USA / MapServer / 5 " >
         < esri:Query id = " query "  
            text
= " {qText.text} "
            returnGeometry
= " true "
            spatialRelationship
= " esriSpatialRelEnvelopeIntersects " >
            
< esri:outFields >
                
< mx:String > MED_AGE </ mx:String >
                
< mx:String > POP2007 </ mx:String >
            
</ esri:outFields >
        
</ esri:Query >
    
</ esri:QueryTask >
    
< mx:Panel title = " Query a layer (search for a state) "  
layout
= " horizontal "  backgroundColor = " 0xB2BFC6 "  borderStyle = " solid " >
        
< mx:TextInput width = " 100% "  id = " qText "  enter = " doQuery() "  
text
= " California " />
        
< mx:Button label = " Do Query "  click = " doQuery() " />             
    
</ mx:Panel >
    
< esri:Map >
        
< esri:extent >
            
< esri:Extent xmin = " -170 "  ymin = " 15 "  xmax = " -65 "  ymax = " 75 " />
        
</ esri:extent >
        
< esri:ArcGISTiledMapServiceLayer
            
url
= " http://server.arcgisonline.com/ArcGIS/rest/services/NPS_Physical_W
orld_2D / MapServer "  />
         < esri:GraphicsLayer id = " myGraphicsLayer " />
    
</ esri:Map >
</ mx:Application >

原文地址:http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=35621&extra=page%3D4%26amp%3Borderby%3Ddateline

转载于:https://www.cnblogs.com/pandy/archive/2011/03/19/1988844.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值