基于ArcGIS Server 10 在flex瓦片客户端叠加瓦片服务

来源:互联网 发布:王勇平 知乎 编辑:程序博客网 时间:2024/06/05 02:59

1. ArcGIS Server 10 缓存机制

昨天用了ArcGIS 10的时候才发现ArcGIS Server 10引入了新的地图缓存格式,其目的是使得其实用和迁移更加方便。在定义缓存的tiling scheme时,现在可以选择Exploded或者Compact两种格式。

clip_image002

以下信息截取自http://www.gisall.com

Exploded是以前版本ArcGIS Server中的缓存格式,也就是每个tile以一个单独图片文件来存储。

Compact 是AGS10中的新格式。它并不是将缓存文件进行打包或压缩,而是将它们拼装成更大的bundles格式的文件。一个bundle文件最多可以存储16,000个tile。这样就能大大介绍缓存文件夹中文件的个数。如此便能提高缓存的拷贝速度,尤其适用于在一台服务器上生成缓存之后,需要将其迁移到另一台生产服务器上的情景。

compact存储格式还有一个优点,就是不会浪费磁盘空间。windows平台默认情况下,一个文件最少占用4KB磁盘空间(由簇大小决定),不足4KB的文件则会出现浪费情况。对于传统的地图缓存格式,往往有成千上万个图片文件,此时查看文件夹“大小”和“占用空间”可以发现,后者比前者要大许多,多出来的部分即是空间浪费。 采用compact格式后,缓存文件夹的“大小”和“占用空间”基本一致,因为每个bundle文件浪费的磁盘空间不会超过4KB,而bundle文件的个数比采用传统缓存格式的图片文件个数要少得多。

ArcGIS客户端,包括Web API,知道如何读取compact格式的bundle文件。如果你需要自己利用代码从virtual directory中取出tile文件,那么你只能继续使用传统的exploded格式。因为目前没有开放bundle文件格式的读取办法。

2. ArcGIS 瓦片服务准备

1、制作mxd文档;

2、利用arcgis server manager 或者Catalog来发布服务,并生成相关切片;

具体如何 发布服务和瓦片的切图就不回顾了,但我在使用过程中还是出了一些问题, 建立了地图缓存服务, 使用Titled显示地图服务,运行程序的时候提示“Error: E0005E: Invalid tile service”,在网上搜索了一下,给出了答案:

1、在地址栏键入URL: http://<host>:8399/arcgis/rest/admin

注意,如果是.NET Server请键入URL:http://<host>/arcgis/rest/admin

2、在登陆框中键入用户名和密码,该用户名和密码,与ArcGis Server Manager 登陆的账户一样。

3、进去之后,找到“Clear Cache Now” 这个超链接,点击即可。

这三个步骤进行之后,重新切片。客户端正常运行。

3. 自定义flex客户端叠加ArcGIS Server瓦片

叠加ArcGIS的瓦片从原理上分析应该有两种方法:

1、 直接将客户端瓦片地址发布,不经过服务端中转而直接请求瓦片;

2、 根据相关规则请求瓦片至ArcGIS Server服务端,叠加相关瓦片。

下面对第2种方法大体进行一下描述:

在flex中,如何在自已的客户端对ArcIGS Server进行图层叠加呢,其实从原理上来讲,就是两个Canvas的叠加,其中一个Canvas装载的是ArcGIS Server的瓦片,另外一个装载的是我们自己的瓦片,其中ArcGIS Server的瓦片作为底图加载至下面,而我们的瓦片则是透明的图层,这样,两者就能完全的结合起来。那这两者结合的最关键的地方就是两者的位置统一,那么在指定的地图范围以及指定的屏幕大小(即Canvas的大小)加载ArcGis Server的步骤应该是由以下几步组成:

(1)首先根据http://服务地址?f=json 获取相关参数,这个参数主要包括切片大小、起始点坐标、切片的级别;

(2)根据给定的地图范围判断当前应该显示哪个级别的图片,这个涉及到一点算法,主要就是经过一个遍历,循环读取上面获取的切片级别代码的实际长度,看看哪个级别最为符合即可,这样你就可以知道下面应该在哪个级别来获取图片了,在这一步中,就可以算出当前起始点的左上角的图片的获取地址了,比如:

http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer/tile/3/1/2

(3)计算相关的偏移量,这个也容易理解,以上图的图片为例,因为此瓦片的左上角坐标并不一定与我们给定的地图范围重点,因此,要经过一定的偏移,使地图的左上角与指定的地图坐标相重合,具体的算法我就不介绍了。

但有一点,我在叠加两个来自不同地方的瓦片的时候会存在有一定的偏差,也就是说两个相同的图层,经切片后,不能完全吻合在一起,但所幸,这种偏差是线性的,所以可以人为的适当调整。

所有版权归小能所有哦!!!