48
1 基于 ArcGIS 的空间数据集成 解决方案 ESRI 中国(北京)有限公司 二〇〇八年一月

基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

  • Upload
    others

  • View
    14

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

1

基于 ArcGIS 的空间数据集成

解决方案

ESRI 中国(北京)有限公司

二〇〇八年一月

Page 2: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

2

版权所有,翻录必究 ESRI 中国(北京)有限公司保留本书全部内容的所有版权。本书受中国版权法及其它国际

版权条约和公约的保护。未经 ESRI 中国(北京)有限公司的书面许可,不得以任何形式或

手段复制、传播、或以任何电子或文本方式翻印、转载本书的任何部分。如有疑问,请与

ESRI 中国(北京)有限公司联系:北京市东城区朝阳门北大街 8 号富华大厦 A 座 12 层 D室 邮编:100027 本书内容的更改将不另行通知。 ESRI、ESRI 地球标志、ArcCatalog、ArcGIS、ArcIMS、ArcMap、ArcObjects、ArcSDE 均

是环境系统研究所公司(美国)在美国、欧盟和其它某些司法等辖区的商标,注册商标或服

务标志。本书涉及到的其它公司和产品是术语其各自商标拥有人的商标或注册商标。

Page 3: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

3

目 录

目 录 ..............................................................................................................................................3 第一章 概 述.................................................................................................................................4 第二章 ArcIMS Cache Builder........................................................................................................5

第一节 ArcIMS 缓存生成器参数...........................................................................................5 第二节 ArcIMS 缓存生成器安装...........................................................................................7

第三章 ArcGIS Server 地图缓存 ...................................................................................................8 第一节 什么是缓存地图服务?.............................................................................................8 第二节 计划地图缓存...........................................................................................................11

3.2.1 Tiling schema orign(块设计原点) .........................................................................11 3.2.2 Scale levels(比例尺级别) ......................................................................................12 3.2.3 Tile output size(块输出大小).................................................................................12 3.2.4 Antialiasing(反锯齿) ........................................................................................13 3.2.5 DPI .........................................................................................................................13 3.2.6 比例尺级别选择...................................................................................................14 3.2.7 Server resources(服务器资源)...............................................................................14

第三节 创建地图缓存...........................................................................................................15 3.3.1 创建缓存................................................................................................................15 3.3.2 更新缓存................................................................................................................16 3.3.3 删除缓存...............................................................................................................17 3.3.4 使用已有缓存.......................................................................................................17

第四节 使用地图缓存...........................................................................................................17 3.4.1 使用地图缓存.......................................................................................................17 3.4.2 叠加地图缓存.......................................................................................................26

第四章 使用 Flexview...................................................................................................................29 第一节 MapService 地图服务 ..............................................................................................29 第二节 Mapview 地图浏览...................................................................................................31

4.2.1 ArcIMS 缓存设置................................................................................................32 4.2.2 ArcGIS Server 缓存设置 ..................................................................................32

第五章 OpenLayers .......................................................................................................................34 第一节 Open Layers 简介 .....................................................................................................34 第二节 实现 Google 和 AGS 的地图整合 ...........................................................................36

5.2.1 获取 googleMap 地图..........................................................................................36 5.2.2 整合 Google Map 和 Arcgis Server 地图 .......................................................39

第六章 功能扩展...........................................................................................错误!未定义书签。

Page 4: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

4

第一章 概 述

GIS 在国内发展的时间比较短,近年来随着国家信息化政策的重视成都越来越高,GIS

发展也经历了一次飞跃式的推广,GIS 概念和技术也在不断推陈出新。GIS 技术也在不断的

开源化和“平民化”。世界上各大产商也打算在这一领域拓展业务,如微软的 VE,Google

的 GE 等。特别是搜索引擎巨头 Google 参与了这一领域后,更是把 GIS 概念普及化,让人

知道地图不仅仅是深领域的概念,而是与日常生活息息相关。

本篇文章的目的,就是结合商业的地图应用与专业的 GIS 服务的地图的熔合。可以充

分利用商业地图的优势—地图的更新速度与资源,并结合专业的特点—高级的地图分析功

能。随着 Google Map 等地图技术的普及,地图缓存技术逐渐成为大家追求 Web 地图响应速

度的方法,而目前应用的最广泛的 WebGIS 的产品要数 ArcIMS 了,但 ArcIMS 本身并不提

供缓存建立的工具或方法;ArcGIS Server(AGS)可以说是 GIS 发展的主流方向,并且提

供高级地图缓存创建的工具和方法,但除了 ArcGIS Server 自己的应用,如何能够在其它应

用中使用AGS的缓存?或如何在AGS中使用其它的地图缓存?从而实现应用资源或技术的

整合;开源技术的发展推动了 GIS 应用的更进一步的普及,OpenLayers 是开源的代表,那

么 OpenLayers 又如何能够结合 AGS 或 Google Map 之类的资源呢?

带着这些问题,本篇从几个方面来加以阐述,首先是介绍 ArcIMS 的缓存工具与调用方法,

第三章介绍 ArcGIS Server 的缓存原理与调用缓存方法,第四章着重 Flex 的技术来使用地图

缓存,第五章则讲述采用开源的 OpenLayers 如何来整合地图资源,第六章介绍专业的分析

功能,ArcGIS 在地图上的 GIS 功能扩展。

Page 5: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

5

第二章 ArcIMS Cache Builder

第一节 ArcIMS 缓存生成器参数

ArcIMS 与 ArcGIS Server 不同,本身并不提供缓存管理的工具,也没有缓存管理机制。

ArcIMS 的客户端请求都是实时通过请求地图来生成图片。通过 ArcIMS 缓存生成器,我们

就可以方便的生成地图缓存,为多元服务提供服务,可以进行快速的地图浏览。在使用

ArcIMS 缓存生成器需要注意几个参数:

图:缓存生成器

服务器连接设置:包括连接 ArcIMS 服务器的端口和地图服务。

输出投影:可以有三种选择.World_Mercator,GCS_WGS_1984,任意投影。输出投影

与剪切图片的方式有关。对于 Google 地图和 Yahoo 地图等目前多用摩卡托投影,因

此在与 google 地图叠加时候,输出投影参数需选择摩卡托投影。

图片尺寸: 切割缓存地图的图片大小。默认情况为 256,也可以选择其他的图片尺寸,

如 128,512 等,图片的大小的选择请参考 ArcGIS Server 缓存章节。图片格式可以有

JPG,PNG,GIF 等多种,JPG 不支持透明图层,因此如有多层叠加的地图图层,一般

不要选择 JPG。图片格式选择可以参考 ArcGIS Server 缓存的“叠加地图缓存”章节

内容。

Page 6: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

6

背景颜色:可以选择或自定义一种地图背景的颜色,也可以使地图背景透明

缓存级别:需要建立的缓存的级别,可以自定义输入(注:可参考 Google 的缓存级

别,目前 Google 地图缓存最大级别为 1-19 级,国内到 18 级)。

名称前 :保存缓存目录的名称,默认为 IMG。

ArcIMS 缓存生成器的缓存虚拟目录与 ArcGIS Server 类似,在前 目录名如 IMG 下

会产生多种比例尺级别的文件目录,如第一级为 IMG_1,第二级为 IMG_2,依次类推。

第一级,第一行,第一列的图片用 1_0_0.png 来表示,以此类推。如下图所示:

图:ArcIMS 缓存生成目录

保存路径:所生成的 Cache 所保存的路径。

地图范围:需要生成缓存的地图范围。

多线程:可以通过多线程,尽量利用计算机系统的资源,提高生成缓存的速度。

生成 ArcIMS 缓存需要两个步骤的操作: (1)、创建 ArcIMS 服务 ArcIMS 服务创建请参考相关的 ArcIMS 的帮助文档或参考手册,这里不作详细介绍。 ArcIMS 缓存生成器可以支持 ArcIMS 的所有地图服务。包括 ArcMap Image Server。

Page 7: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

7

(2)、用 ArcIMS 缓存生成器建缓存

输入服务器,端口号,服务名称。如果服务器在本机,可以直接输入 127.0.0.1; 端口

号为 ArcIMS 默认的端口连接:5300; 地图服务可以输入在 ArcIMS 的 Administrator 中

所创建的地图服务名;然后测试连接。

缓存参数设置。根据需要,设置相应的缓存参数,缓存的保存路径。

地图范围。地图范围设置会影响地图缓存的数量和生成缓存的时间。可以手动输入某

一个地图服务的全图范围的参数。我们在创建全国和地市地图缓存时候,通常全国范

围地图的缓存级别低一些,例如可以为 1-9 级的缓存,地图范围也大一些,设置当前

的地图范围,可以防止缓存生成许多空白的无数据图片。当创建更大比例尺的城市地

图时候,缓存级别相对设置高一些,如可以设置 10-18 级,同时把地图范围也缩放到

当前城市所在的地图范围,这样缓存生成器对 10-18 级的比例尺,就只对当前城市范

围生成缓存,其它范围不再计算。可以大大提高缓存速度和减少不必要的图片空间存

储。

缓存属性。可以统计缓存级别总数,所生成缓存的图片总数,当前缓存生成的级别和

进度,以及开始和结束时间。

第二节 ArcIMS 缓存生成器安装

ArcIMS 缓存生存器安全需知:

(1)、安装之前,需要预先安装.Net Framework 2.0

(2)、安装之前先安装 ArcIMS 软件和 ArcIMS DotNet FrameWork

(3)、运行 ArcIMSCacheBuilder 的 Setup.exe 文件安装。

Page 8: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

8

第三章 ArcGIS Server 地图缓存

地图缓存是让 ArcGIS Server 地图快速的有效方法。当你创建了一个地图缓存,服务器将

对整个地图划分成不同的比例尺,然后保存地图的图片。当有人需要这样的地图的时候,服

务器会分配相应的这些图片。

缓存不是自动发生的。为了生成一个缓存,你必须设计地图,从地图发布服务,然后开始

用缓存生成工具。你可以在 ArcCatalog 中,使用“Service Properties”来使用缓存工具。在

9.2,缓存标签添加到服务属性窗口中。在这里你可以用来生成缓存。

当你缓存一个地图,你生成了不止一个比例尺,所以用户可以进行对地图进行缩放操作。

缓存工具会问你需要什么样的比例尺来缓存。如果你只是第一次试用缓存工具,你可以让计

算机为你选择几种比例尺。然后,通常你应该提前选择比例尺,这样在这些比例尺下,你的

地图看起来比较美观。在 ArcMap 制图设计时候,记下这些比例尺。在创建缓存时候,你可

以把这些比例尺输入到缓存工具中。

下面我们来看看 ArcGIS Server 的缓存的一些原理:

第一节 什么是缓存地图服务?

一个缓存的地图服务是使用缓存的静态图片来提供地图服务。地图缓存是一个目录,包

含了在特定比例尺级别下,地图范围内的图片块。服务器通过缓存返回块比返回实际的地图

图片要快许多。

Page 9: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

9

上图地图被缓存成两个比例尺。服务器可以直接返回这些块给客户端,而不需要根据每个

请求需要再实时的渲染地图。

你可以使用 ArcCatalog 或编码地理处理工具对已有的地图服务创建缓存。一旦你创建

了缓存,服务器就可以使用这些块,而且不再需要动态渲染地图。创建有效的缓存,需要一

些设计和计划。

缓存。由地图服务缓存目录组成,包含块(图片)的集成集合,以及一个描述缓存块

结构的文件(config.xml)。

Web Server. Web 服务参考实际的地图服务,Web 的虚拟目录参考实际的缓存目录,

当虚拟缓存目录无法访问时候,就使用块处理服务。

ArcGIS Server.。ArcGIS Server 保存了提供地图缓存信息,支持查询和数据操作的地

图服务,有时候当缓存不可用时,就绘制地图块。

缓存

缓存类型

有两种类型缓存地图服务。一个地图服务可以作为单一融合缓存或多层缓存。单一融合缓

存在每个比例尺包含所有的图层群组在一起所生成的图片块。融合缓存作为 组 图层出现,

并且不允许图层的打开或关闭(即不允许对组里的单个图层进行显示或不显示),选择要素,

或调整标注。多图层缓存包含了在每个级别的每个单独图层创建图片块。多图层缓存在客户

端可以控制显示,标注和要素选择。

Page 10: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

10

图上所示”Lawrence”是用 Multi-Layer Caches 创建的,“WebDemo”是用 Fuse Cache 创建

的,Multi-Layer Caches 为不同图层分别创建了 Cache 目录。而 Fuse Cache 把所有图层都放

到_allayers 目录下。

缓存组织:缓存目录继承性

地图服务缓存目录存在 ArcGIS Server 注册时候的 Server 缓存目录中。

当你创建了一个简单融合缓存或多图层缓存,你都可以找到一个名为_allayers 或多级子目

录的简单的子目录,在每个子目录底下,你又可以找到不同级别比例尺的下一级目录,如

L00 表示第一级比例尺,L01 表示第二级比例尺;再往下一级目录,表示每个块的“行”,

用”Rxxxxxxxx”即 R 加八位编码,“R00000000”表示第一行,依次类推,然后再往下目录表

示每个块的“列”的图片,用“Cxxxxxxxx”,即 C 加八位编码表示“C00000000”表示第一

列,其它依次类推。下图是地图服务缓存目录的继承图,显示的是单一融合缓存的结构。

Page 11: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

11

你可以选择块大小,从 128,512,或 1024 像素中选,当然最佳选择是 512 大小,输出的图片格式可以为

PNG8,PNG24,PNG32,JPEG。如果没有设置地图文档的背景颜色,默认为 253,253,253;当然这可以在

ArcMAP 中更改。

缓存描述:缓存配置文件

描述了缓存的完整信息,包括组织机构,空间参考,图块比例尺等,保存在 “conf.xml”文件中。

第二节 计划地图缓存

建立一副大范围的大比例尺地图缓存的时间和空间代价是相当大的。因此需要计划好需要

建立缓存的级别。下面我们看一下缓存的一些属性:

3.2.1 Tiling schema orign(块设计原点)

默认情况下,块设计的原点设置在地图文档定义的坐标参考的左上角。如果没有定义坐标

参考,那么在所有图层组合范围的两倍大小的左上角。如下图块起点定义了格网的开始点,

Page 12: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

12

但是块只在覆盖整个地图范围的格网部分创建。

3.2.2 Scale levels(比例尺级别)

当你创建一个缓存,你可以让 ArcGIS Server 自动为你选择级别,你可以自己定义。

当你选择“Standard”比例尺选项,ArcGIS Server 将为你选择级别。它将使用 1:1,000,000

的一半或翻倍比例,并以最接近当前地图文档的比例尺为起始级别。例如,如果当前地图的

范围为 1:121,000,000,并且定义了 3 个级别比例尺做缓存,那么服务器将自动创建以下三个

级别比例尺:

1/128,000,000

1/64,000,000

1/32,000,000

“Custom”比例尺选择,可以让你自己定义比例尺大小。

3.2.3 Tile output size(块输出大小)

选择小的宽度和高度的块可以提高性能,并且只需要传送少量的数据。但是,小的块大小

会长生大量的缓存大小,并且需要大量的时间来创建。因为 Windows 磁盘块大小是 4k,小

的块可能只需要 1k 的大小,但是存储时候实际上也用了 4k。大的块可能大小是 4k,而且刚

好符合 Windows 系统的块的大小 4k。因此 4 个 1k 的块使用了 16k 的磁盘空间,但是单个的

Page 13: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

13

4k 的块却只使用 4k 的磁盘空间。对于大量的块来说,这个不同就更加明显了。这也是为什

么我们一般都选择 512 作为块的大小的原因。

3.2.4 Antialiasing(反锯齿)

反锯齿是图像处理技术,利用前景和背景的像素接近边缘,让眼睛看起来显得更光滑的边

缘。ArcGIS Server 缓存并不使用真是的反锯齿,但是做相似的工作,让标注,未填充的线

和多边形要素看起来更光滑。ArcGIS Server 在产生缓存时候,在切除块成更小的块之前,

把 4k x 4k 的像素降低取样到 2k x 2k 的像素块,使用这个选项之需要很小的性能代价。如果

你不需要提高文本和线的清晰,那么就不要使用它。

如果你在做矢量图层和影像叠加时候,要小心使用这个工具。数据框的背景色取决于反锯

齿要素的颜色。默认情况下,背景框的颜色为 RGB 253,253,253(几乎是白色的),这会引

起反锯齿要素像故意变白,特别是当放置了暗色的栅格图层如正射影像时候。最有效的方式

是,在创建缓存以前把背景色改成暗色。某些软件工具可以允许让你查找已有图像的平均色,

这对于做背景色是最好的。

3.2.5 DPI

DPI 指 dots per inch,指服务器产生缓存块时候的分辨率。DPI 依赖与用户的屏幕分辨率

(例如 1024x768)和物理大小(如,19”寸)。DPI 在客户端机器上差别比较大,因为大的屏

幕(低 DPI)和高分辨率的屏幕和图形卡(相应的 DPI 通过设置可以增加)。如果客户端频

繁的需要打印地图,包括你的缓存图层,你会发现提高 DPI 是很有帮助的,但是需要注意

Page 14: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

14

的是这也将增加缓存文件的大小。

当选择 DPI 时候,默认值是 96,通常来说已经足够了,除非你是在网络上工作,而且你

的客户端机器有不同的 DPI。

3.2.6 比例尺级别选择

当选择缓存地图级别时候,记住地图放的越大,需要越多的块来覆盖地图范围,也需要越

长时间来产生缓存。每次你需要把地图比例尺处以 2,将需要花四倍的块大小来覆盖整个地

图范围。例如,1:500 相比 1:1000,多出四倍的块大小空间。1:250 相比 1:1000 多出

了 16 倍。

想知道缓存块增加的多块,你可以在 ArcMap 中打开一个地图。进行缩小操作,你可以

看到地图上一个区域 512x512 范围(这个区域根据你的显示的设置,通常是 5-6 英寸

(12.70-15.24cm))。在这个比例尺,将需要一个缓存块来覆盖这个区域。现在你就有了地

图的比例尺。(例如,如果你原始查看地图比例尺是 1:40,000,放大到 1:20,000),将需要 4

个块来覆盖这个区域。依次类推如下:

3.2.7 Server resources(服务器资源)

当你创建缓存时候,你可以指定地图服务器进程的数量。进程越多,就越多的服务器资

源一起参与建立缓存,缓存就生成的越快。一般最好的其实进程数是每个 SOC CPU 3 个进

程。当你增加进程时候,你将达到服务器资源最大点,你将不能获得更多的性能,直到你添

加更多的 SOC 机器到你的系统中。

Page 15: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

15

第三节 创建地图缓存

ArcGIS 提供了多种方法创建缓存地图服务。ArcCatalog,ArcToolbox,地理处理工具,脚

本命令行地理处理工具,或则 ArcEngine API 都可以创建和管理缓存。ArcCatalog 提供简单

的方法结合地图服务和缓存。

ArcCatalog 提供了创建、更新和删除缓存的方法。创建缓存以前,需要先发布地图服务。

如何发布地图服务,在这里不做详细介绍,可以参考 ArcGIS Server 帮助文档。

3.3.1 创建缓存

在 ArcGIS Server 的服务,通过鼠标右键,选择“Server Properties”选项,出来地

图服务属性对话框。

Cacheing 标签 Server Cache Directory:,选择一个创建缓存目录的路径,默认情况

下 保 存 在 ArcGIS Server 安 装 Post Installation 时 候 的 默 认 目 录 , 如

driver:\arcgisserver\arcgiscache。也可以更改缓存目录,但是需要先在服务器连接属

性中添加该虚拟目录。如下图:

图上为 ArcGIS Server 服务的属性对话框

Page 16: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

16

上图为 ArcGIS Server 服务器连接属性对话框,可以添加一个 Cache 目录

选择 Generate,根据第二部分的参数介绍,为缓存输入相应的参数。”OK”就自动生

成缓存

3.3.2 更新缓存

在服务属性对话框中,通过 “update”可以更新缓存。更新缓存的目的在于建新的级别

的缓存,或对已有的部分更新了数据的地图更新缓存图块。通过”Update Extent”可以设定更

新的区域,在 Scale 中可以选择要创建缓存的比例尺,”Updata Mode”可以设置更新的方式,

一种是“Recreate Empty Tiles”,这种只对已创建的缓存空白部分,创建缓存,另外一种方

式是”Recreate All Tiles”,将创建所有的图块。如下图:

Page 17: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

17

上图是更新缓存设置

3.3.3 删除缓存

对已创建好的缓存进行删除。

3.3.4 使用已有缓存

ArcGIS Server 支持对建好的缓存进行复制拷贝共享。或则通过多台服务器对相同配置服

务的同时建立缓存,以缩短建立缓存的时间。

第四节 使用地图缓存

3.4.1 使用地图缓存

当你完成了地图缓存,地图服务自动启动,可以马上使用缓存。任意的 ArcGIS 应用都可

以使用缓存显示地图服务,不同的只是在用用中图块如何获取和使用。

(1) Web ADF 应用

在连接 GIS 服务以后,Web ADF 应用从虚拟缓存目录中直接获取图块。如果虚拟缓存目录

Page 18: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

18

不可用,应用仍然可以从文件系统的缓存目录下获取图块。如果以上两种方法仍然无法让应

用获取到图块,它将向地图服务请求,动态产生图块,但是缓存的性能目的就失去了。

使用”Multi-layer”选项建立的缓存只能在.NET Web ADF 中使用。使用 multi-layer 缓存,服

务器为每一层获取图块,并混合为一个图片,在图片上绘制标注,并把图片返回给客户端。

如果多层缓存包含了许多图层,这个处理过程性能将大大降低,缓存的优势也就失去了。

如果你使用 Java Web ADF,或则在.NET Web ADF 中执行多层缓存效果不满意,你可以通过

叠加两个或更多的“融合缓存”来达到和 multi-layer 缓存一样的视觉效果。可以按照一下步

骤来做:

1.把参加 multi-layer 缓存的每个图层放置到单独的地图文档中。确保地图文档的全图范围

一样。

2.发布地图文档作为一个地图服务

3.为每个地图服务创建一个融合缓存。在做以前,先阅读 4.2 部分,如何叠加地图缓存。

4.按照图层顺序和透明度添加服务到你的地图中。你的地图使用者将可以打开或关闭服

务。

客户端如何访问缓存块

ArcGIS Desktop 和 ArcGIS Server Web ADF 应用连接缓存地图服务和连接动态地图服务一

样。但是这些客户端如何访问缓存块确有很大的不同。

本地连接

桌面应用

ArcGIS 桌面客户端通过本地连接访问缓存地图服务,并通过 MapServer 从缓存目录获取图

块。第一次请求访问缓存地图服务查询地图服务是否存在缓存,并返回缓存块的 schema 给

客户端(下图褐色线部分)。接下来直接和 MapServer 一起取符合要求的图块(下图紫色线)。

Page 19: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

19

如果某个地图比例尺的请求刚好和缓存中的某个地图比例尺刚好符合,map service 将直接

从缓存中返回块。但是大多数的请求都是落在所生成的缓存的某两个比例尺之间。这种情况

下,MapServer 将从比所请求的比例尺大的最近的一个比例尺级别取缓存块,然后在把它返

回给客户端之前,对块进行下采样。这个处理过程比直接动态生成地图要快很多。如果

MapServer 不能访问缓存目录(因为网络损耗或访问权限不足),MapServer 将动态产生地图

块来满足客户端的请求(上图的红线部分)。如果请求的是 multi-layer caches,MapServer

将在缓存返回给客户端之前先进行融合。

Web ADF 应用

ArcGIS Web ADF 应用通过本地连接访问缓存地图服务,先进行初始化连接 MapServer 来确

定是否存在 cache,并获取虚拟缓存目录和 tiling schema(下图的橘黄色线)。第二次请求

就直接访问虚拟缓存目录(下图橘黄色线)。ADF 应用对于 multi-layer caches 的访问就不

太相同。MapServer 从多个图层获取许多的块(一个客户端可能请求的一个地区会覆盖许多

的块),并把这些块组合成图层,并应用标注和透明度,然后在剪裁之前融合这些图层,然

后返回给客户端。如果 multi-layer cache 比较复杂(许多图层),这个过程将费许多时间,

就失去了缓存的意义了。

Page 20: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

20

如果虚拟缓存目录服务访问(因为网络的损耗或访问权限不足),一些客户端将直接访问

MapServer 从缓存目录去获取块(上图红色线)。这个过程比直接从虚拟缓存目录去取来的

慢。如果缓存目录也无法访问,一些客户端将访问 MapServer 去动态的产生地图(上图的紫

色线)。这将是最低的效率。

Internet 连接

Desktop 和 Web ADF 应用

ArcGIS 的应用如果通过 Internet 连接来访问 Cache 地图服务,将需要通过多种方式从缓存

中提取地图块。第一次向缓存地图服务发送的请求总是确定是否存在缓存,如果存在将获取

虚拟缓存目录和缓存 tiling shema 的 URL(下图中暗绿色和青色线)。如果虚拟缓存目录可

以访问,接下来第二次块请求将直接为 Web Server 处理(下图的黄线)。对于 multi-layer

caches 的缓存地图服务块将为 MapServer 所组合,并传递给请求客户端—Web ADF 或

Desktop。

Page 21: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

21

如果虚拟缓存目录不能访问,Desktop 和 Web ADF 应用将尝试用 MaService TileHandler(上

图中的紫色线)来获取块。这也是最终块接受请求,并尝试从文件系统的缓存目录中获取块。

对于这个工作,Web Server 用户帐户必须要有读取缓存目录的权力。如果 TileHandler 不

能访问缓存目录,或则因为某些原因TileHandler访问失败,一些应用将尝试通过MapServer

从缓存目录中获取块(上图的红线)。如果这也失败了,一些应用会请求 MapServer 去动态

生成地图快(上图黑线)。

(2) ArcMap

当连接到 GIS 服务器确定服务是否存在缓存,ArcMap 从服务器文件系统的缓存目录去获

取图块。当图块刚好符合缓存中的地图比例尺,地图服务直接返回图块。通常情况下不会刚

好符合,ArcMap 会发请求从下一个接近的比例尺级别中取,并放样到当前比例尺级别。这

个放样过程还是比动态生成图块速度快。

(3) ArcGlobe 和 ArcGIS Explorer

略。。

Page 22: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

22

(4) 通过 API 调用缓存

参考一下下面的一段代码,是使用 API 的方式去调用 ArcGIS Server 生成的缓存。

IMapServer MapServer = (IMapServer)m_SOH.ServerObject;

ITiledMapServer TiledMapServer =

(ITiledMapServer)m_SOH.ServerObject;

string MapName = MapServer.DefaultMapName;

//if the map is not a cached map, do nothing

if (!TiledMapServer.HasSingleFusedMapCache(MapName)) return

false ;

IMapServerInit2 MapServerInit2 =

(IMapServerInit2)m_SOH.ServerObject;

string PhysicalCacheDirectory =

MapServerInit2.PhysicalCacheDirectory;

ITileCacheInfo TileCacheInfo =

TiledMapServer.GetTileCacheInfo( MapName );

ILODInfos LODInfos = TileCacheInfo.LODInfos;

ILODInfo LODInfo = TileCacheInfo.LODInfos.get_Element(0);

ILODInfo LODInfoHigh;

Page 23: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

23

for (int nIndex = 1; nIndex < LODInfos.Count; nIndex++)

{

LODInfoHigh = TileCacheInfo.LODInfos.get_Element(nIndex);

if(ClientResolution>(LODInfo.Resolution+LODInfoHigh.Resolution)/2){

break;

}

LODInfo = LODInfoHigh;

}

//The Origin of the tiling scheme is the Upper Left corner of

the map, nRow and nCol start from 0.

int nStartRow = (int)((TileCacheInfo.Origin.Y - MapExtentTop)

/ LODInfo.Resolution / TileCacheInfo.TileRows);

int nEndRow = (int)((TileCacheInfo.Origin.Y -

MapExtentBottom) / LODInfo.Resolution / TileCacheInfo.TileRows);

int nStartCol = (int)((MapExtentLeft -

TileCacheInfo.Origin.X) / LODInfo.Resolution / TileCacheInfo.TileCols );

int nEndCol = (int)((MapExentRight - TileCacheInfo.Origin.X)

/ LODInfo.Resolution / TileCacheInfo.TileCols);

//注释:上面这段是计算某一缓存比例级别的起始 ROW 和 Column 和结束的 ROW 和

Column 的计算方法,如图:

Page 24: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

24

其中 TileCacheInfo.Origin.Y 表示缓存块起始的 Y坐标,可以参考 AGS 生成缓存的 conf.xml

中标签<TileOrign>中的值。

MapExtentTop 表示地图框范围的顶部 Y 值,通过 ArcMap 可以查询到这个值。

LODInfo.Resolution:表示 conf.xml 中的 Resolution 值,表示 Map Units per pixel,每个像

元的地图单位。

TileCacheInfo.TileRows:表示 conf.xml 中的 TileRows 值,即生成的图片大小,如 512x512

的,该值就为 512。

计算出来的结果为十进制,换算成十六进制即得出起始的Rxxxxxxxx名和图片的Cxxxxxxxx

名。

通过下面的方法就可以取图片,进行拼接。

string strPrePath =

PhysicalCacheDirectory+"Layers\\_alllayers\\";

IMapServerObjects MapServerObject = (IMapServerObjects)m_SOH.

ServerObject;

Page 25: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

25

IMap Map = MapServerObject.get_Map(MapName);

double EachTileWidth = LODInfo.Resolution *

TileCacheInfo.TileRows;

double EachTileHeight = LODInfo.Resolution *

TileCacheInfo.TileCols;

Envelope EachTileEnvelope =new Envelope();

Boolean bFlag = false;

for( int nRow = nStartRow; nRow<= nEndRow; nRow++ )

{

for(int nCol = nStartCol; nCol <= nEndCol; nCol++)

{

string sFilePath = strPrePath +

GenerateLevelName(LODInfo.LevelID) + "\\" + GenerateRowName(nRow) + "\\";

//string sFileName =

GenerateFilePathAndName(strPrePath, LODInfo.LevelID, nRow, nCol);

//注释:根据 sFilePath 找到\\_alllayers 下的图层,并根据获取的比例尺 LevelID,找到相应

目录下的 Row 名称,并取得相应文件名的 column 图片。

if (!IsTileFileExisted( sFilePath +

GenerateImageFileName(nCol)))

{

double XMin = TileCacheInfo.Origin.X + nCol *

EachTileWidth;

Page 26: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

26

double XMax = XMin + EachTileWidth;

double YMax = TileCacheInfo.Origin.Y - nRow *

EachTileHeight;

double YMin = YMax - EachTileHeight;

EachTileEnvelope.PutCoords(XMin, YMin, XMax,

YMax);

OutputImageFile(Map, TileCacheInfo,

(IEnvelope)EachTileEnvelope, sFilePath, GenerateImageFileName(nCol));

bFlag = true;

}

}

}

return bFlag;

3.4.2 叠加地图缓存

当设计地图缓存为其他地图缓存叠加时候,有一些重要的缓存设计因素需要考虑,这要根

据不同的使用缓存的应用来确定。

(1)、在 Web 应用中重叠地图缓存

Web ADF 叠加缓存需要考虑一些规则,而且依.NET 或 Java 而不同。下面看一下.NET Web

ADF 的规则。

为使用叠加全部功能,必须使用 ArcGIS Server 9.2,SP2 以上的版本。下面是需要注意的项

目:

1.地图坐标系统

如果你缓存地图的坐标系统相同,将获得最块的性能。如果使用不同坐标系统,只有第一

个地图资源的缓存被使用,Server 会为其他的地图服务动态产生动态图片,因此就散失了其

它缓存的性能了。

2.块起点和块大小

当使用.NET Web ADF 重叠地图缓存,缓存必须要有同样的块起点和块大小

Page 27: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

27

3.比例尺级别

只有当两个缓存比例尺相同时候,你才能够获取两个缓存的最佳性能。如果某一级别存在

缝隙(当某一比例尺存在一个缓存,但不存在另外一个缓存中),重叠影像无法获取,只能

动态产生,因此降低性能。图片质量也随之降低,因为动态图片必须从已有比例尺级别中重

放样。

动态图片不能为最开始或最后级别比例尺的缓存创建。如下图,缓存 A,动态图片将不能

够在级别 5 中创建,因此缓存 A 将在比例尺 5 中无法看见;只有缓存 B 的图像才能够显示。

相似的,在比例尺 1 中,缓存 A 能看见。

4、图片格式

当选择了缓存图片格式,注意以下及点:

尽管 JPG 图片格式显示起来最快,但是它不支持透明。因此,只有当你只用来做

底层图层的数据,才使用 JPG 图片格式。

PNG-24 缓存在 IE6 中不能显示透明。如果你使用 PNG-24 放在其他缓存之上,.NET

Web ADF 自动转化 PNG 24 成 PNG 8,这样将降低性能。最快的解决方法是创建叠

加的缓存为 PNG 8 格式。

5.设置 Web 应用的首要地图资源

.net Web ADF 包含许多的地图服务,第一个地图资源确定支持什么样的坐标系统和地图缩

放的级别。当你在 Manager 中创建 Web 应用时候,需要设置“Use coordinate system and extent

of:”,你这里所选择的服务成为首要地图资源。如果你使用 visual studio,那么首要地图资源

是 Map control 的属性。按照下面方法来设置首要地图资源:

Page 28: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

28

如果你叠加多个相同坐标系统,块起点和块大小,DPI 的缓存服务,选择任意的缓

存服务作为首要地图资源。

如果你叠加多个不同坐标系统,块起点和块大小,DPI 的缓存服务,选择你在地图

上要使用的坐标系统,块起点,块大小和 DPI 的服务作为首要地图资源。缩放控

制将只包含这个服务的比例级别。

如果你叠加一个未缓存的服务到已缓存服务上,你应该选择缓存的服务作为首要地

图资源。除非是你想在地图上使用未缓存的服务的坐标系统,并愿意牺牲缓存的性

能。

(2)、在 ArcMap 中重叠地图缓存

略 。 。 。 ( 参 考

http://webhelp.esri.com/arcgisserver/9.2/dotNet/index.htm#manager/administration/create_svr_dir

_mgr.htm)

Page 29: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

29

第四章 使用 Flexview

我们已经创建好了 ArcIMS 和 ArcGIS Server 的 Cache,我们已经有了 Google 的地图和影

像服务。接下来,我们就可以把这些地图服务使用起来,通过地图浏览器来结合这些地图服

务。下面我们来看如何简单快速配置地图服务,和使用在线缓存服务。

使用 Flexview 分为两个内容:

第一节 MapService 地图服务

MapService 文件夹下包含了一系列的配置文件和 MapView 目录文件。Web.Config 是服务配

置信息,MapView 文件夹包括了 Mapview 浏览器和配置文件。

可以按照下面的方法来建立 MapService 的地图服务:

( 1 )、拷贝 MapService 文件夹到 Web 服务器的目录下,如 IIS 服务器为:

Driver:\\Inetpub\wwwroot

(2)、在 IIS 管理器中创建 MapService 的虚拟服务,如下图:

Page 30: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

30

图:mapservice 虚拟服务

(3)、配置 web.config 文件

Server 标签:设置 ArcIMS 服务器名或 IP 地址(注:需要设置)

<?xml version="1.0"?>

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

<appSettings>

<!--ArcIMS Server 名称 如与 ArcIMS 部署在同一服务器请使用 localhost 或 127.0.0.1 -->

<add key="Server" value="lxl"/>

<!--服务端口-->

<add key="Port" value="5300"/>

<!--服务名称-->

<add key="Service" value="test"/>

<!--图像大小-->

<add key="TileSize" value="256"/>

<!--图片类型-->

<add key="ImageType" value="png24"/>

<!--背景透明-->

<add key="UseTrans" value="False"/>

<!--背景色-->

<add key="BackColor" value="255,255,255"/>

<!--缓存名称-->

<add key="CacheName" value="IMG"/>

<!--投影类型 0 墨卡托 , 1 WGS84 ,2 其他任意类型-->

<add key="ProjectType" value="0"/>

<!--缓存物理路径-->

<add key="CacheFolder" value="d:\ArcIMS\website\test\img\"/>

Page 31: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

31

Port 标签:设置 ArcIMS 服务器端口,默认为 5300

Service 标签:设置建立缓存的地图服务名

Tilesize 标签:设置缓存图片的大小

Image Type 标签:设置缓存图片的格式

CacheName 标签:设置生成缓存目录的文件名,默认为 IMG

ProjectType 标签:设置投影类型

CacheFolder 标签:设置缓存路径(注:需要设置)

第二节 Mapview 地图浏览

Mapview 提供了地图服务浏览的窗口。在 Mapview 浏览器中,集合了 Google 地图,Google

Map,Google Satellite,Google Hybrid,ArcIMS Map Service,ArcGIS Server Service 几种地图服

务。

Google 地图:Google 中国的本地地图服务

Google Map: Google 国外的地图服务

Google Satellite: Google 影像地图服务

Google Hybrid:Google 影像和矢量(主要是道路)叠加地图服务

Page 32: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

32

ArcIMS Map Service:ArcIMS 地图服务

ArcGIS Server Service: ArcGIS Server 地图服务

使用 Mapview 地图浏览之前,需要先配置 Mapview 的配置文件。打开 Mapview 文件夹下的

Config.xml 文件,如下:

其中 IMS_URL 标签表示 ArcIMS 地图缓存所在的路径,AGS_URL 表示 ArcGIS Server 缓存

所在的路径。

4.2.1 ArcIMS 缓存设置

IMS_URL 的值确定 Mapview 所要访问的 ArcIMS 服务所生成的缓存的路径。下面举个例

子,如果 ArcIMS 缓存路径保存在 D:\IMG 文件目录下,Web 服务器用的 IIS,那么可以按照

下面的步骤来设置 IMS_URL 值:

(1)、在 IIS 管理器中新建一个虚拟目录,取名为 IMG,把路径指向到 ArcIMS 缓存所在

的目录 D:\IMG

(2)、修改 IMS_URL 的 Value 值为:<IMS_URL value = http://localhost/img/”/>

4.2.2 ArcGIS Server 缓存设置

AGS_URL 的值确定了 Mapview 所要访问的 ArcGIS Server 服务所生成的缓存的路径。下

面举个例子,如果 ArcGIS Server 缓存路径保存在安装配置 ArcGIS Server 时候默认缓存的目

录 driver:\arcgis server\arcgis cache 目录下,由于在 IIS 管理器中已经配置好了 arcgis cache 的

<?xml version="1.0" encoding="utf-8" ?>

<params>

<map>

<GGLSat_V value="22" />

<GGLMap_V value="w2.99" />

<IMS_URL value="http://Localhost/website/test/img/" />

<AGS_URL value="http://Localhost/arcgiscache/webdemo/Layers/_alllayers/" />

<Base_URL value="http://Localhost/Mapservice/MakeURL.ashx?url=" />

</map>

</params>

Page 33: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

33

虚 拟 目 录 , 因 此 只 需 要 修 改 IMS_URL 的 标 签 值 即 可 : <AGS_URL value =

http://localhost/arcgiscache/服务名/Layers/_allayers/”/>

如果 ArcGIS Server 的缓存保存在其它的路径,那么先需要在 IIS 管理器中,按照

ArcGISCache 的方式建立一个虚拟目录,并指向缓存所在的路径即可,Value 值的 arcgiscache

值改成所建立的虚拟目录的名称。

Page 34: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

34

第五章 OpenLayers

第一节 Open Layers 简介

Openlayers 初始是由 MetaCarta 实验室开发,其旨在可以让使用者从不同的数据源提取数

据并使之显示在 WebGIS 上。Openlayers 是一款完全免费的,开源的 JavaScript 类库。

OpenLayers 实现访问地理空间数据的方法都符合行业标准,完全支持 W3C。如 WMS(Web

Mapping Service)和 WFS(Web Feature Service)规范等。

Openlayers 如同其它开源软件一样,随着项目创建以来几经磨难,多次处于停滞状态,多

亏了开发者的努力。Openlayers 项目受到 OSGeo(开源地理空间基金会)资助。资深 Js 高

手的加入。使得其成为现在 OpenGIS 领域最强大的 GIS 前端显示组件之一,被广泛用于开

源 GIS 的服务产品上,又由于其代码编写极其优雅,逻辑严谨,受到大量的 Js 开发者的追

捧。

5.1.1 Open Layers 的安装

openlayers 现在最新版为 2.5 版,在 http://www.openlayers.org/可以下载到其最新的版本。

下载的 openlayers 包里含有开发者 doc,openlayers 的 sample,压缩后的独立 js 文件,以及

未压缩的 openlayers 的全部源码。

把 openlayers 引入到你的项目,只需要引用 Openlayers 这个 js 文件即可(注意:如果要

把 Js 包放入到你的工程一定不要忘记把 theme 目录也拷贝到目标地址,因为 Openlayers 在

运行中需要调用相关样式表,如果没有的话会导致一些功能无法正常使用 或者按钮无法显

示的后果。

5.1.2 一个简单的地图页面例子

以下是一个简单的 Openlayers 开发的地图页面

Page 35: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

35

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <style type="text/css"> #map { width: 90%; height: 95%; border: 1px solid black; } </style> </head> <title>test</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="./lib/OpenLayers.js"></script> <script type="text/javascript"> var map, layer; function init(){ map = new OpenLayers.Map( 'map' , //创建一个地图 map,参数为现实地图的 div 名字 {maxExtent: new OpenLayers.Bounds(-180, -90, 180, 90)} ); //定义了地图的最大边界(全球) layer = new OpenLayers.Layer.WMS( "OpenLayers WMS", //创建一个图层 layer,其显示名称"OpenLayers WMS" "http://labs.metacarta.com/wms/vmap0", //wms 服务器 url {layers: 'basic'}); //wms 图层 map.addLayer(layer); //把图层添加入地图 map.zoomToMaxExtent(); //初始化地图为最大边界 } </script> <body onload="init()"> <div id="map"></div> //嵌入地图的 div </body> </html> 下图是上面例子的实际显示效果:

Page 36: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

36

第二节 实现 Google 和 AGS 的地图整合

5.2.1 获取 googleMap 地图

众所周知使用 google api 调用 GoogleMap 服务有许多限制,诸如当天的访问量以及跨域问

题,通过对 openlayers 的修改实现直接连接 Googlemap 地图服务的目标。以深圳地图为例其

开发如下:

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <style type="text/css"> #map { width: 90%; height: 80%; border: 1px solid gray; } </style> <script src="./lib/OpenLayers.js"></script> <script type="text/javascript"> var map; function init(){ var options = {

Page 37: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

37

projection: "EPSG:900913", //投影为 900913,google 墨卡托投影 units: "m", //屏幕坐标以米为单位 maxResolution: 156543.0339, //最大比例下的每像素屏幕地图单位值 maxExtent: new OpenLayers.Bounds(-20037508, -20037508,20037508, 20037508.34), numZoomLevels: 17, //强制设置其放大级数 controls: [new OpenLayers.Control.MouseDefaults()] //复写 control }; var map = new OpenLayers.Map('map', options); //把地图属性捆绑入地图 var googletms = new OpenLayers.Layer.GMS("googletms", "http://servicetile.mapabc.com/googlechina/maptile?", "googleditu" ); //设置 google 中国地图属性 map.addLayer(googletms); //把其作为一个图层添加到地图 map.addControl(new OpenLayers.Control.PanZoomBar()); //向地图中添加控制条 map.addControl(new OpenLayers.Control.MousePosition()); //向地图中添加坐标显示 map.setCenter( new OpenLayers.LonLat(12714171.61165,2593148.74233), 10); //地图居中的 xy 坐标 以及放大比例,注意坐标为米 } </script> </head> <body onload="init()"> <h1 id="title">OpenLayers GTMS ~~</h1> <div id="tags"> </div> <p id="shortdesc"> GTMS~~ </p> <div id="map"></div>

Page 38: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

38

</body> </html> 实现效果如下:

变更地图属性 把 new OpenLayers.Layer.GMS("googletms", "http://servicetile.mapabc.com/googlechina/maptile?", "googleditu" ); 这句话改为 new OpenLayers.Layer.GMS("googleStms","http://kh.google.com/", "googleSta" ); 就可以调用 google 影像图了 ,实现效果如下:

Page 39: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

39

5.2.2 整合 Google Map 和 Arcgis Server 地图

至此 googlemap 的调用已经没有问题了,我们准备开始叠加 ArcgisServer(AGS)的地图

服务,一般来说我们可以通过两种方式叠加 AGS 的地图,一种通过 wms 方式一种通过直接

调用 mapcache 的方式。这两种方式各有优缺点。其中调用 wms 的话其可以动态显示地图的

变化,实时性较高但是地图显示速度慢。直接调用 mapcache 的话,其不但地图显示速度快,

而且地图线形美观,但是无法表示动态性信息,无法适用于实时性较高的应用。

一、 基于 AGS wms 的整合

现在出现一个奇怪的现象,无论你的 mxd 地图投影是什么,地图单位是什么,发布成 wms

后,在 wms 里都是单位为度,墨卡托投影无效被显示为 wgs84。并且无法在 wms 中使用墨

卡托坐标,可是相对于 google 地图我们可以看出其单位为米,所以我们需要把墨卡托坐标

转化成 wgs84 坐标后再调用 wms 这样才能实现 wms 与 googlemap 的叠加。

坐标的转换 //把墨卡托坐标的 bounds 转换成经纬度

if (bounds!= null) {

var sw =OpenLayers.Layer.SphericalMercator.inverseMercator

(bounds.left,bounds.bottom);

Page 40: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

40

//获得现在范围的左下角的点坐标(墨卡托坐标)专为点坐标(wgs84) var ne = OpenLayers.Layer.SphericalMercator.inverseMercator

(bounds.right,bounds.top);

//右上角坐标的转换 bounds = new OpenLayers.Bounds(sw.lon, sw.lat1,ne.lon, ne.lat);

//用 wgs84 坐标的两个点确立一个 84 坐标的新范围 }

var imageSize = this.getImageSize();

return this.getFullRequestString(

{BBOX: this.encodeBBOX ? bounds.toBBOX()

: bounds.toArray(),

WIDTH:imageSize.w,

HEIGHT:imageSize.h});

//新的范围就是 wms 的 bbox。 这样我们就可以调用 AGS 的 wms 了 其实现效果如下:(与 google 卫星图叠加)

二、 与 AGS mapcache 的叠加

与 wms 叠加 因为 wms 是通过 url 调用图片的 也就是说我可以任意的变更图片范围以及

图片的比例,相对而言 googlemap 的图片是死的 因为其是预先生成的,我们无法对预先生

成的图片进行比例操作。而 wms 的图片是活的 他可以根据 bbox 范围以及图片的大小实时

生成,所以 wgs84 坐标系的 wms 可以生成适合墨卡托投影的图片。

Page 41: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

41

而用 mapcahe 则不同,mapcache 也是预先生成的 相对来说也是死的,所以我们需要

mapcache 的与 google 的每级的 resolution 相同,并且 TileOrigin 也相同,这样才能实现叠加

的准确。

创建 mxd 生成 cache,以世界地图为例。注意其边界设置如下图 投影为 World_Mercator:

否则两极将出现多余的部分。

完成后创建 cache 在 init 中增加 mapcache 的图层声明,代码如下:

var world= new OpenLayers.Layer.AGS

( "AGS_world","http://localhost/arcgiscache/worldmm/layers",

{'transparent':true},{'reproject': true,getURL:AGScache});

world.setVisibility(false);

map.addLayer(world);

// transparent 为透明图层,'reproject': true,与墨卡托投影进行匹配 // getURL:AGScache 重写的调用 ags cache 接口

这个利用 ags 包直接调用生成的 mapcache 图片叠加 google map 地图,其显示结果如下:

Page 42: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

42

三、 整合后的扩展

完成了图层的叠加,现在我们想查询地图的信息,而 wms 对于信息的查询支持极少,仅

有的 GetFeatureInfo 不仅无法范围查询,而且即使查询单个要素信息因为没有容差的定义也

很难准确的查出 点线图层的属性信息。 而 wfs 又不能很好的保证数据的安全性。

而且仅仅是单纯的调用 ags的wms以及 ags cache 我们将浪费 AGS的强大空间处理能力,

所以将通过基于 ao api 的 webservice 实现地图信息的查询,甚至在未来实现地图要素的编

辑,NAserver 和 GPserver 的调用。

开发一个简单的 webservice 实现了两个基本功能,一个是 QueryFromPolygon,通过一个

范围框查询地图的要素信息。另一个是 QueryFromTxt,通过属性信息查询地图要素,在这

里返回的是地图要素的范围坐标。

其 wsdl 节选如下:

<s:element name="QueryFromPolygon">

<s:complexType>

<s:sequence>

<s:element minOccurs="1" maxOccurs="1" name="minX" type="s:double" />

<s:element minOccurs="1" maxOccurs="1" name="minY" type="s:double" />

<s:element minOccurs="1" maxOccurs="1" name="maxX" type="s:double" />

<s:element minOccurs="1" maxOccurs="1" name="maxY" type="s:double" />

<s:element minOccurs="1" maxOccurs="1" name="layerid" type="s:short" />

Page 43: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

43

<s:element minOccurs="0" maxOccurs="1" name="serviceName" type="s:string" />

</s:sequence>

</s:complexType>

</s:element>

<s:element name="QueryFromTxt">

<s:complexType>

<s:sequence>

<s:element minOccurs="0" maxOccurs="1" name="Querystring" type="s:string" />

<s:element minOccurs="1" maxOccurs="1" name="layerid" type="s:short" />

<s:element minOccurs="0" maxOccurs="1" name="serviceName" type="s:string" />

</s:sequence>

</s:complexType>

</s:element>

webservice 开发完成后我们准备利用 xmlhttp 来实现 javascript 与 webservice 的信息交互

修改现在的 javascript:

增加 xmlhttp 的声明

//建立 xmlhttp

var ajaxObj = new function(){

var obj = false;

if(window.XMLHttpRequest){// Mozila,FireFox,IE7 浏览器

try{

obj = new XMLHttpRequest();

}catch(e1){}

}

else if(window.ActiveXObject){ // IE

try{

obj = new ActiveXObject("MSXML2.XMLHTTP"); //新版本

}catch(e2){

try{

obj = new ActiveXObject("Microsoft.XMLHTTP");//老版本

}catch(e3){ }

}

}else {

}

return obj;

}

if(!ajaxObj){

alert("您的浏览器太老了");

window.close();

}

创建好 ajaxObj ,如果是 QueryFromPolygon 的话我们需要获得地图上的框选范围,通过

Page 44: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

44

openlayers 很简单的就能实现这个功能

// 构建一个 Control 方法

var control = new OpenLayers.Control();

OpenLayers.Util.extend(control, {

draw: function () {

// 当触发 shift+鼠标左键 进行框选

this.box = new OpenLayers.Handler.Box( control,

{"done": this.notice},

// 框选范围放入 notice 中处理

{keyMask: OpenLayers.Handler.MOD_SHIFT});

this.box.activate();

},

notice: function (bounds) {

//获得的是地图像素范围 进行 pix 坐标转换

//原始的像素坐标

var swPix = new OpenLayers.Geometry.Point(bounds.left,bounds.bottom);

//alert("左下方的像素点"+swPix)//左下方的点

var sw = map.getLonLatFromPixel(swPix);

//alert("左下方的墨卡托"+sw);

var sw84 = OpenLayers.Layer.SphericalMercator.inverseMercator

(sw.lon,sw.lat);

//alert("左下方的 84 坐标系"+sw84);

var nePix=new OpenLayers.Geometry.Point(bounds.right,bounds.top);

var ne = map.getLonLatFromPixel(nePix);

var ne84= OpenLayers.Layer.SphericalMercator.inverseMercator

(ne.lon,ne.lat);

//alert("右上方的 84 坐标系"+ne84);

var qstring="QueryFromPolygon?minX="+sw84.lon+"&

minY="+sw84.lat+"&maxX="+ne84.lon+"&maxY="+ne84.lat+"&layer

id="+0+"&serviceName="+"world84"

ajaxWS(qstring,"QueryFromPolygon");

//送入 ajaxws 处理发送

}

}

);

map.addControl(control); //在地图上加载此控制方法

function ajaxWS(qstring,mtype){

//发送请求

ajaxObj.onreadystatechange = function(){

if(ajaxObj.readyState == 4){

//alert(mtype); 请求的方式 现在有两种 框选及属性信息查询

var result = ajaxObj.responseText;

//返回的结果

Page 45: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

45

if (mtype=="QueryFromTxt"){

ResultToExtent(result);

//返如果是根据属性信息查询 则要把返回的范围信息进行处理 地

//图范围进行重定位

}else{

document.getElementById("resultDiv").innerHTML =

result;

//框选结果则直接显示

}

ajaxObj.abort();

}

}

var url = "http://localhost/wstest/service.asmx/"+qstring ;

var data = "";

ajaxObj.open("GET",url,true);

//使用 get 不用拼 xml 了

ajaxObj.setRequestHeader("Content-Type","text/xml;

charset=utf-8");

ajaxObj.setRequestHeader("Content-Length","10240");

ajaxObj.send(data);

}

function ResultToExtent(result) //定位到新的 bbox

{

//alert("resultexent"+result)

//************************去壳 去掉 xml 壳

var Dxs= result.indexOf('/">');

var Dxe= result.indexOf('</');

result=result.substring(Dxs+3,Dxe);

alert("result||"+result);

//***************************************

if (result=="什么都没有找到"){

alert(result);

}else{

var theReply=result;

rm = new Array;

//拆出返回值

for (var i=0;i<4;i++){

spoilE= theReply.indexOf("||");

if (spoilE>0){

rm[i]=parseFloat(theReply.substring(0,spoilE));

theReply=theReply.substring(spoilE+2);

}else{

Page 46: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

46

rm[i]=parseFloat(theReply);

}

//alert(rm[i]);

}

//wgs84 度坐标转换为 墨卡托 米坐标

var nsw = OpenLayers.Layer.SphericalMercator.forwardMercator

(rm[0],rm[1]);

var nne = OpenLayers.Layer.SphericalMercator.forwardMercator

(rm[2],rm[3]);

alert(nne);

//根据处理的点确定新的地图范围

var nBounds=new OpenLayers.Bounds

(nsw.lon,nsw.lat,nne.lon,nne.lat);

map.zoomToExtent(nBounds);

}

}

好的至此我们就可以实现 op+ao webservice 的简单应用了 ,可以看出因为整个数据查询

和显示都是以坐标为基础 也就是说显示可以使用一种地图服务 查询也可以使用一种地图

服务,相互互不干。

实现如下 拉框查询

根据信息查询如下

Page 47: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

47

返回的坐标 以及屏幕范围的重新定位

Page 48: 基于 ArcGIS 的空间数据集成 解决方案read.pudn.com/downloads149/doc/642994/ARCGIShelp.pdf么OpenLayers 又如何能够结合AGS 或Google Map 之类的资源呢? 带着这些问题,本篇从几个方面来加以阐述,首先是介绍ArcIMS

48