2012年更新
经过从2008年以来对OSM的研究与利用,越来越发现OSMGIS的活跃、开放是非常引人注目的事情。尽管缺乏像ARCGIS这样强大的中间服务的支持,其庞大的原始数据集合本身就是一笔可观的财富。
1、硬件准备
经过测试,导入2012年1月世界范围数据要耗费 200GB以上的磁盘。在拥有8GB存储器、1TB磁盘阵列的服务器上需要近1周的时间(Postgresql Shared-Mem 512MB,Work Mem 1024MB,Maintain 512MB),且虚拟机与 Postgresql服务器并不在同一机器。(数据库服务器要求专用,才能发挥最好效果) 。
2、网络地图
Planet.OSM( Open Street Map) 计划是开放源代码的GIS应用,目前经过全世界热心同仁的更新,其底层数据的质量明显提升,精度、数据量均不错。其地图通过网址http://www.openstreetmap.org 可以直观访问,但国内比较慢。不仅如此,如果能够接入Internet,可以方便的使用其API,支持包括移动设备在内的多种服务。
http://wiki.openstreetmap.org/wiki/Planet.osm 介绍了她的详细情况。
3、什么情况下需要自己搭建服务器
这次,我们要讨论的是在公司内部的专用网路上,如何搭建像模像样的 OSM 服务器。适用的范围:
a、公司内部网络限制了上网,但又需要GIS应用的地方
b、需要订制 GIS 应用的地方
c、需要携带到边远地区的便携式计算机上的情况。
4、osm 简介
OSMGIS 由矢量原始数据服务器、渲染用矢量图元服务器、渲染引擎、瓦片栅格服务器、瓦片版本服务器、Web服务器组成。
矢量原始数据服务器内存储的是信息完整的矢量数据。 OSMGIS 的底层数据由点、线、面等基本图元构成,这些含有属性(地名等)的几何元素以 XML 格式定期在网站发布:
ftp://ftp.spline.de/pub/openstreetmap/
这些XML格式的图元来自工具"osmosis"导出Postgresql数据库的镜像, 这个工具的说明见:
http://wiki.openstreetmap.org/wiki/Osmosis
Postgresql数据库中的图元对象在 PostGIS的支持下形成供世界各地用户不断完善的数据集。
渲染用矢量图元服务器、渲染引擎
由于数据本身都是字符串格式的,无法直接进行显示。为此,有不少中间件(渲染引擎)被设计出来,用于把数据库中的字符图元变成可以浏览的图像,其中最著名的就是 Mapnik。 渲染用矢量图元服务器存放渲染需要的图元的几何信息,数据来自原始数据导出的XML文件,但仅仅导入渲染需要的部分,损失了几何联通等关系信息。像加权最短路径等算法必须使用原始数据。
Ubuntu上的Mapnik渲染引擎是一个C++库,通过绑定在Python上,提供了简便的接口,只要给出生成图像的比例尺、范围,即可生成png,jpg,gif等格式的图像。Mapnik使用XML文件定制图层,每个图层包含一串sql语句,以及显示格式定义。比如公路图层就是 select * from 数据表 where 类型=省级公路,数据用蓝色、9号字显示之类的片段。把一个个图层定义集中起来,放在叫做 OSM.XML的文件里,我们修改这个文件,即可改变渲染的风格。
瓦片栅格服务器
为了方便在Web上传输、显示,把世界地图存储为 256 * 256 的一张张贴图,一级比例尺只包含1张(2^0),2级包含 2*2 =4张(2^2),3级为 4*4 = 16张(2^4),4级为8*8=64,2^6张,...直到19级 (2^36) ,包含 这些按照级别、行、列编号的图片被称为“Tile”,就是瓦片。从上面的规模看出,把19级包含的全部瓦片渲染、存储在服务器上是不可能的,实际应用中,仅存储用户访问过的地方。至于大片海洋和荒原,不去渲染。
瓦片版本服务器
由于原始数据每天都在更新,所以瓦片也需要不断更新,以体现背后数据的编辑状态。瓦片版本服务器存储了各个瓦片生成时的矢量数据版本,如果矢量数据被编辑,版本服务器会自动定期重新渲染那些过时的瓦片。
Web服务器
这个不多说了,展现给用户一个 AJAX的网页,还有一套交互协议(API),我不熟悉啊,有兴趣的何以参考资料。
综上,OSM系统 的底层数据存储在Postgresql服务器中,其服务端定期使用 osmosis 导出XML镜像(或者二进制PBF);为了使矢量数据可视化,人们发明了Mapnik之类的渲染器。由于渲染工作极端占用资源,专门设置了渲染用矢量服务器,仅存储渲染所需的数据;渲染器按照给出的比例尺、范围、图层定义文件OSM.XML把矢量数据画成图;为了节省带宽、提高效率,人们按256*256为单位分割管理栅格数据,按需渲染、定期更新;一组WebService用于提供服务、支持浏览、在线编辑。
5、其他知识
投影系
OSM 与 Google-Map 同样采用摩卡托(http://en.wikipedia.org/wiki/Mercator_projection)投影系,这种投影是保角投影,南北极附近是奇异点,无法显示,也算是他的一大缺陷了。
Postgresql与PostGIS
Postgresql 是一种对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大、特性最丰富和最复杂的自由软件数据库系统。它起源于伯克利(BSD)的数据库研究计划,目前是最重要的开源数据库产品开发项目之一, 有着非常广泛的用户。PostGIS在对象关系型数据库Postgresql上增加了存储管理空间数据的能力,相当于Oracle的spatial部分。PostGIS最大的特点是符合并且实现了OpenGIS的一些规范,是最著名的开源GIS数据库。
6、需求牵引的简化搭建步骤
对于仅需要地图作为底图的应用,搭建渲染用原始数据服务器、渲染引擎即可,至于瓦片直接用Python脚本生成。如果需要编辑矢量数据、实现API,建议参考国外的资料(完整系统搭建),直接签出别人弄好的代码。
数据导入与基本设置
渲染用数据服务器搭建, 老外已经写得不能再详细了:http://switch2osm.org/serving-tiles/manually-building-a-tile-server/
weait 上的资料不知道怎么了,打不开了。
前一段时间由于工作很忙,没有时间继续研究了。前面也是浅尝辄止一下,发现以前的参考资料很多不能访问了。现在把网址集中说一下:
a、数据: 点击打开链接http://wiki.openstreetmap.org/Planet.osm
b、区域数据:点击打开链接http://download.bbbike.org/osm/
可以自己选择区域下载(第三项),很方便
c、地图XML格式介绍:点击打开链接http://wiki.openstreetmap.org/wiki/OSM_XML
汉化与地名处理
OSMGIS数据是万国语言版的,建议使用世界地名大辞典进行自动汉化。我的做法是下载
http://download.csdn.net/detail/goldenhawking/4556453
导入到GIS库,而后写程序用正则式模糊匹配替换。别忘了新建一个字段,备份老的name
实现外围程序
客户端有很多实现方法,如果只是作为底图,则原理很简单,通过读取特定比例尺下的瓦片,在屏幕上拼接显示。对没有渲染的瓦片,登记入数据库,由渲染程序生成。这里在Ubuntu 11.10 下,采用 mapnik 0.7 (现在出了2.0,但是由于图层定义文件还是0.7的,所以没有采用)搭建了虚拟机。由于是底图需求,连webservice 也是用fcgi写的短小的几十行代码,所有功能就是看看目录里有没有请求的瓦片,有的话返回数据,没有就在版本数据库(也是最傻的)记一下,返回一个“瓦片正在渲染”的白矩形。
比较复杂的是客户端,从底层实现标图、量测和使用ARCGIS之类的强大服务完全不同,很考验对架构的把握。下面晒一晒我写的外围程序。