arcgis js开发系列源码请移步我的github上获取(https://github.com/lpgray/arcgis-js-showcase

本次开发实现的功能:

  1. 通过文本框输入关键字搜索江苏省市级单位,将结果地块高亮显示在地图上,使用Find实现
  2. 在江苏省地图上点击某一点,获取该点所在的地块信息显示并且高亮该地块,要求实现不同层级下的地块获取,比如当现在显示的是市级地图,点击某一地块就显示市级信息,如果当前显示的是区县级地块地图,那么显示的就是区县的地块信息,查询优先级是 城镇 > 区县 > 市。

本次开发涉及到的要点:

FindTask、IdentifyTask之间的异同,以及与QueryTask之间的异同。

FindTask, IdentifyTask, QueryTask之间的异同

1. 首先是操作的对象不同,FindTask 与 IdentifyTask 都是支持多图层检索的,那么OK,他们的操作对象就是服务下的多个图层,也可以认为是面向服务的操作,因为一个服务包含多个图层;而QueryTask仅仅支持单个图层,那么它的操作对象就是一个服务下的某个图层。

2. 第二个不同是Query 与 Find 返回值JSON结构与QueryTask的返回值结构不同,前两者是相同的。

3. 第一个相同点,这三者都支持返回几何字段。这就代表这三者都可以进行几何查询,即查询某地块高亮显示、查询路线等,不过几何查询大多数情况下推荐使用 Identify,因为它的查询参数比其余两者强大,支持空间字段参数,比如可以限定查询的区域范围、精度等等。其余两者大多数都会用在属性查询的场景下,没有空间查询参数,而在已经知道准确的图层的情况下,使用Query应该是效率最高的。

4. 这三者什么情况下使用以及三者的效率(待测评),据猜测肯定是 Query 的效率最好,因为它仅仅支持单个图层检索,而其余两者肯定会有逐层查询在其中。

Find 关键字搜索地块并高亮显示结果

这块没什么难的,分析一下,无疑是输入文字,传入参数,执行任务,结果渲染。其实跟上一篇笔记的 Query 部分很像,唯一不一样的是在构造FindTask实例的时候传递的url是服务名,不带图层号,另外要多加一个参数layerIds,即待检索的图层编号,最后渲染结果的时候注意,它与Query返回的JSON数据结构不一样。具体的代码就去github上扒吧,在 Find.js 里。

Identify实现点击地块获取数据

这部分的功能有一点小复杂,需要综合分析,我的思路是如下:

首先添加基本服务到地图上,这个基本服务一定要符合题目要求吧,即江苏省图,带有市、县、镇图层的服务,我们内网有这么一个地图,我就直接用了。

其次,需要点击地图上的某一点,然后判断这个点所在的地块,地块还要根据不同层级不同对待,这个我头就大了,毫无思路,于是乎上官网找教程,可惜这种类似的真没找到,只有一个点击显示属性的,却没有根据不同层级显示属性的,我也不管了,我先根据官网代码实现他的那种功能再说。

定义 IdentifyTask -- 构造默认 IdentifyParameters -- 点击地图事件处理(这部分是重点,我就是参见的官网教程),其中比较重要的代码贴一下

function doIdentify( e ){
oidentifyParams.geometry = e.mapPoint;
oidentifyParams.mapExtent = map.extent;
oidentifyTask.execute(identifyParams, function(results){
oshowResult(e, results );
o}, function(err){
oconsole.error(err);
o});
}

那个e是地图点击事件处理函数的参数,geometry 获取的是 e.mapPoint 即点击的经纬度吧,然后地图的范围就是查询范围,实际上这里是否可以构造一个点击的点周边1公里内的范围,这样可能查询速度会更快。

好了,完成这部分代码以后我已经能实现官网上类似的效果,点击某点,获取市级地块信息和空间数据并高亮显示。

下一步就是实现逐级了,我仔细看了下代码,发现了规律!即 IdentifyParameters.layerIds这个参数的图层顺序,这个顺序不是没有含义,而是有优先级的意义在里面,也就是说,在第一个的优先查询,于是我调了一下图层ID的顺序(村、镇、县、市依次排列),果不其然,实现了!贴一下图效果,arcgis 的 REST service太强大了,具体代码请去github获取。