加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ArcGIS API for Flex3实现Query查询定位功能

发布时间:2020-12-15 04:24:39 所属栏目:百科 来源:网络整理
导读:开始: 1.启动Flex Builder3新建工程以及引入 ArcGIS API for Flex library的开发包 。 2.新建QueryTest.mxml页面,这里显示的地图采用Esri提供的在线的NPS_Physical_World_2D的地图比较的漂亮,但是Tiled图没有图层以及字段等数据没有办法进行查询定位,所
开始:
1.启动Flex Builder3新建工程以及引入 ArcGIS API for Flex library的开发包

2.新建QueryTest.mxml页面,这里显示的地图采用Esri提供的在线的NPS_Physical_World_2D的地图比较的漂亮,但是Tiled图没有图层以及字段等数据没有办法进行查询定位,所以在Tiled图的基础上在叠加一个DynamicMap图层就是上面发布的usa的数据,我们对usa的数据进行查询然后结果显示在NPS_Physical_World_2D的地图上面。由于是2个Layer的叠加就需要esri:ArcGISTiledMapServiceLayer和ArcGISDynamicMapServiceLayer,具体的显示代码如下:

<mx:Canvas width="434" height="370" borderStyle="solid" borderThickness="3" borderColor="#D6D7D8" horizontalCenter="-140" verticalCenter="34">
   <esri:Extent id="myExtent" xmin="-127.968857954995" ymin="25.5778580720472" xmax="-65.0742781827045" ymax="51.2983251993735" />
      <esri:Map id="myMap" extent="{myExtent}">
        <esri:ArcGISTiledMapServiceLayer url="http://server.arcgisonline.com/ArcGIS/rest/services/NPS_Physical_World_2D/MapServer" />
        <esri:ArcGISDynamicMapServiceLayer id="myMapServiceLayer"  url="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer" creationComplete="loadMapLayer(event)">
            <esri:visibleLayers>
            <mx:ArrayCollection>
            </mx:ArrayCollection>
            </esri:visibleLayers>
        </esri:ArcGISDynamicMapServiceLayer>
        <esri:GraphicsLayer id="myGraphicsLayer"  symbolFunction="{mySymbolFunction}" />
     </esri:Map>
</mx:Canvas>
3.上面的代码中为Map控件设置了以为USA范围的Extent,为ArcGISDynamicMapServiceLayer设置了creationComplete事件就是用来执行loadMapLayer(event)把地图图层名称以及index添加到ComboBox来选择用。
loadMapLayer(event) 方法代码如下:

//获取地图图层名称和index到ComboBox上
private function loadMapLayer(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}); 
   }
   //给ComboBox设定数据源
   layerList.dataProvider=layers;
}
ComboBox的显示代码:

<mx:ComboBox id="layerList" x="10" y="10" width="117"></mx:ComboBox>
4.上面还为 ArcGISDynamicMapServiceLayer设置了 可视图层<esri:visibleLayers><mx:ArrayCollection></mx:ArrayCollection></esri:visibleLayers>,这样设置的为空就是不想用来显示只是用来数据查询用。
5.还添加了GraphicsLayer对象用来进行高亮显示用,并且为它设置了symbolFunction="{mySymbolFunction}"这样是在 mySymbolFunction方法中对点、线、面的显示样式进行设置,代码如啊:

private function mySymbolFunction(graphic:Graphic):Symbol
{
    var result:Symbol;
    //根据元素的类型进行显示样式的设定
    switch(graphic.geometry.type)
    {
        case Geometry.GEOMETRY_POINT:
        {
            result=sms;
            break;
        }
        case Geometry.GEOMETRY_POLYLINE:
        {
            result=sls;
            break;
        }
        case Geometry.GEOMETRY_POLYGON:
        {
            result=sfs;
            break;
        }
    }
    return result;
}
 对上面的sms、sls、sfs等定义:
<esri:SimpleLineSymbol id="sls" style="solid" color="0x0000FF" width="2" alpha="0.6"/>
<esri:SimpleMarkerSymbol id="sms" style="circle" color="0x0000FF" alpha="0.6" size="15"/>
<esri:SimpleFillSymbol id="sfs" color="0x0000FF" alpha="0.6"/>
6.接下来在页面上添加一个TextInput、Button、mx:DataGrid分别为查询语句输入框、查询按钮、查询结果显示表,具体显示代码如下:

<mx:Canvas width="434" height="48" borderStyle="solid" borderThickness="3" borderColor="#D6D7D8" horizontalCenter="-139" verticalCenter="-183">
    <mx:ComboBox id="layerList" x="10" y="10" width="117"></mx:ComboBox>
    <mx:TextInput id="qText" x="135" y="10" width="223" enter="doQuery()" text="STATE_NAME like '%a%'"/>
    <mx:Button x="366" y="10" label="查询" fontSize="12" height="22" click="doQuery()"/>
</mx:Canvas>
<mx:DataGrid  id="resultTable" change="clickHandler(event)"  height="426" borderStyle="solid" borderThickness="3" borderColor="#D6D7D8" horizontalCenter="179" verticalCenter="6" width="188">
</mx:DataGrid>
7.上面的代码中为TextInput添加了enter事件用来实现回车后进行调用doQuery()方法进行查询,为Button添加了click事件点击后调用doQuery()方法进行查询
8.要进行Query还需要esri:QueryTask控件,在页面上添加如下显示代码:

<esri:QueryTask id="queryTask" >
<esri:Query id="query" />
</esri:QueryTask>

9.doQuery()方法代码如下,具体说明看注解:

private function doQuery():void
            {
                //清除原来的高亮显示
                myGraphicsLayer.clear();
                //设置queryTask的url,就是设置要查询的图层
                queryTask.url="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer/"+layerList.value;
                //queryTask.query.text=qText.text;
                //queryTask.query.where="STATE_NAME like '%"+qText.text+"%'";
                //设置查询语句
                queryTask.query.where=qText.text;
                //查询结果是否返回Geometry
                queryTask.query.returnGeometry=true;
                queryTask.query.spatialRelationship="esriSpatialRelEnvelopeIntersects";
                //设置要查询的字段
                var fields:Array=new Array();
                fields.push("OBJECTID");
                fields.push("STATE_NAME");
                fields.push("POP2000");
                queryTask.query.outFields=fields; 
                //进行查询成功调用onResult方法,错误失败调用onFault
                queryTask.execute(query,new AsyncResponder(onResult,onFault));
            }
            
            //查询成功活进行高亮显示已经数据Grid显示
            private function onResult(featureSet:FeatureSet,token:Object = null):void
            {
                var resultlist:Array=new Array();
                for each(var griphic:Graphic in featureSet.features)
                {
                    myGraphicsLayer.add(griphic);
                    resultlist.push({"ID":griphic.attributes.OBJECTID,"STATE_NAME":griphic.attributes.STATE_NAME})
                }
                //Grid设置数据源进行查询结果显示
                resultTable.dataProvider=resultlist;
            }
            
            //查询失败提示
            private function onFault(info:Object,token:Object = null ):void
            {
                //Alert.show(info.toString());
                Alert.show("输入的查询语句不正确!");
            }

10.更加查询语句查询到结果显示到Grid中后还需要实现一个点击Grid的行进行地图定位的功能,上面添加Grid的时候已经为它添加了change事件就是点击某一行后调用clickHandler(event)方法进行定位功能,代码说明如下:

//Grid点击事件进行对点击对象进行定位居中显示
            public function clickHandler(event:ListEvent):void
            {
                //获取点击行的id
                var idstr:String=event.itemRenderer.data.ID;
                //设置查询的图层
                queryTask.url="http://jh-53a435fbc0e8/ArcGIS/rest/services/USA/MapServer/"+layerList.value;
                //是否返回Geometry
                queryTask.query.returnGeometry=true;
                queryTask.query.spatialRelationship="esriSpatialRelEnvelopeIntersects";
                //查询语句
                queryTask.query.where="OBJECTID="+idstr;
                //执行查询
                queryTask.execute(query,new AsyncResponder(onResult2,onFault2));
            }
            
            private function onResult2(featureSet:FeatureSet,token:Object = null):void
            {
                var resultlist:Array=new Array();
                for each(var griphic:Graphic in featureSet.features)
                {
                    myGraphicsLayer.add(griphic);
                    var geo:Geometry= griphic.geometry;
                    var ex:Extent=new Extent();
                    switch(geo.type)
                    {
                        //点对象
                        case Geometry.GEOMETRY_POINT:
                        {
                            //转成MapPoint
                            var pnt :MapPoint = geo as MapPoint ;
                            //定位中心
                            myMap.centerAt(pnt);
                            break;
                        }
                        //线对象
                        case Geometry.GEOMETRY_POLYLINE:
                        {
                            //转成Polyline
                            var pline:Polyline=geo as Polyline;
                            //设置地图视图范围
                            ex=pline.extent;
                            myMap.extent=ex;
                            break;
                        }
                        //面对象
                        case Geometry.GEOMETRY_POLYGON:
                        {
                            //转成Polygon
                            var pgon:Polygon=geo as Polygon;
                            //设置地图视图范围
                            ex=pgon.extent;
                            myMap.extent=ex;
                            break;
                        }
                    }

                    break;
                }
      
            }
            
            private function onFault2(info:Object,token:Object = null ):void
            {
                Alert.show("出差啦!");
            }

11.这样就完成了所有功能的编写可以运行测试效果。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读