免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1387|回复: 0
收起左侧

[技术交流] 南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(八)资源搜索模块

[复制链接]

45

主题

8272

铜板

17

好友

高级工程师

Rank: 9Rank: 9Rank: 9

积分
1122
QQ
发表于 2016-10-20 10:00 | 显示全部楼层 |阅读模式
config.xml文件的配置如下:
  1. <widget label="资源搜索"  icon="assets/images/public_impact_over.png" config="widgets/AdvancedBusiness/AdvancedBusinessWidget.xml" url="widgets/AdvancedBusiness/AdvancedBusinessWidget.swf" />
复制代码
源代码目录如下:
界面效果:
大概的思路如下:跟地图搜索的思路是一样的,不过是这里唯一变化的是可以勾选多个图层来进行query查询,其实只是进行多次循环查询不同的图层而已,核心是一样的;AdvancedBusinessWidget.xml是资源搜索模块的配置文件,AdvancedBusinessWidget.mxml是widget;AdvancedBusinessWidget.xml主要是配置资源图层搜索的服务url,用来进行query查询用,这个模块的核心其实就是调用arcgis api的query类以及queryTask
AdvancedBusinessWidget.xml:
  1. <?xml version="1.0" ?>
  2. <configuration label="Louisville Parcels and Police">
  3.     <layers>
  4.         <layer>
  5.             <name>危险隐患</name>
  6.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/0
  7.             </url>
  8.             <expression>NAME like '%[value]%'</expression>
  9.             <textsearchlabel>按照名称搜索</textsearchlabel>
  10.             <titlefield>NAME</titlefield>
  11.             <linkfield></linkfield>
  12.             <fields all="true">
  13.                 <field name="NAME" />
  14.             </fields>
  15.             <checked>true</checked>
  16.         </layer>
  17.         <layer>
  18.             <name>应急专家</name>
  19.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/1
  20.             </url>
  21.             <expression>NAME like '%[value]%'</expression>
  22.             <textsearchlabel>按照名称搜索</textsearchlabel>
  23.             <titlefield>NAME</titlefield>
  24.             <linkfield></linkfield>
  25.             <fields all="true">
  26.                 <field name="NAME" />
  27.             </fields>
  28.             <checked>false</checked>
  29.         </layer>
  30.         <layer>
  31.             <name>物资装备</name>
  32.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/2
  33.             </url>
  34.             <expression>NAME like '%[value]%'</expression>
  35.             <textsearchlabel>按照名称搜索</textsearchlabel>
  36.             <titlefield>NAME</titlefield>
  37.             <linkfield></linkfield>
  38.             <fields all="true">
  39.                 <field name="NAME" />
  40.             </fields>
  41.             <checked>false</checked>
  42.         </layer>
  43.         <layer>
  44.             <name>救援队伍</name>
  45.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/3
  46.             </url>
  47.             <expression>NAME like '%[value]%'</expression>
  48.             <textsearchlabel>按照名称搜索</textsearchlabel>
  49.             <titlefield>NAME</titlefield>
  50.             <linkfield></linkfield>
  51.             <fields all="true">
  52.                 <field name="NAME" />
  53.             </fields>
  54.             <checked>false</checked>
  55.         </layer>
  56.         <layer>
  57.             <name>庇护场所</name>
  58.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/4
  59.             </url>
  60.             <expression>NAME like '%[value]%'</expression>
  61.             <textsearchlabel>按照名称搜索</textsearchlabel>
  62.             <titlefield>NAME</titlefield>
  63.             <linkfield></linkfield>
  64.             <fields all="true">
  65.                 <field name="NAME" />
  66.             </fields>
  67.             <checked>false</checked>
  68.         </layer>
  69.         <layer>
  70.             <name>保护对象</name>
  71.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/5
  72.             </url>
  73.             <expression>NAME like '%[value]%'</expression>
  74.             <textsearchlabel>按照名称搜索</textsearchlabel>
  75.             <titlefield>NAME</titlefield>
  76.             <linkfield></linkfield>
  77.             <fields all="true">
  78.                 <field name="NAME" />
  79.             </fields>
  80.             <checked>false</checked>
  81.         </layer>
  82. <!--         <layer> -->
  83. <!--             <name>应急仓库</name> -->
  84. <!--             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/6 -->
  85. <!--             </url> -->
  86. <!--             <expression>NAME like '%[value]%'</expression> -->
  87. <!--             <textsearchlabel>Search by NAME</textsearchlabel> -->
  88. <!--             <titlefield>NAME</titlefield> -->
  89. <!--             <linkfield></linkfield> -->
  90. <!--             <fields all="true"> -->
  91. <!--                 <field name="NAME" /> -->
  92. <!--             </fields> -->
  93. <!--             <checked>false</checked> -->
  94. <!--         </layer> -->
  95.         <layer>
  96.             <name>企业</name>
  97.             <url>http://localhost:6080/ArcGIS/rest/services/nsBusiness/MapServer/7
  98.             </url>
  99.             <expression>NAME like '%[value]%'</expression>
  100.             <textsearchlabel>按照名称搜索</textsearchlabel>
  101.             <titlefield>NAME</titlefield>
  102.             <linkfield></linkfield>
  103.             <fields all="true">
  104.                 <field name="NAME" />
  105.             </fields>
  106.             <checked>false</checked>
  107.         </layer>
  108.         <layer>
  109.             <name>全选</name>
  110.             <url></url>
  111.             <expression>NAME like '%[value]%'</expression>
  112.             <textsearchlabel>按照名称搜索</textsearchlabel>
  113.             <titlefield>NAME</titlefield>
  114.             <linkfield></linkfield>
  115.             <fields all="true">
  116.                 <field name="NAME" />
  117.             </fields>
  118.             <checked>false</checked>
  119.         </layer>
  120.     </layers>
  121.     <zoomscale>10000</zoomscale>
  122. </configuration>

  123. <!-- See Search widget tag reference at http://links.esri.com/searchwidget -->
复制代码
AdvancedBusinessWidgett.mxml:具体实现部分,我截图部分代码好了,具体的详见flexviewer。主要是有两种方式查询,一种是框选,另一种是关键字查询;框选查询是利用在地图框选(线 面 拉框等等)获取框选的范围Geometry,然后利用当前的Geometry作为queryTask的参数,用于query查询;输入关键字查询是类似的,不过是query的参数把geometry替换为text。
框选模式参照地图搜索部分
关键字查询:
在勾选图层的基础上循环遍历查询
  1. private function textFilter():void{              
  2. for each(var searchLayer:Object in configSearchGraphicalArr){//configSearchGraphicalArr是勾选的图层数组

  3. if(searchLayer.checked && searchLayer.label!="全选"){ 5queryFeaturesText(searchLayer);
  4. }
  5. }
  6. }
复制代码
queryFeaturesText是基于关键字搜索函数:
  1. private function queryFeaturesText(searchLayer:Object):void
  2.             {
  3.                         
  4.                 hideInfoWindow();               

  5.                 queryLayer = searchLayer.layer;

  6.                 if (queryLayer && !queryLayer.loaded)
  7.                 {
  8.                     queryLayer.addEventListener(LayerEvent.LOAD, queryLayer_loadHandler);
  9.                     queryLayer.addEventListener(LayerEvent.LOAD_ERROR, queryLayer_loadErrorHandler);

  10.                     function queryLayer_loadHandler(event:LayerEvent):void
  11.                     {
  12.                         queryLayer.removeEventListener(LayerEvent.LOAD, queryLayer_loadHandler);
  13.                         queryLayer.removeEventListener(LayerEvent.LOAD_ERROR, queryLayer_loadErrorHandler);

  14.                         queryFeaturesText(queryLayer);
  15.                     }

  16.                     function queryLayer_loadErrorHandler(event:LayerEvent):void
  17.                     {
  18.                         queryLayer.removeEventListener(LayerEvent.LOAD, queryLayer_loadHandler);
  19.                         queryLayer.removeEventListener(LayerEvent.LOAD_ERROR, queryLayer_loadErrorHandler);

  20.                         showLoadErrorMessage(event);
  21.                     }

  22.                     return;
  23.                 }

  24.                 queryExpr = searchLayer.expr;
  25.                 queryFields = searchLayer.fields;
  26.                 queryTitleField = searchLayer.titlefield;
  27.                 queryLinkField = searchLayer.linkfield;
  28.                 queryLinkAlias = searchLayer.linkalias;

  29.                 if (queryLayer && txtSearch.text)
  30.                 {
  31.                     var query:Query = new Query();
  32.                     var expr:String = queryExpr.replace(/\[value\]/g, txtSearch.text);
  33.                     
  34.                     query.where = expr;
  35.                     query.outSpatialReference = map.spatialReference;

  36.                     const supportsServerSideSorting:Boolean = queryLayer.layerDetails
  37.                         && queryLayer.layerDetails.version >= 10.1
  38.                         && queryLayer.layerDetails.supportsAdvancedQueries;
  39.                     const orderByFields:Array = searchLayer.orderbyfields;
  40.                     if (supportsServerSideSorting && orderByFields)
  41.                     {
  42.                         query.orderByFields = orderByFields;
  43.                     }

  44.                     var queryOptions:Object =
  45.                         {
  46.                             supportsServerSideSorting: supportsServerSideSorting,
  47.                             orderByFields: orderByFields,
  48.                             queryFields: queryFields
  49.                         };

  50.                     queryLayer.queryFeatures(
  51.                         query, new AsyncResponder(queryFeatures_resultHandler,
  52.                                                   queryFeatures_faultHandler,
  53.                                                   queryOptions));

  54.                     //showMessage(loadingLabel, true);
  55.                     //showStateResults();
  56.                     
  57.                     function queryFeatures_resultHandler(featureSet:FeatureSet, queryOptions:Object):void
  58.                     {
  59.                         /*
  60.                         var layer:FeatureLayer=FeatureLayer(map.getLayer(searchLayer.label));
  61.                         layer.featureCollection=new FeatureCollection(featureSet,layer.layerDetails);
  62.                         layer.refresh();*/
  63.                         var obj:Object=new Object();
  64.                         obj.featureSet=featureSet;
  65.                         obj.layerName=searchLayer.label;
  66.                         obj.featureLayer=FeatureLayer(map.getLayer(searchLayer.label));
  67.                         AppEvent.dispatch(BusinessEventType.TEXT_FILTER_EVENT,obj);
  68.                     }
  69.                     
  70.                     function queryFeatures_faultHandler(info:Object, queryOptions:Object):void
  71.                     {
  72.                         showMessage(info.toString(), false);
  73.                     }
  74.                     
  75.                 }
  76.             }

  77. //AppEvent.dispatch(BusinessEventType.TEXT_FILTER_EVENT,obj);这里会触发搜索结果表格事件,把搜索的结果更新到表格来展示
复制代码
textFilter_Listener是展示搜索结果函数:
  1. private function textFilter_Listener(event:AppEvent):void{
  2.                 //Alert.show("The event is triggered!");
  3.                 var featureSet:FeatureSet=event.data.featureSet as FeatureSet;
  4.                 var layerName:String=event.data.layerName;//no use right now
  5.                 var featureLayer:FeatureLayer=event.data.featureLayer  as FeatureLayer;
  6.                 var businessTable:CustomAttributeTable=featureLayerToAttributeTable[featureLayer];
  7.                 businessTable.doSpatialFilter(featureSet);            
  8.                
  9.             }
复制代码
  1. public function doSpatialFilter(featureSet:FeatureSet):void{
  2.             this._map.removeEventListener(ExtentEvent.EXTENT_CHANGE,extentChanged_Refresh);
  3.             this._featureSet=featureSet;
  4.             if(featureSet==null){
  5.                 if(this.dataGrid&&this.skin){
  6.                     this.dataGrid.dataProvider=null;   
  7.                     this.skin.currentState="noFeaturesInCurrentExtent";
  8.                 }
  9.             }else{               
  10.                 if(featureSet.attributes.length>0){
  11.                     if(this.dataGrid&&this.skin){
  12.                         this.dataGrid.columns=this.createColumnsFromPopInfo();        
  13.                         this.dataGrid.dataProvider=new ArrayCollection(featureSet.attributes);   
  14.                         this.skin.currentState="normal";
  15.                     }
  16.                 }else{
  17.                     if(this.dataGrid&&this.skin){
  18.                         this.dataGrid.dataProvider=null;   
  19.                         this.skin.currentState="noFeaturesInCurrentExtent";
  20.                     }
  21.                 }            
  22.             }
  23.         }
复制代码
GIS作品:百度搜索:GIS之家(https://shop116521643.taobao.com/shop/view_shop.htm);
QQ兴趣部落GIS技术交流:gis之家(http://buluo.qq.com/p/barindex.html?bid=327395);
GIS技术交流群:432512093

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表