新書推薦:
《
古希腊神话与传说全集(特装刷边版,精装彩插,德文原版直译,随书附赠古希腊神谱+诸神图)
》
售價:HK$
147.2
《
英伦历史漫步 探寻世外桃源之旅
》
售價:HK$
67.9
《
知识如何流动(三棱镜译丛)
》
售價:HK$
91.8
《
万有引力书系 江南困局 晚明士大夫的危机时刻
》
售價:HK$
89.7
《
正始十年(看司马懿父子如何打破“恐怖平衡”,实现统一!)
》
售價:HK$
78.2
《
中国网络文学年鉴(2023)
》
售價:HK$
457.7
《
美国学院和大学史(大学、思想与社会)
》
售價:HK$
112.7
《
好望角丛书·自由古巴:革命、救赎与新生
》
售價:HK$
170.2
編輯推薦:
本书以循序渐进的方式,通过讲解OGC制定的相关开放Web服务规范,介绍Web GIS的原理;详解了一整套利用开源软件与开放数据开发Web GIS的方案,包括空间数据库存储软件PostGIS、数据处理客户端软件QGIS、服务器端软件GeoServer,以及浏览器页面端开发JavaScript API库OpenLayers , 并通过实践的方式,逐步介绍这些开源软件的应用,以及如何利用OpenLayers在互联网上共享地理信息、开发Web GIS 2.0应用;*后,还介绍了OpenStreetMap等开放数据的下载与使用方法。本书主要读者对象为地理信息系统专业的本科生与硕士研究生、政府、企业相关部门的GIS研究与开发人员,另外还适合作为各种GIS培训班的学习教材与参考书。
內容簡介:
互联网与GIS 结合而形成的Web GIS是GIS软件发展的必然趋势。本书以循序渐进的方式,通过讲解OGC制定的相关开放Web服务规范,介绍了Web GIS的原理;详解了一整套利用开源软件与开放数据开发Web GIS的方案,包括空间数据库存储软件PostGIS、数据处理客户端软件QGIS、服务器端软件GeoServer,以及浏览器页面端开发JavaScript API库OpenLayers,并通过实践的方式,一步一步地介绍这些开源软件的应用,以及如何利用OpenLayers在互联网上共享地理信息、开发Web GIS2.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:使用GeoServer发布WMS服务 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墨卡托投影如何影响距离和面积计算。
http:links.esri.comweb_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的解决方案,使用开源软件的也可以借鉴其思路。该博客文章的地址如下:
http:blogs.esri.comesriarcgis20100305measuring-distances-and-areas-when-your-map-uses-the-mercator-projection
5.2.3 比例尺
要将地图切片叠加在OpenStreetMap或谷歌、微软、ERSRI的ArcGIS在线切片地图上,除了保证使用相同的投影之外,还需要确保比例尺序列一致。不过这些地图的比例尺序列与我们通常见到的地形图比例尺序列很不一样,我国地形图比例尺一般有1︰10000、1︰50000等。而这些地图的比例尺是计算出来的,最小比例尺是将整个世界放置在22的网格中,每个网格大小是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.comblabla{z}{x}{y}.png的网址,其中z是缩放级别,x和y分别是列和行。例如其中OpenCycleMap一个地图切片的URL地址如下:
http:a.tile.opencyclemap.orgcycle10265420.png
(2)将切片以Web服务的方式提供访问。在这种方法中,虽然Web服务仍然需要用户提供访问切片的具体缩放级别、行与列,但是其背后文件的组织形式是看不见的。该方法比直接使用文件夹的方式相对稍微复杂一些,因此同时也会带来延时。OGC的 Web地图切片服务(Web
Map Tiled Service,WMTS)规范就是按照这种方式来提供切片服务的。如果使用Firebug或其他开发者工具来查看百度地图的话,就可以看到该模式。例如,百度地图的URL如下:
http:online1.map.bdimg.comtile?qt=tilex=793y=293z=12styles=pludt=20150305scaler=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行单击SeedTruncate连接,将打开一个新的窗口。
在新窗口中,按图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调整元切片的大小进行试验,可以看到,标注重复现象得到了很大的改善,但是仍然在元切片的边界处出现同名标注。这是因为,当对元切片进行标注时,标注放置位置引擎未识别出相邻元切片上的标注。事实上,标注引擎可能正在努力使元切片中包含尽可能多的标注,进而在边附近放置了一些标注。在相邻的元切片上可能发生同样的情况,使得元切片边界附近出现同名标注。下一个实践将介绍的TileMill也有元切片的概念。
5.5 实践9:使用TileMill创建切片
在该实践中,将介绍如何使用Mapnik(TileMill是该库的封装)来创建费城通用的地图切片。本书后面内容中的相关专题图层可叠加在该基础底图上。这里所使用的数据是第3章中处理好的数据。如果是遵循本书给出的操作,那么数据位于C:\Data\Philadelphia文件夹下,使用的是EPSG:3857投影。
Mapnik(www.mapnik.org)是一常用的地图切片生成FOSS软件。Mapnik集成了抗锯齿功能(通过混合物体边缘附近的前景像素和背景像素而使人眼看到的边界更平滑的一种图形技术)。它并不依赖任何其他GIS软件框架,也正因为这一特点,从而改善了性能。Mapnik支持多种类型的文件形式与空间数据库的数据。
要使用Mapnik,首先要定义一系列的数据源,然后将它们与一组样式规则联系起来。可使用XML文件定义样式规则,也可以使用Python等编程语言编写。一旦定义了数据源与样式规则,便可使用Mapnik输出地图图片。
对于初学者特别是编程技能弱的人来说,使用Mapnik有一定的难度。不过可以通过有图形界面的TileMill来帮助使用Mapnik。在TileMill中,不再使用XML或代码来定义样式,而是使用CartoCSS。CartoCSS是一种语法类似CSS(Cascading Style Sheets,层叠样式表,一种对网页进行设计的样式语言)的制图样式描述语言。如果熟悉CSS的话,尽管二者所包含的要素、属性等内容和含义完全不同,那么也还是会比较容易理解CartoCSS这种对地图进行样式设计的语言。
虽然TileMill是自由与开源的软件,但它是由Mapbox开发,并将其集成到公司的商业地图切片服务中。当使用TileMill输出切片时,结果是以.mbtiles为后缀名的文件。如果不想将其发布者Mapbox的服务器上,可以将该.mbtiles文件解压为一系列的切片文件,然后将其发布到自己的Web服务器上。
5.5.1 使用TileMill设计地图
(1)下载与安装TileMill。
从https:www.mapbox.comtilemill下载TileMill,或者直接使用下载文件中Tools文件夹下的TileMill-v0.10.1-Setup.exe。使用默认设置安装TileMill。在安装TileMill时可以一并安装Mapnik。
(2)在TileMill中创建项目。
从Windows的启动菜单中,选择TileMill
Start TileMill,启动TileMill。
选择New Project创建一个新的项目,按图5.7设置新项目的基本设置,然后单击Add按钮。
图5.7 设置新项目的信息
如果是要创建遥感影像的切片,那么为了减小切片大小,可选择jpeg作为切片的格式。由于这里使用的是矢量地图,因此PNG格式更合适。
(3)设置地图背景颜色。
在项目列表中单击PhillyBasemap,进入地图编辑器中。此时地图预览显示在左边,右边显示的是CartoCSS代码。每当保存CartoCSS代码时,地图更新一次。
在CartoCSS代码窗口中,将默认的地图背景颜色修改为白色,代码如下:
Map {
background-color: #FFFFFF;
}
单击保存按钮,地图预览窗口的背景颜色立即更新为白色。
接下来,就需要增加图层并设置它们的样式。
(4)增加图层。
在TileMill窗口最左边的工具条的最下面单击图层按钮,弹出图层管理器小窗口,在该窗口中单击Add Layer按钮。该过程如图5.8所示。
图5.8 通过图层按钮打开图层管理器
单击Add Layer按钮后,弹出的是Add Layer窗口。在该窗口中,增加city_limits.shp文件作为新图层,并按图5.9设置其他参数。
图5.9 在Add Layer窗口中设置图层基本信息
TileMill通过Class与ID的概念,允许用户设置样式规则的不同颗粒度级别。例如,如果想设置所有道路的通用规则,那么可为所有道路设置一类别,即Class。如果想为某一子类型的道路(例如主干道)设置更为具体的规则,则可为该子类型使用一个ID。由于这里只需要为城市边界图层设置一个样式,因此将ID与Class设置为同样的名称来。事实上,为了方便,本实践中每个图层的ID与Class都使用相同的名称。
此外,当使用EPSG:3857投影的数据时,必须将空间参考设置为900913投影代码。前面已经介绍了这两个代码的投影是一致的。
完成设置新图层的基本信息后,单击Save Style按钮。
(5)放大到图层范围。
TileMill中默认起始视图使用的是第二级,对于费城来说,比例尺太小。需要在图层管理器中单击Zoom to
extent按钮,将地图放大到城市边界图层的范围。
(6)设置图层样式。
在CartoCSS代码窗口中使用如下代码,设置城市边界图层的样式。
#CityLimit {
line-color:#88789e;
line-width:3;
}
编辑完成后进行保存,此时TileMill界面如图5.10所示。
图5.10 设置了城市边界图层样式后的地图显示
(7)设置waterways.shp图层的样式。
在地图中增加waterways.shp图层,将其样式设置为如下代码。
#Waterways {
line-width:1;
line-color:#89aceb;
}
(8)设置natural.shp图层样式。
在地图中增加natural.shp图层,将其样式设置为如下代码。
#Natural {
[type=''park'']{
polygon-opacity:1;
polygon-fill:#ae8;
}
[type=''riverbank'']{
polygon-opacity:1;
polygon-fill:#89aceb;
}
[type=''water'']{
polygon-opacity:1;
polygon-fill:#89aceb;
}
}
从上面的代码可以看出,如果只想显示部分要素,则可增加过滤器。在natural.shp中还包含许多其他类型的的要素,上述代码指定只显示了公园、河堤与水体要素。
(9)设置Neighborhoods.shp图层样式。
在地图中增加Neighborhoods.shp,并将其样式设置为如下代码。
#Neighborhoods[zoom12] {
text-name:[NAME];
text-face-name:"Arial Black";
text-fill:#88789e;
text-size: 12;
text-character-spacing: 2;
text-transform: uppercase;
}
在上述代码中,我们只指定了文字的属性。因此社区的界线将被隐藏,只显示社区名称。
当在TileMill中标注一图层时,需要指定包含标注文本所在的字段。对于本社区图层,依据的是NAME字段来标注,因此设置了text-name:[NAME]。
此外,上述代码还使用了缩放级别过滤器,将样式的作用范围限制在特定的地图缩放级别上。在上面的例子中,样式块中定义的样式只在地图缩放到12级以上时发挥作用。
在地图预览窗口中缩放地图,确保地图缩放到12级以上时标注才显示。如图5.11所示。
图5.11 使用缩放级别过滤器
(10)设置主要道路的样式。
在地图中增加roads.shp图层,将其ID与Class都设置为MajorRoads,样式代码如下。
#MajorRoads{
[type=''motorway'']{
line-width:3;
line-color:#606060;
}
[type=''trunk'']{
line-width:3;
line-color:#606060;
}
[type=''primary''] {
line-width:2;
line-color:#838383;
}
}
上面的设置仅符号化了主要道路。在OpenStreetMap中包含了许多不同类型的道路,可以使用不同的方式进行样式化。我们这里使用的方式是,为了显示次要道路,重新加入道路图层,并将其放置在主要道路之下。这样虽然引入了一些冗余,但是代码显得很简单。
(11)设置其他道路的样式。
在地图中重新增加roads.shp图层,这次将其ID与Class都设置为Roads,样式代码如下。
#Roads[zoom12]{
line-width:1;
line-color:#b6b6b6;
}
#Roads[zoom14]{
line-width:1;
line-color:#b6b6b6;
text-name:[name];
text-face-name:"Arial
Regular";
text-fill:#838383;
text-size: 11;
text-placement: line;
text-min-path-length:100;
text-avoid-edges:true;
text-min-distance:50;
text-dy: 6;
text-max-char-angle-delta: 15;
}
当地图放大到14级以上时,将显示路名标注。
(12)设置铁路图层的样式。
在地图中增加railways.shp,其样式代码如下。
#Railroads{
line-width:1;
line-color:#d2bcb0;
}
#Railroads[zoom15] {
::line, ::hatch { line-color: #d2bcb0; }
::line { line-width:1; }
::hatch {
line-width: 4;
line-dasharray: 1, 24;
}
}
(13)调整图层顺序。
在图层管理器中,将鼠标移动到某图层行的最前面的图标上,按住鼠标左键,便可上下移动图层顺序。将地图中按图5.12调整图层顺序。
图5.12 地图中图层的顺序
至此,我们就完成了地图设计。下一步是生成地图切片。
5.5.2 输出与提取地图切片
一旦完成了地图的设计,而且地图在各个比例尺下的显示都满足要求,便可生成地图切片了。
(1)设置元切片的缓冲区大小。
为了避免重复标注以及很长的标注被截断,可以在CartCSS代码中的地图的样式增加一个设置元切片的缓冲区大小,修改后的内容如下。
Map {
background-color: #FFFFFF;
buffer-size: 512;
}
(2)选择输出地图切片的格式。
在TileMill中单击Export按钮,选择其中的MBTiles。MBTiles是MapBox的一种将整个切片存储为一个SQLite数据库的格式。我们最后需要将其解压为一个一个独立的PGN图片。
(3)设置地图切片的范围与中心点。
在左边的地图视图中,将地图放大到费城基本填充地图窗口。然后按住Shift键与鼠标左键并拖动鼠标,绘制一个覆盖费城城市边界的矩形。确保地图放大到一个合理的大比例尺下,避免创建很多周边空白的图像。
然后使用鼠标右键在地图中部单击,设置中心点。
这时地图视图如图5.13所示。
图5.13 设置地图切片的范围与中心点
(4)设置地图切片级别。
在右边的窗口中,将缩放滑动条设置为0~17,如图5.14所示。在移动滑动条时,注意观察切片数量的变换,特别是在大比例尺级别下时。
图5.14 通过缩放滑动条设置切片级别
对于其他参数不需要修改。
(5)输出地图切片。
在右边的窗口中单击Export按钮,显示View
exports窗口。在该窗口中,可观察到切片生成进度。
为了能从.mbtiles文件中提取地图切片,需要使用名为MBUtil的工具。
(6)安装MBUtil。
从https:github.commapboxmbutil下载ZIP格式的文件,或直接使用下载文件的Tools文件夹中mbutil-master.zip文件。
将其解压到一个简单路径中,例如C:\mbutil。
(7)确保已安装Python。
由于MBUtil需要Python,因此需要确定在你的计算机上是否已经安装了python.exe。可以查看是否有类似C:\Python34的文件夹。如果没有找到python.exe,则可以从python.org网站下载并安装Python。
在本实践中,假设Python的路径为C:\Python27\python.exe。如果读者使用了其他路径来安装Python,在后面的使用时,请调整为自己的python.exe所在路径。
(8)复制地图切片。
在Windows的资源管理器中,进入到文档\MapBox\export文件夹,找到PhillyBasemap.mbtiles文件,这就是地图切片。将其复制到一个简单的路径中,例如C:\Data\Philadelphia。
(9)提取地图切片。
打开一个命令提示符,输入并执行如下命令:
c:\python34\python.exe c:\mbutil\mb-util c:\data\Philadelphia\PhillyBasemap.mbtiles
c:\data\Philadelphia\ PhillyBasemap
在上面的命令行中,第一个参数是Python的路径,第二个参数是MBUtil工具的路径,第三个参数是压缩的地图切片的路径,最后一个参数是解压后切片存储的路径。读者可根据实际情况调整路径。解压缩完成后,便可在C:\Data\Philadelphia\PhillyBasemap路径中看到一系列的非压缩切片,如图5.15所示。
图5.15 解压缩后的地图切片
5.5.3 发布与测试切片
仔细查看解压缩后的地图切片,可以看到切片图像严格按照级别\列\行的方式来组织。当前绝大多数的地图API都能使用该结构,因此需要做的就是将这些切片放置到Web服务器中。对于Windows系统,在计算机中安装IIS非常简单,我们这里就以IIS为例来发布地图切片。
(1)将地图切片发布到IIS中。
将C:\Data\Philadelphia\PhillyBasemap文件夹整体复制到IIS使用的文件夹中,即C:\inetpub\wwwroot文件夹。
在网页浏览器中输入类似http:localhostPhillyBasemap15955512400.png的地址,查看是否能正确显示图片,如图5.16所示。
图5.16 直接通过地址测试地图切片
(2)使用ArcGIS.com测试地图切片。
下面可以将该地图切片服务加入到某一在线地图中,以便在地图环境中测试。这里介绍ArcGIS.com地图查看器,它是基于浏览器的Web地图制作软件。当用于试验或与公众分享地图时是免费使用的。
在浏览器地址栏中输入http:www.arcgis.comhome,然后单击创建地图连接,进入我的地图页面。在窗口的地图部分已经加入了ESRI提供的地图。
在工具栏中单击添加按钮,选择其中的从Web添加图层。如果工具栏中没有添加按钮,则需要先选择页面中右上角的修改地图。
在从Web添加图层对话框中,首先在数据类型中选择切片图层,将URL设置为http:localhostPhillyBasemap{level}{col}{row}.png。接着设置标题与制作者名单。然后单击设置切片范围按钮,在新窗口中绘制一个包含费城的矩形,并不需要精确的坐标。新图层的参数如图5.17所示。
图5.17 设置新图层的参数
最后在从Web添加图层对话框中单击添加图层按钮,返回到地图窗口中。这时地图窗口中加入的已经是我们创建的费城地图了,如图5.18所示。在地图窗口中进行放大、缩小与漫游操作,进行测试。应当可以看到地图响应速度非常快。
图5.18 利用ArcGIS.com测试地图切片
5.6 习 题
(1)阅读以下链接中的内容,深入理解元切片及其在CartoCSS中的使用:
https:www.mapbox.comtilemilldocsguidesmetatiles
(2)在TileMill中,单击左边工具条的帮助按钮,打开帮助,如图5.19所示。通过阅读帮助,深入了解CartoCSS的应用。
图5.19 TileMill中的帮助
(3)寻找5个使用切片地图作为背景的在线地图应用。对于每个地图,描述地图切片来源及其组织方式。
(4)利用在第3章习题指定收集的数据,使用TileMill与CartoCSS工具,将其发布为切片地图服务。