创建自己的 OSM.Planet 街道级别地图服务器,汉化地名避免万国语

来源:互联网 发布:java编程思想txt 编辑:程序博客网 时间:2024/04/28 21:47

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://www.hyperionreactor.net/blog/how-build-your-own-osm-server-part-1-postgis-and-mapnik

     完整小系统: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://www.5inet.net/View/2839671

    导入到GIS库,而后写程序用正则式模糊匹配替换。别忘了新建一个字段,备份老的name

    实现外围程序

   客户端有很多实现方法,如果只是作为底图,则原理很简单,通过读取特定比例尺下的瓦片,在屏幕上拼接显示。对没有渲染的瓦片,登记入数据库,由渲染程序生成。这里在Ubuntu 11.10 下,采用 mapnik 0.7 (现在出了2.0,但是由于图层定义文件还是0.7的,所以没有采用)搭建了虚拟机。由于是底图需求,连webservice 也是用fcgi写的短小的几十行代码,所有功能就是看看目录里有没有请求的瓦片,有的话返回数据,没有就在版本数据库(也是最傻的)记一下,返回一个“瓦片正在渲染”的白矩形。

    比较复杂的是客户端,从底层实现标图、量测和使用ARCGIS之类的强大服务完全不同,很考验对架构的把握。下面晒一晒我写的外围程序。

设置好共享文件夹后再开机哦

客户端(windows)

 

客户端(Ubuntu, QT)

 

渲染器外壳


原创粉丝点击