9.4.3 地图工具
地图生成是Web上最困难的任务之一。Google Maps的出现完全颠覆了过去人们对在线地图功能的认识。而Google发布的Maps API则让所有的开发者都能在自己的网站中植入地图功能。
近年来,在线地图的市场成熟了很多,如果需要在数据可视化项目中植入定制化的地图方案,目前市场上已经有很多选择,但是知道在何时选择何种地图方案则成了一个很关键的业务决策。地图方案看上去功能都很强大,但是切记:“有了一把锤子,看什么都像钉子。”
1.Modest Maps
顾名思义,Modest Maps是一个很小的地图库,只有10KB大小,是目前最小的可用地图库。这似乎意味着Modest Maps只提供一些基本的地图功能,但是不要被这一点迷惑了。在一些扩展库的配合下,Modest Maps立刻会变成一个强大的地图工具。
Modest Maps是一套基于AS 3.0(ActionScript 2.0与ActionScript 3.0)Script与Python脚本开发出来的一套类库,是遵循BSD许可协议(参见Unix知识)在Falsh里进行地图显示与用户交互的,如图9.27所示。
开发本类库的目的是为初学的设计者与开发人员提供一个最轻量级的、可扩展的、可定制的和免费的地图显示类库,这个类库能帮助开发人员在他们自己的项目里能够与地图进行交互。Modest Maps不能提供默认的物理标识的现实,不能提供默认的按钮进行缩放于评议的操作,不能提供额外的api能够进行商业区搜索与数据库查找功能等。但是其仍然在扩展库的配合下能够实现诸多的功能。

图9.27 Modest Maps生成地图(以世界地图为例)
2.Leaflet
Cloud Made团队为大家带来了Leaflet(如图9.28所示),这是另外一个小型化的地图框架,通过小型化和轻量化来满足移动网页的需要。Leaflet和Modest Maps都是开源项目,有强大的社区支持,是在网站中整合地图应用的理想选择。

图9.28 Leaflet
Leaflet是一个为建设移动设备友好的互动地图而开发的现代的、开源的Javascript库。它是由Vladimir Agafonkin带领一个专业贡献者团队开发,虽然代码仅有33 KB,但它具有开发人员开发在线地图的大部分功能。
Leaflet设计坚持简便、高性能和可用性好的思想,在所有主要桌面和移动平台能高效运作,在现代浏览器上会利用HTML5和CSS3的优势,同时也支持旧的浏览器访问。支持插件扩展,有一个友好的、易于使用的API文档和一个简单的、可读的源代码。
3.Poly Maps
Polymaps是另外一个地图库,但主要面向数据可视化用户。Polymaps在地图风格化方面有独到之处,类似CSS样式表的选择器,是不可错过的好东西。
Polymaps是一个JavaScript库,用于生成Google Maps、Modest Maps、Cloud Made和Open Layers风格的“slippy4”地图,如图9.29所示。
(https://www.daowen.com)
图9.29 Poly Maps地图展示
大多数地图库专注于256×256像素的图像切片,这样对于动态叠加(如村庄的边界和点云)的支持有限。这些类库都将生成叠加层所需的数据一次性地加载到内存中,从而难以可视化大型数据集。此外,当进行增大或者缩小操作时,地图切片(map tile)分辨率会自动调整,可是叠加分辨率仍然不变,这极大地限制了数据的多尺度探索,因为必须针对宏观(如状态级别)或微观(如块级别)观察来确定分辨率。
Polymaps的目标是通过将地图切片扩展到矢量图形来更好地支持交互式地图丰富的大规模数据叠加,除标准地图切片外,Polymaps还支持使用SVG渲染的矢量切片。
4.Open Layers
Open Layers是一个用于开发WebGIS客户端的Javascript包。Open Layers支持的地图来源包括Google Maps、Yahoo Map、微软Virtual Earth等,用户还可以用简单的图片地图作为背景图,与其他的图层在Open Layers中进行叠加,在这一方面Open Layers提供了非常多的选择。除此之外,Open Layers实现访问地理空间数据的方法都符合行业标准。Open Layers支持Open GIS协会制定的WMS(web mapping service)和WFS(web feature service)等网络服务规范,可以通过远程服务的方式,将以OGC服务形式发布的地图数据加载到基于浏览器的Open Layers客户端中进行显示。Open Layers采用面向对象的方式开发,并使用来自Prototype.js和Rico中的一些组件。
Open Layers是一个专为Web GIS客户端开发提供的Javascript类库包,用于实现标准格式发布的地图数据访问,如图9.30所示。从Open Layers 2.2版本以后,Open Layers已经将所用到的Prototype.js组件整合到了自身当中,并不断在Prototype.js的基础上完善面向对象的开发,Rico用到的地方不多,只是在Open Layers.Popup.AnchoredBubble类中圆角化DIV。Open Layers 2.4版本以后提供了矢量画图功能,方便动态地展现“点、线和面”这样的地理数据。
在操作方面,Open Layers除可以在浏览器中帮助开发者实现地图浏览的基本效果(比如放大、缩小、平移等常用操作)外,还可以进行选取面、选取线、要素选择、图层叠加等不同的操作,甚至可以对已有的Open Layers操作和数据支持类型进行扩充,为其赋予更多的功能。例如,它可以为Open Layers添加网络处理服务WPS的操作接口,从而利用已有的空间分析处理服务来对加载的地理空间数据进行计算。同时,在Open Layers提供的类库当中,它还使用了类库Prototype.js和Rico中的部分组件,为地图浏览操作客户端增加Ajax效果。

图9.30 Open Layers展示Bing Maps
5.Kartograph
Kartograph的标记线是对地图绘制的重新思考,我们都已经习惯了莫卡托投影(Mercator projection),但是Kartograph为我们带来了更多的选择。如果不需要调用全球数据,而仅仅是生成某一区域的地图,那么Kartograph将脱颖而出,其展示效果如9.31所示。

图9.31 Kartograph生成地图展示
6.CartoDB
CartoDB是一个不可错过的网站,用CartoDB可以很轻易地就把表格数据和地图关联起来。例如,可以输入CSV通信地址文件,CartDB能将地址字符串自动转化成经度/维度数据并在地图上标记出来,如图9.32所示。目前,CartoDB支持免费生成五张地图数据表,更多使用需要支付月费。

图9.32 CartoDB生成地图展示