ArcGIS10 JSAPI开发系列之空间查询(一)
本文在上一篇文章——ArcGIS JSAPI实现坐标查询http://www.cnblogs.com/vivi5/archive/2012/08/15/2640761.html的基础上进一步完善,本次试验的主要任务是输入河流名称查询该流域水电站的属性信息并以grid形式展现,效果如图:
1.dojo.connect机制
1.1dojo.connect将对象、事件、环境和方法绑定,在指定的对象中通过一定的事件触发方法实现用户需要的功能。以下代码是对dojo.connect的具体应用:
1 var handler = dojo.connect( 2 dijit.byId('button'),//obj 3 "onClick",//event 4 map,//context 5 doFind//method 6 );
*obj*常通过dojo.byId来获得;*event*包含鼠标动作和其它的事件,W3C标准支持的鼠标动作有:
onclick
onmousedown
onmouseup
onmouseover
onmouseout
onmousemove
doFind()将在后续代码中定义。
1.2当需要断开绑定时,以下简单代码可以实现:
dojo.disconnect(handle);
1.3下面介绍两种dojo.connect特殊应用
一次性绑定:
1 var handle = dojo.connect( 2 dojo.byId("foo"), 3 "onmouseover", 4 function(evt) { 5 dojo.disconnect(handle); 6 } 7 );
循环绑定:
1 for (var i=0; i < 10; i++) { 2 (function( ) { 3 var foo = dojo.byId("foo"+i); 4 var current_i = i; //trap in closure 5 var handle = dojo.connect(foo, "onmouseover", 6 function(evt) { 7 console.log(current_i); 8 dojo.disconnect(handle); 9 } 10 ); 11 })( ); 12 }
2.FindTask类
FindTask是基于一个字符串搜索地图服务的方法,它可以是单图层或多图层的一个或多个字段。
建立一个FindTask:esri.tasks.FindTask(url, options?),url是必须的,即指定地图服务。
执行FindTask:execute(findParameters, callback?, errback?) ,findParameters是必须的,指定参数作为find条件。
以下代码是一个完整的findTask,作为1.1中doFind()实现。在本次试验中将findTask返回值存储到数据存储器(data store)中,并通过grid将其显示出来。
1 function doFind() { 2 findTask = new esri.tasks.FindTask("http://www.river.org.cn/ArcGIS/rest/services/river/MapServer"); 3 findParams = new esri.tasks.FindParameters(); 4 findParams.returnGeometry = true; 5 findParams.layerIds = [0]; 6 findParams.searchFields = ["河流"]; 7 //findParams.outSpatialReference = map.spacialReference; 8 findParams.searchText= dojo.byId("river").value;//输入河流的名字,id设置成“river” 9 findTask.execute(findParams,showResults); 10 }
3.dojo.data.ItemFileReadStore和grid
dojo.data是Dojo开发人员发明的一个API规范,帮助数据使用者将数据提供者以各种格式发送的数据重现。这个规范映射了四套称为特性(feature)的标准方法,分别为读特性(reading)、写特性(writing)、标识特性(identifying)和通知特性(notifying),每个特性都封装了一系列方法,本实验用到的ItemFileReadStore驱动实现了dojo.data.read和dojo.data.identity特性。grid是返回值的一种展现方式。被ItemFileReadStore使用的JSON数据必须满足下列格式:
1 { 2 identifier:<标识符名称>, 3 [lable:<标签名称>, ] 4 items:[ 5 { 6 <标识符名称>:<标识符值>, 7 [<标签名称>:<标签值>,] 8 <属性1>:<值1>, 9 <属性2>:<值2>, 10 …… 11 }, 12 …… 13 ] 14 }
JSON中的identifier属性值变为项(items)的标识属性的名称,可选label属性值变为项的标签属性的名称。最后通过items属性产生最终数据中的各个项(数组)。
1 var data = { 2 identifier: "名称", //唯一 3 label:"FID", 4 items:item 5 }; 6 store = new dojo.data.ItemFileReadStore({data:data });
item通过dojo.map获取:
1 var item = dojo.map(results,function(result) { 2 var graphic = result.feature; 3 graphic.setSymbol(symbol); 4 map.graphics.add(graphic); 5 return result.feature.attributes; 6 }
利用grid展示findTask返回的数组
1 var grid = dijit.byId('grid'); 2 grid.setStore(store);
还有很多不足,慢慢补充。