ArcGIS API for Flex 2.0 大量数据...

在普通的WEB开发中,分页查询数据库已经是WEB系统中历史悠久的功能,也是开发人员必须掌握的再不能简单的功能了,例如在Java开发中用JDBC或者Hibernater开发分页功能,但是在GIS应用系统中,对GIS数据,这样一个简单的分页功能却一直没有很好的实现的方法,让我们头疼不已,例如在要素查询、地址搜索等功能需要中,大量查询结果显示速度与效果差是常见的问题,我们往往能做到的也就是在前天进行假分页,但没有从根本上解决这一问题。但从ArcGIS API for Flex 2.0开始这个问题可以得到很好的解决!


第一步: QueryTask.executeForIds(query:Query, responder:IResponder = null):AsyncToken 在ArcGIS API for Flex 2.0对QueryTask做了很大的改进,其中之一就是增加了executeForIds()方法,它的功能是对一个图层或者表执行查询功能,返回一个Objectid的数组。 lexecuteForIds()方法没有返回Geometray对象,和其他字段,只有数字类型的Objectid,所以他的效率和返回的结果占用的内存非常小,查询效率非常高 lexecuteForIds()不受ArcGIS Server的最大返回结果数限制,是多少返回多少 lexecuteForIds()对数据的检索方式与普通的QueryTask.execute()有所不同,效率更高 以上三点决定了对大数据量的查询用此方法对服务器和客户端的压力都非常小,而通过它我们缺得到了一个分页查询中最重要的信息:记录总数!这样我们就可以确定我们的页数了!如下程序所示:
//执行executeForIds public function startQuery(map:Map,url:String,sql:String,img:String):void{ this.map=map; graphicsLayer.name = "Search Results"; this.img=img; queryTask=new QueryTask(url); queryTask.useAMF=true; query=new Query(); query.where=sql; query.objectIds=[]; queryTask.addEventListener(QueryEvent.EXECUTE_FOR_IDS_COMPLETE,executeForIdsOnResult); queryTask.executeForIds(query); } private function executeForIdsOnResult(eventueryEvent):void{ queryTask.removeEventListener(QueryEvent.EXECUTE_FOR_IDS_COMPLETE,executeForIdsOnResult); objectIdsArray=event.objectIds; total=objectIdsArray.length;//取得总记录数 var t:int=this.getSumPage();//取得页数 pagedetail.text="第"+currentPage+"页/共"+t+"页"+" 每页"+pageSize+"条"; firstPage(); }复制代码
第二步: QueryTask.execute(query:Query, responder:IResponder = null):AsyncToken
在ArcGIS API for Flex 2.0中的Query对象新增加了一个属性Objectids,用于指定执行查询的objectid的范围,这就使我们根据executeForIds()得到的每一夜的Objectids去执行查询,实现分页查询,如下代码所示:public function showProject(p:int,s:int):void{ query=new Query(); var startIndexObjectIDArrayInPage:int = (currentPage - 1) * pageSize; var endIndexObjectIDArrayInPage:int = startIndexObjectIDArrayInPage + pageSize; if (endIndexObjectIDArrayInPage > objectIdsArray.length) { endIndexObjectIDArrayInPage = objectIdsArray.length; } query.where = ""; query.objectIds = objectIdsArray.slice(startIndexObjectIDArrayInPage, endIndexObjectIDArrayInPage);//查询的ID范围 query.outFields=["ZHANHAO","FENGXIANG","FENGSU","QIYA","WENDU"]; query.returnGeometry=true; query.outSpatialReference = map.spatialReference; //perform Query queryTask.execute(query,new AsyncResponder(onResult, _disibledevent=> }复制代码
总结:通过以上内容我们看到通过executeForIds()和得到所需要的记录的objectids,然后根据每页的objectids再进行查询实现分页分页查询,使我们的GIS数据也能够实现正真的分页查询。
Tags: 

延伸阅读

最新评论

发表评论