本节书摘来自异步社区《javascript构建web和arcgis server应用实战》一书中的第2章,第2.5节,作者: 【美】eric pimpler(派普勒) 更多章节内容可以访问云栖社区“异步社区”公众号查看。
一幅没有数据图层的地图就像一个画家的空白画板一样。添加到地图中的数据图层让其有意义并为分析奠定了基础。提供数据图层添加到地图中主要有两种类型的地图服务:动态地图服务图层和切片地图服务图层。
动态地图服务图层在运行时创建地图图片并引用地图服务,然后返回图片到应用程序中。这种类型的地图服务或许由一个或多个图层信息构成。图2-4所示为demograhpics地图服务,它由九个不同的图层构成,分别从不同地理层次代表demographic信息。

https://yqfile.alicdn.com/9710ea2e558d6fbde9ca2f714864913b27a7483a.png" >
客户端应用程序显示将花费更多时间,因为它们必须是动态生成的,所以动态地图服务层服务比切片地图服务图层拥有更多功能。在动态地图服务图层中,你可以通过控制图层定义显示的特征,设置地图服务中各图层的可见性并定义图层的瞬时信息。例如,在前面的图中描述的demographics地图服务图层,你可以选择在你的应用程序中只显示census block group图层。这是一种通过动态地图服务图层提供的功能,而在切片地图服务图层中则没有这样的功能。
切片地图服务图层引用的是一个预先定义好的地图切片缓存而不是动态加载的图片。用最简单的方法来理解切片地图服务,就是将它认为是覆盖在地图表面的网格。网格中的每一个单元格同样大小,用来将地图分割成单独的图片文件,从而成为切片。单个的切片是服务器上存储的图像文件,当需要的时候根据地图范围和比例尺来检索。在不同的地图比例尺下,这个过程会重复执行。当地图在应用程序中显示时,虽然地图由很多单独的切片构成,但是它们看起来是无缝拼接的,如图2-5所示。

https://yqfile.alicdn.com/1262637c20a8c340fa472b6bc3154fb86c917a65.png" >
这些切片或者缓存地图图层通常用作底图,包括影像图、街道图、地形图或者不常发生变化的数据图层。切片地图服务显示速度更快,因为每次运行时向地图发送一个请求而并无创建图片的开销。
操作图层常覆盖在切片地图上面,这些图层通常为动态图层。虽然它们在执行时慢一点,但是动态地图服务图层有着在运行时仍可以定义外观的优势。
2.5.1 使用图层类
使用arcgis apiforjavascript中的图层类,可以引用宿主在arcgis server和其他地图服务器中的地图服务。所有的图层类继承自layer这个基类。由于layer类没有构造函数,所以你不可以专门针对这个类来创建一个对象。你可以简单地通过继承自layer的子类来定义属性、方法和事件。
如图2-6所示,dynamicmapservicelayer、tiledmapservicelayer和graphicslayer全部继承自layer类。dynamicmapservicelayer和tiledmapservicelayer也可以作为基类。dynamicmapservicelayer是动态地图服务的基类,tiledmapservicelayer是切片地图服务的基类。第3章“添加图形到地图”完全使用图形和graphicslayer,所以我们将在本书后面部分讨论这种类型的图层。layer、dynamicmapservicelayer和tiledmapservicelayer都是基类,所以在应用程序中不可以从这些类中指定创建一个对象。
2.5.2 切片地图服务图层
如前面部分提到的那样,切片地图服务图层引用预先定好的图片缓存切片拼接在一起显示一幅无缝的地图,它通常用作底图。
如图2-7所示,arcgistiledmapservicelayer类使用在当引用arcgis server暴露的切片(缓存)地图服务时。这种类型的对象使用已经缓存过的切片地图集合,所以性能得以改善。arcgistiledmapservicelayer构造函数接收url指针指向地图服务,以及一些允许为地图服务指定id和控制其透明度与可见性的选项。

https://yqfile.alicdn.com/3e25aba43ab95de18dfaaac0954e81cd5f9c560e.png" >
如下列示例代码,注意arcgistiledmapservicelayer构造函数接收一个引用地图服务的参数。当一个图层的实例创建后,调用接收一个包含引用切片地图服务图层的变量到map.addlayer()方法中并添加到地图上。
arcgistiledmapservicelayer主要用来快速显示缓存的地图数据。你还可以控制显示数据的层级。比如,你想展示广义的arcgistiledmapservice的数据,当用户放大到0~6级别时显示州际公路和高速公路,一旦用户进一步放大就切换到更详细的arcgistiledmapservice。你还可以控制添加到地图上的每个图层的透明度。
2.5.3 动态地图服务图层
顾名思义,如图2-8所示,arcgisdynamicmapservice类用来动态创建arcgis server地图服务。和arcgistiledmapservicelayer一样,arcgisdynamicmapservicelayer的构造函数接收一个指向地图服务的url和一些参数选项用来为服务分配一个id、设置地图图片的透明度和图层初始可见性选项为true或者false。arcgisdynamicmapservicelayer的类名有时有误导性。虽然看上去是引用一个单独的数据图层,但实际上不是。它指的是一个地图服务而不是一个数据图层。地图服务内部的单个图层可以通过setvisiblelayers()方法来打开或者关闭。
创建一个arcgisdynamicmapservicelayer的实例和arcgistiledmapservicelayer非常类似,下列示例代码说明了这一点。构造函数接收一个指向地图服务的url参数。第二个参数定义了可选参数,用来控制透明度、可见性和图像参数。
如下列代码所示,将上面两行代码添加到arcgis api for javascript沙盒中。
运行上面的代码可以看到动态图层添加到了地图上,如图2-9所示。

https://yqfile.alicdn.com/e1c32b9c4d9c0401d8402e12477bb0461b28d2ec.png" >
使用arcgisdynamicmapservicelayer实例可以执行多种操作。显然,你可以创建地图来显示服务中的数据,你还可以查询服务图层中的数据、通过层定义控制特征显示、控制单个图层的可见性、设置时间相关信息、导出地图为图片、控制背景透明度和进行更多操作。
2.5.4 添加图层到地图
addlayer()方法接收一个图层(arcgisdynamicmapservicelayer或者arcgistiledmapservicelayer)的实例作为第一个参数,一个可选索引指示图层放置的位置。下列示例代码创建了一个新的arcgisdynamicmapservicelayer实例指向服务的url。然后调用map.addlayer()并传递图层的一个新的实例。服务中的图层现在在地图上可见。
addlayer()方法接收图层对象数组并一次添加成功。
除了能够添加图层到地图外,还可以使用map.removelayer()或者map.removealllayers()来从地图中移除某个或者所有图层。
2.5.5 地图服务设置可见图层
可以使用setvisiblelayers()方法控制动态地图服务中单个图层的可见性。该方法仅适用于动态地图服务图层,对切片地图服务图层则不适用。该方法接收一个整型数组,对应地图服务中的数据图层索引编号。
这个数组是从0开始的,因此地图服务中的第一个图层占据位置0。如图2-10所示,demographics地图服务中demographics/esri_census_usa占据索引0。
因此,如果只想显示这个服务中的census block points和census block group图层的话,我们可以使用setvisiblelayers()方法,如下列代码所示。
{"slider":false,"nav":true,"opacity":0.5,"imageparameters":imageparameters}
{"nav":true,"opacity":0.5,"imageparameters":imageparameters}
var map = new map("mapdiv", {
var map = new map("map");
var extent = new extent(-95.271, 38.933, -95.228, 38.976);
map.setextent(extent);
var extent = new extent();
extent.xmin = -95.271;
extent.ymin = 38.933;
extent.xmax = -95.228;
extent.ymax = 38.976;
map = new map("mapdiv", {extent:esri.geometry.geographictowebmercator (myservice2.fullextent) });