利用Bing Maps地图切片实现网络地图服务
王晓东, 刘慧平, 乔瑜
北京师范大学地理学与遥感科学学院,北京 100875

第一作者简介: 王晓东(1983-),男,博士研究生,主要从事统计遥感及GIS软件工程方面研究。

摘要

通过分析Bing Maps地图切片数据的编码方式及URL结构,介绍了获取Bing Maps地图切片数据的方法。并将获取的数据生成网络地图服务(Web Map Service,WMS),以供任何能够支持WMS服务的客户端加载。实现了以较小的成本而且方便快捷地获取地图和影像数据。

关键词: Bing Maps; 微软虚拟地球; 网络地图服务; 地图切片
中图分类号:P208 文献标志码:A 文章编号:1001-070X(2010)02-0122-06
The Utilization of Bing Maps Tiles Data to Implement Web Map Service
WANG Xiao-dong, LIU Hui-ping, QIAO Yu
College of Geography and Remote Sensing, Beijing Normal University, Beijing 100875, China
Abstract

Bing Maps can provide plentiful and free data resources. The convenient utilization of these resources is a problem of wide concern. In many applications, it would cost much money and plentiful human resources to develop software systems for managing the data, and the systems based on browser fail to support frequent user interaction and data inter-operation. Web service provides an effective way to inter-operate geographical information through platform and programming language. Based on analyzing the coding theory of Bing Maps tiles data and the structure of the URL, this paper has introduced a method for approaching Bing Maps tiles data, and then implemented Web Map Service (WMS) by using these data so that it can be loaded by any client which supports WMS. This method has achieved the goal of convenient acquirement of map data and image data with less cost.

Keyword: Bing Maps; Microsoft Virtual Earth; Web Map Service; Tiles
0 引言

遥感数据具有覆盖范围广、获取速度快、信息丰富等特点, 被广泛应用于各个研究领域, 对遥感图像的使用方式也多种多样。而对于导航等应用来说, 无需对遥感图像做过多的处理, 仅仅需要其作为底图数据来为研究提供参考或基准信息。但是, 获取调查区内各种分辨率的影像和基础数据需要支付较高费用, 有时甚至无法获得, 即使能够得到数据, 还需要对其进行复杂而严格的标准化处理。而且, 如何储存和管理这些数据也都是比较棘手的问题。

Bing Maps(Microsoft Virtual Earth的前身)是微软为对抗Google Earth而发布的一种联机地图服务。Bing Maps提供免费的遥感图像, 能覆盖中国大部分地区, 基本都是2002年以后拍摄的, 不少大城市已经更新到2008年以后, 分辨率在部分地区可达到0.6 m。Bing Maps每个月都会更新部分数据, 并与ESRI签署了数据共享协议, 使地图数据保持了很好的时效性。

Bing Maps提供了非常丰富而且免费的数据资源, 如何方便地使用这些资源是大家非常关注的问题。Bing Maps与Google Earth一样都提供了可以二次开发的API, 用户通过控件可以自由定制基于浏览器的应用系统, 可以在网页上使用服务商提供的数据服务, 基于这种模式的应用系统也很多。但问题同样存在, 开发软件系统需要比较长的周期, 而且, 基于浏览器的应用系统无法支持频繁的用户交互和数据互操作。

从信息共享的角度来看, 基于网络的地理信息分布式存储和计算是GIS发展的必然趋势。网络服务(Web Service)提供了跨平台、跨语言的互操作能力, 为地理信息互操作提供了有效的解决途径。网络地图服务(Web Map Service, WMS)是开放地理信息系统联盟(OGC)制定的网络服务模型中一个基于HTTP协议的地图服务, 在WMS 中地图被定义为地理数据的可视化表现, 通过一系列操作用户可以获得需要的地图数据。

本文讨论了利用Microsoft Bing Maps地图切片数据实现基于OGC标准的WMS服务的方法, 实现了以较小的成本而且方便快捷地获取地图和影像数据。

1 Bing Maps地图的切片原理

除了可供二次开发的API, 用户还可以通过Bing Maps提供的基于切片技术的静态地图服务[4]直接获取地图数据。为了提高请求的响应速度, Bing Maps将渲染好的地图数据预先生成数据金字塔, 分块存储在服务器中。用户可以通过一个统一格式的URL来获取指定位置和尺度的地图切片。

1.1 Bing Maps的URL格式

切片URL的格式为: http://{0}{1}.ortho.tiles.virtualearth.net/tiles/{0}{2}.{3}?g={4}, 参数{0}取值范围为{a, r, h}, 表示地图形式。Bing Maps提供卫星地图(a)、普通地图(r)和混合地图(h)3种地图数据; 参数{1}取值范围为{0, 1, 2, 3}, 代表4个Bing Maps的服务器, 用来平衡负载; 参数{2}表示地图切片的键值, 可以通过位置和需要显示的尺度计算得出; 参数{3}取值范围{png, jpeg, jpg}, 表示图片类型; 参数{4}是当前地图的版本, 一直在变化中。

1.2 地图切片键值的计算方法

Bing Maps地图切片数据采用金字塔结构组织存储。在第一层, 全球数据被分成2× 2个分块, 全球地图的大小为512 像素× 512像素。在下一个尺度, 每一分块又被分成4块, 因此, 每一层地图的大小为256× 2level像素× 256× 2level像素。

计算地图切片的键值, 首先需要将地理坐标换算为像素坐标。由于每一放大级别的地图大小都不同, 因此相同的地理坐标对应的像素坐标也不同。Bing Maps规定地图左上角坐标为(0, 0), 右下角坐标为(地图宽度-1, 地图高度-1)。这样, 如果给定了经纬度(WGS 84)和放大级别, 就可以计算出对应的像素坐标。即

pixelX=[(Longitude+180)/360]× 256× 2level (1)

pixelY={0.5-lg[1+sin(Latitude× PI/180)]/[1-sin(Latitude× PI/180)]}/(4* PI)× 256× 2level(2)

式中, (pixelX, pixelY)为目标点对应的像素坐标; Longitude为目标点的经度; Latitude为目标点的纬度; level为当前放大级别; PI为π 。

因此, 如果得到了像素坐标, 就可以计算出该像元所在的地图切片的行列号, 即

tileX=floor(pixelX/256)(3)

tileY=floor(pixelY/256)(4)

为了提高地图切片的索引和存储效率, Bing Maps为地图切片建立了四叉树索引, 用0、1、2、3分别表示切片的序号, 如图1所示[1]

图1 Bing Maps切片编码方式Fig.1 Bing Maps Tiled System

切片的二维坐标被合并为一个一维字符串, 即“ 键值” 。每一个键值都唯一确定了在某一尺度上的一个地图切片。将地图切片坐标转换为键值的方法为: 首先将地图切片坐标以二进制形式表示, 然后将XY的编码交叉, 交叉的结果再以四进制表示, 最后转换为字符串。例如, 分块属于第3层, 坐标为(3, 5), 键值的计算方式为:

tileX=3=0112(5)

tileY=5=1012(6)

Key=1001112=2134=“ 213” (7)

得到键值以后, 就可以根据URL的格式获取指定坐标位置的地图切片了。这一步骤将是实现WMS的数据基础。

2 网络地图服务

WMS是OGC制定的网络服务模型中一个基于HTTP协议的地图服务, 在WMS 中地图被定义为地理数据的可视化表现, 通过一系列操作用户可以获得需要的地图数据。按照OGC的定义, WMS分为Basic WMS和Queryable WMS两种方式。Basic WMS定义了用于创建和显示地图图像的两种操作: GetCapabilities和GetMap, 这两个操作都是必须实现的; Queryable WMS中补充了GetFeatureInfo, 该操作返回地图上某个特殊地理要素的属性信息, 这个操作不是必须实现的。

2.1 GetCapabilities

GetCapabilities请求用于查询WMS服务的元数据, 包括支持的服务、格式、空间坐标、地图列表及地图样式等。其主要目的是使客户端在使用GetMap请求前可以对WMS服务有一个基本的了解, 从而可以设置正确的参数。发送GetCapabilities请求以后, 服务器将返回一个XML文件, 包括Service、Capability等部分。

2.1.1 GetCapabilities请求

GetCapabilities通过URL向服务器发送请求, 请求的参数如表1所示。

表1 GetCapabilities参数说明 Tab.1 The parameters of GetCapabilities

以下是一个请求样例:

http://< host> /< SERVICE> ?VERSION=1.1.1& REQUEST=getcapabilities& service=WMS

2.1.2 GetCapabilities响应

GetCapabilities请求返回的是一个元数据的XML文档, 该文档是对服务信息内容和可接受请求参数的一种描述, 这些文档是根据Web地图服务规范所规定的格式编写的。元数据的第一部分是< service> 元素, 为服务器提供元数据概览, 其中必须包括Name、Title和Online Resource URL; 第二部分是< capability> 元素, 该元素定义了服务所支持的实际操作, 包括< Request> 、< Exception> 和< Layer> , 其中最关键部分是< Layer> , WMS服务器提供的地理信息都被组织成了“ Layer” 用来绘制, 一个地图服务必须至少包含一个< Layer> 元素。

2.2 GetMap

GetMap是WMS服务的核心内容, 服务器接收到GetMap请求以后, 按照URL的内容, 返回一幅包含空间参考信息的地图图片。

2.2.1 GetMap请求

GetMap的参数如表2所示。

表 2 GetMap参数说明 Tab.2 The parameters of GetMap

下面是一个请求样例:

http://< host> /< SERVICE> ?VERSION=1.1.1& REQUEST=Getmap& LAYERS=topp: states& STYLES=population& SRS=EPSG: 4326& BBOX=-125, 24, -67, 50& WIDTH=400& HEIGHT=200& FORMAT=image/png

2.2.2 GetMap响应

一个有效的GetMap请求响应应该是其请求的一幅地图图片。该地图图片满足要求的样式, 指定了地理参考系统、外包矩形、大小、格式和透明度。

3 利用Bing Maps数据实现网络地图服务

了解了Bing Maps地图切片和WMS的原理以后, 就可以生成Bing Maps-WMS服务, 其关键是在服务器端解析客户端的请求并返回正确的结果。

3.1 实现Bing Maps-WMS服务的方法

对于GetCapabilities, 返回的结果是一个固定格式的XML文档。因为GetCapabilities提供了服务的元数据信息, 为了使其他客户端程序都能够正确解析Bing Maps-WMS服务, XML文档必须按照OGC规范的要求包含所有必须的元素, 并保证参数正确, 元数据的格式在文献[2]中有明确的定义和说明, 在这里就不再赘述。

Bing Maps-WMS服务的核心是根据GetMap请求的参数返回地图图片。根据前面对Bing Maps切片原理的分析, 获得Bing Maps地图切片数据的关键就是确定当前的放大级别, 然后根据地理坐标计算在当前放大级别下地图切片的位置。GetMap请求中包含BBOX、WIDTH和HEIGHT 3个关键的参数, BBOX确定了显示数据的范围(地理坐标), WIDTH和HEIGHT限定了地图的大小(像素坐标)。通过这几个参数可以计算显示的尺度。用C#编写的核心代码如下:

double latRate=bbox[3]-bbox[1]/(MaxLatitude-MinLatitude);

double lonRate=bbox[2]-bbox[0]/(MaxLongitude-MinLongitude);

double rate=(lonRate> latRate)?lonRate: latRate;

double dis=(double)Math.Max(width, height);

double wholeDis=dis/rate;

int levelof Detail=(int)Math.Log(wholeDis/256, 2);

得到显示的尺度以后, 就可以计算在当前尺度下, BBOX范围内地图切片的位置。由于BBOX是矩形范围, 只需计算两个对角位置所在的地图切片序号。根据前面的分析, 首先需要将地理坐标换算为像素坐标, 用C#编写的核心代码如下:

double x=(longitude+180)/360;

double sinLatitude=Math.Sin(latitude* Math.PI/180);

double y=0.5-Math.Log((1+sinLatitude)/(1-sinLatitude))/(4 * Math.PI);

uint mapSize=(uint)256< < levelOfDetail;

int pixelX=(int)Clip(x* mapSize+0.5, 0, mapSize-1);

int pixelY=(int)Clip(y* mapSize+0.5, 0, mapSize-1);

得到像素坐标以后, 再将像素坐标换算为地图切片的坐标, 然后根据前面介绍的方法就可以计算出地图切片URL中所需要的键值了。由于Bing Maps地图切片数据都是256× 256的图片, 得到两个角点的地图切片坐标以后, 还需要将所有图片按正确的位置拼接起来, 形成一幅整个的地图。用C#编写的核心代码如下:

Bitmap bitmap=new Bitmap(imageWidth, imageHeight);

Graphics g=Graphics.FromImage(bitmap);

for(int i=minTileY; i< =maxTileY; i++)

{

for(int j=minTileX; j< =maxTileX; j++)

{

string keys=TileXYToQuadKey(j, i, levelofDetail);

string url=“ http://a1.ortho.tiles.virtualearth.net/tiles/a” +keys+“ .png?g=50” ;

WebRequest wr=WebRequest.Create(url);

WebResponse res=wr.GetResponse();

Image img=new Bitmap(res.GetResponseStream());

int pX=(j-minTileX) * mapSize;

int pY=(i-minTileY) * mapSize;

g.DrawImage(img, new Point(pX, pY));

}

}

通过前面介绍的步骤就可以获得GetMap请求中BBOX范围内的地图, 最后还要根据另外两个参数WIDTH和HEIGHT计算额外需要下载的地图切片, 最后组成由WIDTH和HEIGHT规定大小的图片。将拼接好的地图返回给客户端, 就完成了GetMap请求的响应过程。

3.2 Bing Maps-WMS的应用

Bing Maps-WMS服务是标准的WMS服务, 可以通过URL的方式发送请求, 以获得响应。GetCapabilities请求的URL示例如下:

http://localhost:8304/BMWMS/wms.ashx?SERVICE=WMS& REQUEST=GetCapabilities

服务器返回XML格式的元数据片段如图2所示, 该片段是元数据的< Service> 部分, 提供了元数据的概览。

图2 GetCapabilities响应(片段)Fig.2 The Response of GetCapabilities

GetMap请求的URL示例如下:

http://localhost:8304/BMWMS/wms.ashx?REQUEST=GetMap& LAYERS=Bing& STYLES=& CRS=EPSG:4326& BBOX=-180, -85, 180, 85& WIDTH=600& HEIGHT=600& FORMAT=image/png& VERSION=1.3.0

根据参数BBOX=-180, -85, 180, 85可知, 将返回整个地球的地图, 服务器返回的图片如图3所示。

图3 GetMap响应Fig.3 The response of GetMap

与其他WMS服务一样, Bing Maps-WMS可以被任何支持WMS服务的客户端程序加载。ArcGIS支持WMS服务, 首先在ArcCatalog中加载Bing Maps-WMS服务, 就可以在ArcMap中方便地使用Bing Maps数据了。图4是在ArcCatalog中加载Bing Maps-WMS服务的方法。

图4 在ArcCatalog中加载Bing Maps-WMS服务Fig.4 Add Bing Maps-WMS with ArcCatalog

4 结论

本文通过分析Bing Maps地图切片数据的编码方式及URL的结构, 介绍了获取Bing Maps地图切片数据的方法, 并将获取的数据生成WMS服务, 以供任何能够支持WMS服务的客户端加载, 以较小的成本方便快捷地获取地图和影像数据。

遗憾的是, 虽然Google Map也可以以URL的方式获取地图切片, 但是由于Google自身保护机制的原因, 为了使Google服务器保持高质量的服务, 频繁访问Google地图切片数据, 会被Google限制访问, 而无法继续获取数据。就使得用上述方法生成的WMS服务无法保持稳定性和长期的有效性。

另外, 由于受到地图保密政策等各种因素的限制, 无论是微软还是Google, 都在中国设有单独的数据中心, 限制了国内用户对数据的访问权限。因此, 目前提供高分辨率影像的数据多集中在北美和欧洲, 其他地区往往是首都或极重要城市才提供。但无论如何, 本研究提出了利用Bing Maps地图切片数据实现网络地图服务, 从而以较小的成本而且方便快捷地获取地图和影像数据的一种方案, 希望能为相关研究和应用提供一些帮助。

The authors have declared that no competing interests exist.

参考文献
[1] Joe Schwartz. Bing Maps Tiles System[EB/OL]. [2009-08-10]. msdn. microsoft. com. [本文引用:1]
[2] Jeff de la Beaujardiere. OGC Web Map Service Interface[S]. Open Geospatial Consortium, 2004. [本文引用:1]
[3] Scott Davis. GIS for Web Developers[M]. [S. l. ]: [s. n. ], 2007. [本文引用:1]
[4] 孟庆祥, 付仲良, 侯晨, . 基于影像的地图服务方法研究[J]. 测绘通报, 2009, (6): 55-58. [本文引用:1]
[5] 贾文珏, 陈玉敏, 龚健雅, . 基于Web Service的OGC地图服务实现方法[J]. 测绘信息与工程, 2004, 29(4): 34-36. [本文引用:1]
[6] 龙岳红, 邹峥嵘, 王科. Virtual Earth API在Web地图服务中的应用[J]. 测绘科学, 2008, 33(6): 199-202. [本文引用:1]
[7] 巫细波, 胡伟平. Google Maps运行机制以及应用研究[J]. 华南师范大学学报(自然科学版), 2009(2): 106-110. [本文引用:1]