互联网与GIS 结合而形成的Web GIS是GIS软件发展的必然趋势。本书以循序渐进的方式,通过讲解OGC制定的相关开放Web服务规范,介绍了Web GIS的原理;详解了一整套利用开源软件与开放数据开发Web GIS的方案,包括空间数据库存储软件PostGIS、数据处理客户端软件QGIS、服务器端软件GeoServer,以及浏览器页面端开发JavaScript API库OpenLayers,并通过实践的方式,一步一步地介绍这些开源软件的应用,以及如何利用OpenLayers在互联网上共享地理信息、开发Web GIS2.0应用;,本书还介绍了OpenStreetMap等开放数据的下载与使用方法。 本书主要读者对象为地理信息系统专业的本科生与硕士研究生,也适用于政府、企业相关部门的GIS研究与开发人员,还适合作为各种GIS培训班的学习教材与参考书。
本书以循序渐进的方式,通过讲解OGC制定的相关开放Web服务规范,介绍Web GIS的原理;详解了一整套利用开源软件与开放数据开发Web GIS的方案,包括空间数据库存储软件PostGIS、数据处理客户端软件QGIS、服务器端软件GeoServer,以及浏览器页面端开发JavaScript API库OpenLayers , 并通过实践的方式,逐步介绍这些开源软件的应用,以及如何利用OpenLayers在互联网上共享地理信息、开发Web GIS 2.0应用;后,还介绍了OpenStreetMap等开放数据的下载与使用方法。本书主要读者对象为地理信息系统专业的本科生与硕士研究生、政府、企业相关部门的GIS研究与开发人员,另外还适合作为各种GIS培训班的学习教材与参考书。
刘光,北京大学GIS专业博士,德国波恩大学波恩-亚琛信息技术国际中心访问学者,现任职于北京市测绘设计研究院。近期出版了《ArcGIS Server JavaScript API开发GeoWeb 2.0应用》、《Web GIS开发:ArcGIS Server与.NET》、《Visual C .NET应用教程》、《地理信息系统实习教程》、《地理信息系统二次开发教程——组件篇》与《地理信息系统二次开发教程——语言篇》等。主持的工程有北京市房屋全生命周期管理平台、北京市交通专用地理信息系统、北京市勘察设计与测绘管理信息系统等。
第1章 Web GIS概述 1
1.1 GIS的发展 2
1.2 Web GIS及其发展 3
1.2.1 传统Web GIS的不足 3
1.2.2 从Web站点发展为Web服务 4
1.2.3 从SOAP发展为REST 5
1.2.4 从三层架构发展为多层架构 6
1.2.5 从Web GIS 1.0到2.0 7
1.3 Web服务 8
1.3.1 Web服务的重要性 8
1.3.2 REST及REST风格的Web服务 11
1.3.3 查看在线的Web服务 13
1.3.4 OGC的Web服务规范 15
1.4 自由及开源软件、开放规范与开放数据 16
1.4.1 自由及开源GIS软件 17
1.4.2 开放规范的使用 17
1.4.3 开放数据的作用 18
1.5 实践1:QGIS的安装与基本使用 19
1.6 习题 22
第2章 Web服务与Web GIS的设计 23
2.1 Web GIS的系统架构 24
2.2 Web地图的组成 26
2.2.1 基础底图 27
2.2.2 专题图层 28
2.2.3 交互小组件 29
2.3 实践2:GeoServer的安装与初步使用 29
2.4 习题 33
第3章 空间数据的存储与处理 34
3.1 空间数据常用的开放格式 35
3.1.1 基于文件的数据 35
3.1.2 基于空间数据库的数据 38
3.2 Web GIS中的数据层 39
3.2.1 服务器的选择 39
3.2.2 文件与数据库方式的选择 40
3.2.3 开放数据格式与专有格式的选择 40
3.3 处理空间数据的开源工具 40
3.3.1 QGIS 41
3.3.2 GDAL与OGR工具 42
3.4 实践3:使用QGIS裁剪与投影变换矢量数据 43
3.4.1 使用QGIS裁剪数据并转换投影 43
3.4.2 使用OGR命令行工具裁剪与投影变换数据 45
3.4.3 在批处理中运行OGR功能 47
3.4.4 数据整合 48
3.5 实践4:使用QGIS处理栅格数据 48
3.6 实践5:PostGIS的安装与初步使用 52
3.6.1 安装PostGIS 52
3.6.2 创建空间数据库 53
3.6.3 导入空间数据 54
3.7 习题 57
第4章 使用WMS在服务器端绘制与查询地图 58
4.1 动态绘制地图服务 59
4.1.1 动态绘制地图的优点 59
4.1.2 动态绘制地图的缺点 59
4.1.3 动态绘制地图的相关服务器软件 60
4.2 WMS规范基础 60
4.2.1 使用GetCapabilities操作请求服务元数据 61
4.2.2 使用GetMap操作请求地图 64
4.2.3 使用GetFeatureInfo操作请求地图要素信息 65
4.3 WMS的样式与符号 67
4.3.1 使用GetStyles操作请求样式 67
4.3.2 使用GetLegendGraphic操作请求图例 68
4.4 实践6:使用GeoServerWMS服务 69
4.4.1 使用默认样式一个图层 69
4.4.2 使用样式化图层描述符 72
4.4.3 在QGIS中访问WMS 77
4.5 实践7:高级符号与图层组 78
4.5.1 使用QGIS创建样式化图层描述符 78
4.5.2 将多图层为WMS服务 80
4.6 习题 82
第5章 切片地图 83
5.1 为什么使用切片地图 84
5.2 何时使用地图切片 86
5.2.1 是否有满足需求的切片地图 86
5.2.2 投影 87
5.2.3 比例尺 88
5.3 创建与提供切片地图服务的策略 89
5.3.1 创建切片地图的策略 90
5.3.2 使用开源软件创建切片 90
5.4 实践8:使用GeoWebCache创建切片 91
5.5 实践9:使用TileMill创建切片 93
5.5.1 使用TileMill设计地图 93
5.5.2 输出与提取地图切片 99
5.5.3 与测试切片 102
5.6 习题 104
第6章 使用Web地图API访问地图服务 105
6.1 Web地图API 106
6.1.1 Web地图API的选择 106
6.1.2 主要FOSS类型的Web地图API 107
6.1.3 主要的商业Web地图API 108
6.2 使用Web地图API的基本步骤 110
6.2.1 引用JavaScript与样式文件 110
6.2.2 地图div与对象 111
6.2.3 Layer对象 111
6.2.4 图层样式化机制 112
6.2.5 事件与交互元素 113
6.3 查看OpenLayers实例 115
6.3.1 切片地图实例 115
6.3.2 WMS实例 116
6.3.3 查询实例 116
6.4 实践10:使用OpenLayers实现在切片地图上叠加WMS 119
6.4.1 专题数据WMS服务 120
6.4.2 准备开发环境 121
6.4.3 页面设计与代码编写 122
6.5 习题 127
第7章 在客户端绘制矢量数据 128
7.1 在客户端绘制矢量数据的优势与挑战 129
7.1.1 客户端绘制矢量数据的优势 129
7.1.2 客户端绘制矢量数据的挑战 130
7.1.3 客户端如何绘制矢量数据 130
7.1.4 从服务器获取数据的方法 130
7.2 使用KML矢量数据 131
7.2.1 KML简介 131
7.2.2 在OpenLayers中使用KML 132
7.3 使用GeoJSON 133
7.3.1 GeoJSON简介 133
7.3.2 在OpenLayers中使用GeoJSON 134
7.4 在OpenLayers中符号化矢量图层 135
7.5 实践11:在OpenLayers使用GeoJSON图层 137
7.6 实践12:访问用户KML数据 142
7.6.1 页面设计 142
7.6.2 功能实现 143
7.7 习题 148
第8章 主流JavaScript框架的使用与专题制图 149
8.1 主流JavaScript框架 150
8.1.1 jQuery 150
8.1.2 Mootools 151
8.1.3 Ext JS 151
8.1.4 Dojo 152
8.2 OpenLayers的控件 154
8.3 基于属性值符号化图层 156
8.3.1 在OpenLayers中读取属性值 157
8.3.2 独立值专题图 158
8.3.3 等级符号专题图 159
8.3.4 范围专题图 160
8.3.5 根据属性限制要素的显示 163
8.4 实践13:使用OpenLayers与Dojo进行专题制图 165
8.4.1 页面布局 165
8.4.2 代码设计 168
8.5 习题 174
第9章 Web要素服务 176
9.1 WFS 177
9.1.1 WFS请求与响应的格式 177
9.1.2 WFS服务器与客户端 179
9.2 事务性WFS与基于Web的数据编辑 180
9.3 实践14:基于Web的空间数据编辑功能实现 181
9.3.1 服务 181
9.3.2 基于Web编辑功能开发 182
9.4 习题 190
第10章 WCS及多维数据 191
10.1 WCS及其操作 192
10.1.1 GetCapabilities操作 192
10.1.2 DescribeCoverage操作 193
10.1.3 GetCoverage操作 194
10.2 多维数据与图像镶嵌插件 195
10.2.1 多维数据 195
10.2.2 图像镶嵌插件 198
10.3 实践15:多维数据WCS的 198
10.3.1 时间序列栅格数据 198
10.3.2 时间序列与高程序列栅格数据 204
10.4 实践16:在OpenLayers中访问WCS 207
10.4.1 页面设计 207
10.4.2 代码设计 208
10.5 习题 211
第11章 Web处理服务 212
11.1 GeoServer中的WPS 213
11.1.1 WPS扩展的安装 213
11.1.2 GeoServer中WPS包含的类型 214
11.2 WPS的操作 215
11.2.1 GetCapabilities操作 215
11.2.2 DescribeProcess操作 216
11.2.3 Execute操作 217
11.3 实践17:使用WPS创建等高线地图 219
11.3.1 创建静态等高线地图 219
11.3.2 动态创建等高线 223
11.4 实践18:在OpenLayers中使用WPS 229
11.4.1 页面设计 230
11.4.2 代码实现 230
11.5 习题 233
第12章 开放数据获取与地图混搭应用 236
12.1 开放数据的方式 237
12.1.1 开放数据许可 237
12.1.2 商业软件与开放数据 238
12.2 VGI与众包项目 239
12.2.1 VGI 239
12.2.2 众包 240
12.3 OpenStreetMap及其开放数据的应用 240
12.3.1 OpenStreetMap数据模式 241
12.3.2 OpenStreetMap的使用 243
12.4 地图混搭应用 245
12.4.1 混搭应用的概念 245
12.4.2 网络资源 245
12.5 实践19:从OpenStreetMap获取源数据 249
12.5.1 使用QGIS下载数据 250
12.5.2 使用OpenStreetMap查询API下载数据 253
12.6 实践20:城市天气预报系统开发 256
12.6.1 服务准备与页面设计 256
12.6.2 代码实现 256
12.7 习题 261
第5章
切片地图
从本章可以学习到:
v 为什么使用切片地图
v 何时使用地图切片
v 创建与提供切片地图服务的策略
v 使用GeoWebCache创建切片
v 使用TileMill创建切片
如果要提高Web地图的访问速度,使用地图切片是非常有效的方法。地图切片就是在多个比例尺下配置地图,然后提前把每个比例尺下的地图绘制为小块图片,保存在服务器上名为缓存的目录中。这样客户端在访问地图时,可以直接获取需要的小块图片拼接成整幅地图,而不是由服务器动态创建出一幅图片再送到客户端,从而极大提高了访问速度。
本章将介绍地图切片的利弊,以及创建与维护地图缓存的策略。并通过两个实践演示如何在实际工作中创建地图切片。及时个实践演示如何使用GeoServer的GeoWebCache软件来创建一个简单的缓存地图。在第二个实践中,介绍使用TileMill和CartoCSS标记语言创建比GeoServer更好的地图切片。
5.1 为什么使用切片地图
正如在前面内容中所介绍的,最初的Web地图,无论在地图中包含了多少个图层,也无论有多少访问请求,通常都是由服务器动态绘制。这也就是第4章介绍的使用GeoServer与WMS的方式。但是正如大家注意到的,这类地图中符号、标注与注记的选择非常有限而且难以应用。事实上,多年来为了避免妨碍性能,Web制图者不得不使用最少的图层与简单符号来构造地图。许多情况下,在开发Web GIS应用时,甚至不需要专业制图人员的参与,而是由服务器管理员通过XML文件来定义图层顺序和符号大小等。这种情况在开放Web服务规范(如WMS)与商业Web服务(如ESRI的ArcIMS)中都存在。
造成使用这种方法的部分原因是为了使Web GIS应用程序看起来就像桌面系统。有时,这些应用被称为“瑞士军刀应用程序”,因为它们试图使用Web GIS来解决一切问题。人们希望在Web GIS中也能随意切换图层的可见性、重新排序图层、动态更改图层符号,以及其他所有桌面GIS应用程序能做的一切。讽刺的是,当这种心态盛行的时候,网络技术还远远满足不了这类需求。
在2005年前后,随着谷歌地图、微软虚拟地球(现在称为Bing地图)以及其他流行的Web GIS应用的出现,人们开始意识到,也许他们并不需要管理每一个图层所有属性的功能。这些互联网巨头已经开始将矢量图层融合为一张栅格化的图像,这些图像被切分为256像素×256像素的图片及切片。这些图片预先生成并存储在磁盘上,以便快速分发到客户端。这样做可以同时支持成千上万个并发请求,而这对于动态地图绘制而言基本是不可能的。
正如图5.1显示的,切片地图采用的是金字塔模型,是一种多分辨率层次模型,从切片金字塔的底层到顶层,比例尺越来越小,分辨率越来越低,但表示的地理范围不变。切片地图通常都带有一个级别、行与列编号方案,以便将来自多个切片地图服务的切片放置到正确的位置。
图5.1 切片地图包含的内容
有了切片地图,制图人员再也不用担心性能问题了,他们可以使用他们所掌握的所有工具,来制作一张美观Web地图。一旦创建了地图切片,这些切片就保存到了服务器上的某个文件夹中,服务器检索美观地图图片与丑的图片的速度是一样的。正由于Web服务器可以快速分发切片地图图像,因此我们可以使用AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)编程技术来从服务器获取图片,这样当用户漫游时不会出现页面闪烁的现象。
这种变化是革命性的。一类是具有图层排序与调整符号颜色等功能,但响应非常迟缓的丑陋的地图应用;一类是没有图层控制,但具有惊人美观并且快速响应的地图应用。对于这两类Web GIS应用的选择,虽然对于一些GIS长期爱好者可能还需要停下来比较一下,但对于普通互联网用户来说根本不用思索,他们无疑会选择后者。
在谷歌地图了一两年以后,商业GIS软件开始提供创建地图切片的功能。由于可以使用成熟的地图制作工具ArcMap,很多人选择使用ArcGIS Server来空间信息Web服务,但是其价格不菲。我国的超图SuperMap iServer是另一种商业选择。免费和开源Mapnik库也可以创建地图切片,但是直到最近几年才提供了将Mapnik封装的用户友好的应用程序(即TileMill)。
如果一个Web GIS应用有成千上万用户并发访问,那么切片地图是一个合理的解决方案。然而,切片地图不提供改变图层顺序与符号的功能。人们开始研究其他改进方案,将通用的基础底图图层为切片,在其上叠加另外的包含专题信息的图层。通用底图切片可以用于许多应用。如果专题图层的变化不频繁,或者覆盖区域非常大,则也可以使用切片方式。例如,如果使用Firebug等开发者工具来深入检查谷歌地图的话,可以看到其底图与专题图层(如Panoramio照片)都是以切片方式获取的,如图5.2所示。
图5.2 Panoramio的照片专题图也以切片的方式提供
5.2 何时使用地图切片
如果希望基础底图能够快速漫游,或者同时有几十个并发用户,这时应该为底图创建切片缓存。如果专题图层中地物要素的空间位置与属性信息不经常变换,那么也可以创建切片缓存。
但不管是那种情况,必须了解到切片缓存代表着切片创建时该时刻点的地图快照。说得难听的话,当后端数据发生变化时,这些切片不会自动更新,是一些“死图片”。为了更新地图,切片地图服务提供者必须定期创建新的切片。对于那些大规模的切片缓存,有时管理员只针对变换领域更新切片,而不是重建整个地图范围的所有切片。而这又需要记录哪些地方进行过编辑,或比较几个版本的数据。
确定Web GIS系统是否需要创建自己的地图切片,需要考虑以下几个方面。
5.2.1 是否有满足需求的切片地图
创建切片底图需要大量丰富的数据、高端的地图制作软件和制图技能,以及潜在的大量时间和磁盘空间。正是由于存在这些挑战,通用的Web混搭常常使用他人创建的地图切片。如果想没有任何限制的自由与免费使用,那么OpenStreetMap是个选择。而对于谷歌、微软或ERSRI的切片地图,则根据你的地图的性质(商业或不以盈利为目的),以及多少人使用你的应用程序,确定是免费还是付费使用。而其他一些公司,例如CloudMade和MapBox,则以OpenStreetMap数据为基础提供他们自己版本的切片。
如果决定创建自己的基础底图,那么曾经设计过多比例尺地图的有经验的制图人员是必不可少的。在每个比例尺下,地图都应该有合适的符号、颜色以及相应的详细程度。仅仅为地图所有不同的比例尺创建注记就是一项令人望而生畏的任务。此外,如果在底图中包含卫星或航空影像,那么制图人员还需要另外再单独制作一组切片,因为需要不同的颜色与符号。
5.2.2 投影
要创建切片地图可以使用任何坐标系。但是,如果准备将自己的地图切片叠加在OpenStreetMap或谷歌、微软、ERSRI的切片地图上,则必须将珍贵的GIS数据转换到Web墨卡托投影。该投影创建的目的仅仅是方便将整个世界镶嵌为一组正方形切片。GIS纯粹主义者拒绝接受该投影方式,并预测这将无法得到大规模认可,但事实与他们的期待大相径庭。
Web墨卡托投影在很长一段时间内并没有被EPSG的投影数据库所接纳。EPSG认为它不能算作科学意义上的投影,所以只是给了一个EPSG:900913的标号,这个标号游离在EPSG常规标号范围之外。因此对于一些老的软件或API,可能使用了该代码或其他代码。直到2008年,EPSG才恍然明白:不管椭球体还是球体,其实都是对地球的模拟,只是程度上的差别,没有本质上的不同。或者是不得不接受广泛的事实标准,EPSG接纳了这个投影,定义投影坐标系PROJCS的名字为“Popular Visualization CRS / Mercator”,SRID为EPSG:3785;地理坐标系GEOGCS的名字为“Popular Visualization CRS”,SRID为EPSG:4055。这些标号已经进入“正常范围”。
另外要注意的是,即使使用EPSG:3785,即Web墨卡托投影显示地图,也不能在该投影下进行量测功能,包括线的长度与多边形面积的量算。即使在中纬度地区,结果都存在很大的偏差。要执行量测功能,好是将几何图形投影到本地坐标系统。
以下链接指向一个小型 Web 应用程序,该程序生动展示了Web墨卡托投影如何影响距离和面积计算。
links.esri.com/web_mercator_measurements
图5.3显示了如何使用示例 Web 应用程序测量一个小面的面积。在右侧面板上,有3个不同的坐标系用于计算此面的面积和周长。State Plane Oregon North的测量最为,其次是UTM Zone 10测量,它们之间只相差很小的百分比。但是,请注意Web墨卡托投影的测量值,长度测量为9600 米,几乎是State Plane Oregon North值6763的1.5倍。正如所见,Web墨卡托投影不适合用于计算距离和面积。其他坐标系(尤其是大的面积(洲)等角投影)在测量距离和面积时同样不尽如人意。
图5.3 使用Web墨卡托投影时多边形的面积不
ESRI的一篇名为“Measuring distances and areas when your map uses the Mercator projection”的博客文章给出了针对ArcGIS API for JavaScript的解决方案,使用开源软件的也可以借鉴其思路。该博客文章的地址如下:
blogs.esri.com/esri/arcgis/2010/03/05/measuring-distances-and-areas-when-your-map-uses-the-mercator-projection/
5.2.3 比例尺
要将地图切片叠加在OpenStreetMap或谷歌、微软、ERSRI的ArcGIS在线切片地图上,除了保障使用相同的投影之外,还需要确保比例尺序列一致。不过这些地图的比例尺序列与我们通常见到的地形图比例尺序列很不一样,我国地形图比例尺一般有1︰10000、1︰50000等。而这些地图的比例尺是计算出来的,最小比例尺是将整个世界放置在2×2的网格中,每个网格大小是256像素×256像素,因此最小比例尺为1 : 295829355.45,再放大一个级别,那么比例尺在原基础上乘以2,结果为1 : 147914677.73,以此类推。由于这些比例尺很不好记忆,也很不好用于交流,并且互联网地图用户也没必要关心这么的数字,因此切片地图的比例尺通常简化成为“14级”“15级”“20级”等。用户只需要大致了解在全国尺度、省一级尺度、城市尺度与社区尺度对应的级别即可。
表5.1列出了微软必应地图各比例级别对应的比例尺。该表中的比例尺与地面分辨率是以赤道位置来计算的,根据纬度不同而会有不同。
表5.1 微软必应地图各比例级别对应的比例尺
级别 地图高与宽(像素) 地面分辨率(米/像素) 地图比例尺(96 dpi)
1 512 78271.5170 1︰295829355.45
2 1024 39135.7585 1︰147914677.73
3 2048 19567.8792 1︰73957338.86
(续表)
级别 地图高与宽(像素) 地面分辨率(米/像素) 地图比例尺(96 dpi)
4 4096 9783.9396 1︰36978669.43
5 8192 4891.9698 1︰18489334.72
6 16384 2445.9849 1︰9244667.36
7 32768 1222.9925 1︰4622333.68
8 65536 611.4962 1︰2311166.84
9 131072 305.7481 1︰1155583.42
10 262144 152.8741 1︰577791.71
11 524288 76.4370 1︰288895.85
12 1048576 38.2185 1︰144447.93
13 2097152 19.1093 1︰72223.96
14 4194304 9.5546 1︰36111.98
15 8388608 4.7773 1︰18055.99
16 16777216 2.3887 1︰9028.00
17 33554432 1.1943 1︰4514.00
18 67108864 0.5972 1︰2257.00
19 134217728 0.2986 1︰1128.50
20 268435456 0.1493 1︰564.25
21 536870912 0.0746 1︰282.12
22 1073741824 0.0373 1︰141.06
23 2147483648 0.0187 1︰70.53
5.3 创建与提供切片地图服务的策略
地图切片一般都采用简单的文件夹结构,以便提供服务。然而,由于切片数量非常多,因此它们的管理变得非常复杂。当前互联网的切片地图基本有如下两种方式组织:
(1)将切片图像以文件夹的结构放在服务器上,用户直接请求文件。在这种方法中,只需要将单独的切片图像组织在代表比例级别、行和列的文件夹结构中。很多地图API通过访问包含代表级别、行和列结构的URL来访问切片。例如,当使用Leaflet API访问地图切片时,必须提供格式为“http://{s}.somedomain.com/blabla/{z}/{x}/{y}.png”的网址,其中z是缩放级别,x和y分别是列和行。例如其中OpenCycleMap一个地图切片的URL地址如下:
a.tile.opencyclemap.org/cycle/10/265/420.png
(2)将切片以Web服务的方式提供访问。在这种方法中,虽然Web服务仍然需要用户提供访问切片的具体缩放级别、行与列,但是其背后文件的组织形式是看不见的。该方法比直接使用文件夹的方式相对稍微复杂一些,因此同时也会带来延时。OGC的 Web地图切片服务(Web Map Tiled Service,WMTS)规范就是按照这种方式来提供切片服务的。如果使用Firebug或其他开发者工具来查看百度地图的话,就可以看到该模式。例如,百度地图的URL如下:
online1.map.bdimg.com/tile/?qt=tile&x=793&y=293&z=12&styles=pl&udt=20150305&scaler=1
虽然通过仔细分析,可以看到缩放级别、行与列参数,但并不能知道百度地图在后台是如何组织地图切片的。
5.3.1 创建切片地图的策略
如果地图范围覆盖广,例如一个省或国家,那么大比例尺中地图切片的数量非常巨大。然而具有讽刺意味的是,在大比例尺下,很多地图切片包含的信息却非常少。例如在1:2250比例尺下,居民区附近的地图切片包含了丰富的有用的信息,但是如果漫游到沙漠或海洋地区,那么切片就很可能是空的,没有任何有用的信息。那么我们是否还有必要花费大量的时间创建并用上千MB的磁盘空间来存储它们呢?
对于这种情况,我们希望能找到某种按需创建切片的软件,也就是说,在用户及时次访问该区域时创建切片。及时个漫游到该地区的用户需要等待服务器创建切片,但是接下来的用户就不需要等待了。这样一来,那些受欢迎的地区有地图切片,那些从来没人访问的地区就不需要创建与存储切片。显然,这种方法的有效性基于服务器的绘制地图切片的速度。
另一种方案是使用“没有数据”图片表明某些地区没有切片。尽管地图管理人员常常不愿这么做,但是在实际使用过程中,当用户看到该图片时,都只会责怪自己放大太多,而不会埋怨管理员为什么不提供该比例尺下的地图。
好的方法应当是事先创建最感兴趣地区的地图切片,对于不感兴趣的区域,要么按需创建切片,要么提供“没有数据”图片。虽然作为一个地理学家,可能不太愿意把一些地方归为“不感兴趣”区域,但严酷的事实是,并不是所有的地图切片都会有均等的访问量。有研究表明,互联网地图用户的访问集中在大城市、海边和交通走廊。近期来自社交媒体的反馈,如地理微博和Flickr照片数据集,更能地揭示了地图用户最感兴趣地区。不过要说明的是,我们这里讨论的是通用用途的基础底图,而对于那些专业类型的地图,例如矿产勘查和野生动物保护,可能有截然不同的使用模式。
上述方式要求切片创建软件具有允许指定部分区域的能力。大多数软件仅仅允许指定一个矩形的子区域,但是像海边、城市等互联网地图用户所感兴趣的区域却通常不是矩形区域。因此有时需要使用一系列的矩形区域。
5.3.2 使用开源软件创建切片
当前各种FOSS软件中的一个基本工具就是创建网络切片地图工具。其中比较方便的是GeoWebCache,因为它集成在GeoServer中。其他还有TileCache与TileStache等。
Mapnik库是一个可为Python与其他语言调用的C 编写的自由及开放源代码软件,可用于创建地图切片。Mapnik是一个高效渲染引擎,其中包含了常用WMS图层中没有的高级绘图选项。虽然Mapnik的使用不太方便,通常需要一些Linux的知识以及一些实验与犯错,然而以利为目的Mapbox公司最近了一个名为TileMill开放源码的程序,可以在Mac和Windows上运行,以Mapnik为底层,提供了一个漂亮的窗口界面,从而简化了制图过程。在本章的第2个实践中,将介绍使用TileMill来创建费城的切片地图。
5.4 实践8:使用GeoWebCache创建切片
如果对于在WMS中设置的图层与符号均感到满意,但希望提供响应速度,以及支持更多的并发用户,那么则可以考虑使用GeoWebCache来创建地图切片。主要是因为GeoWebCache集成在GeoServer中。在本实践中,将介绍如何使用GeoWebCache来为实践7中的NeighborhoodMap图层组WMS服务创建切片地图服务。
(1)准备工作。
启动GeoServer,并打开GeoServer的Web管理页面。
使用OpenLayer预览webgis: NeighborhoodMap图层组,进行放大、缩小以及漫游等地图操作,注意观察性能以及地图的显示。可以观察到每次漫游时,标注都存在重新定位的现象,表明没有使用地图切片。
(2)创建地图切片。
在GeoServer的Web管理页面窗口的左边单击“Tile Caching”中的“Tile Layers”连接,在右边窗口进入Tile Layers页面。
在Tile Layers页面中,单击“webgis:NeighborhoodMap”连接,进入“图层组”页面。
在“图层组”页面中滚动鼠标,定位到“Tile cache configuration”部分。通过该部分的参数配置图层的缓存。由于是从“Tile Layers”连接进来的,因此自动选择为图层组创建缓冲切片。如果不进行进一步的操作,那么GeoServer将按需创建缓存切片。但是我们需要的不是按需创建,而是预先创建。
在GeoServer的Web管理页面窗口的左边,再次单击“Tile Caching”中的“Tile Layers”连接,然后在右边窗口Tile Layers页面中的webgis:NeighborhoodMap行单击“Seed/Truncate”连接,将打开一个新的窗口。
在新窗口中,按图5.4设置“Create a new task”表单。
然后选择底部的“Submit”,页面将进入执行任务监控页面,而GeoServer则在后台针对不同比例尺绘制地图。
等待大约30秒钟以后,单击“Refresh list”连接,可以看到图5.5所示的进度显示,告诉已进行多长时间,估计还需要多长时间。当单击“Refresh list”连接后,该进度统计列表消失时,表示地图切片已经创建完成。
图5.4 填写创建地图切片的参数
图5.5 地图切片任务执行统计列表
(3)预览切片地图。
在GeoServer的Web管理页面窗口中单击“Tile Layers”连接,进入Tile Layers页面。然后从webgis:NeighborhoodMap行的预览下拉列表框中选择“EPSG:900913 / png”,如图5.6所示。
图5.6 使用“EPSG:900913 / png”方式预览地图
在新的地图预览窗口中,对地图进行放大、缩小与漫游等操作,可以发现无须等待而地图立即显示,而且当漫游时标注并没有改变位置,表明已经利用切片缓存。
请注意,确保使用的是“Tile Layers”预览,而不是“Layer Preview”预览。切片图层预览使用的URL稍微有些不同,以表明需要使用切片缓存。
虽然使用切片缓存改善了性能,但是也正如大家注意到的,地图中存在重复标注的现象。因为每个地图切片并不清楚相邻切片中的标注,因此在生成地图切片时很难避免重复标注。要缓解该问题,切片生成软件通常在比切片更大的范围内绘制地图,然后再将其切开为单独的切片。GeoWebCache将该较大区域称为“metatile(元切片)”,而ESRI称为“supertile(超级切片)”。可以在GeoWebCache调整元切片的大小进行试验,可以看到,