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

版权声明:本文为博主原创文章,转载时请注明 http://blog.csdn.net/goldenhawking https://blog.csdn.net/goldenhawking/article/details/6402775

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之类的强大服务完全不同,很考验对架构的把握。下面晒一晒我写的外围程序。

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

客户端(windows)

 

客户端(Ubuntu, QT)

 

渲染器外壳

阅读更多

在公司内网上创建自己OSM.Planet 街道级别地图服务器及其客户端程序

08-28

转自我的BLOG http://blog.csdn.net/goldenhawking/article/details/6402775rn 最近经过陛下点拨,涉猎了“OpenStreetMap”,做了不少业余研究,把成果给大家分享一下,特别是提供搭建好的客户端-服务器框架,以及中国国内的OSM开放地图范例。rnrn rnrn为什么只有中国的??rnrn rnrn 原因很简单, 由于导入世界范围数据要耗费 100GB以上的磁盘。经过我亲自测试,如果需要导入世界数据的话,在拥有4GB存储器、1TB磁盘阵列的HP 8核服务器上需要近1周的时间(PostgreSQL Shared-Mem 128MB, Work Mem 512MB, Maintain 512MB),且虚拟机与 PostgreSQL服务器并不在同一机器。(数据库服务器要求专用,才能发挥最好效果) 。rnrn 尽管提供的仅是导入中国国内数据的范例服务器, 但是您可以从网站下载完整镜像(2011年4月的约16GB),而后导入本范例的服务器,即可立刻拥有世界范围的数据访问。在导入之前请详细阅读光盘中的文档,特别是 rn 1、确保PostgreSQL 的资源充分rn 2、确保导入期间PostgreSQL 的"autovacuum" 已经关闭。rn 3、确保不要断电rnrn rnrn我创建的完整范例镜像链接(尽量保持开机上传,请大家有耐心!虚拟机所有口令全部是 1234567, 包括开机和数据库管理员。数据库渲染用户osmrender,口令osmrender):rnrnrned2k://|file|Planet.OSM_Server_and_Client_by_goldenhawking(OSM%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E8%8C%83%E4%BE%8B%E5%AE%A2%E6%88%B7%E7%AB%AF).iso|4132896768|F6F5774B8E2FD4032F997523FB7BC097|h=PNZKU5WEIGMUUCOQSLFE2EOWMZCXORAL|/rnrn rnrn说明和截图:rnrned2k://|file|Planet.OSM_Server_and_Client_by_goldenhawking(OSM%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%8F%8A%E8%8C%83%E4%BE%8B%E5%AE%A2%E6%88%B7%E7%AB%AF).iso.%E8%AF%B4%E6%98%8E%E5%92%8C%E6%88%AA%E5%9B%BE.rar|619839|32DD6E70287DFEE35E77F77DACF23EEB|h=QBAQ6QZNPOBDP4KL2ZGMD2L5ST5C44LP|/ rnrn rnrn Planet.OSM( Open Street Map) 计划是开放源代码的GIS应用,目前经过全世界热心同仁的更新,其底层数据的质量明显提升,精度、数据量均不是小打小敲的商业地图应用可比拟的(比GoogleMap等还是要朴素)。其地图通过网址 http://www.openstreetmap.org 可以直观访问。不仅如此,如果能够接入Internet, 可以方便的使用其API,支持包括移动设备在内的多种服务。rn http://wiki.openstreetmap.org/wiki/Planet.osm 介绍了她的详细情况。这次,我们要讨论的是在公司内部的专用网路上,如何搭建像模像样的 OSM 服务器。适用的范围:rn 1、公司内部网络限制了上网,但又需要GIS应用的地方rn 2、需要订制 GIS 应用的地方rn 3、需要携带到边远地区的便携式计算机上的情况。rnrn 由于是轻量级的应用,我不实现完整的API, 只是注重显示、运用地图本身作为底图。rnrn rnrn1、osm 体系一分钟介绍rn 在开始之前,有必要介绍一下OSM的体系。(看过英文资料 http://wiki.openstreetmap.org/wiki/Planet.osm的可以略过)。OSMGIS 的底层数据由点、线、面等基本图元构成,这些含有属性(地名等)的几何元素以 XML 格式定期在网站发布: rn ftp://ftp.spline.de/pub/openstreetmap/rn 这些XML格式的图元来自工具"osmosis"导出PostgreSQL数据库的镜像, 这个工具的说明见:rn http://wiki.openstreetmap.org/wiki/Osmosisrn PostgreSQL数据库中的图元对象在 PostGIS的支持下形成供世界各地用户不断完善的数据集。然而,数据本身都是字符串格式的,无法直接进行显示。为此,有不少中间件(渲染引擎)被设计出来,用于把数据库中的字符图元变成可以浏览的图像,其中最著名的就是 Mapnik。 本次,我们采用Ubuntu上的Mapnik作为渲染引擎。 Mapnik 本身是一个C++库,通过绑定在Python上,提供了简便的接口,只要给出生成图像的比例尺、范围,即可生成png,jpg,gif等格式的图像。rnrn rnrn rnrn2、投影系rn OSM 与 Google-Map 同样采用摩卡托(http://en.wikipedia.org/wiki/Mercator_projection)投影系,这种投影是保角投影,南北极附近是奇异点,无法显示,也算是他的一大缺陷了。第0级比例尺全世界地图被承载在 256 * 256 大小的图片上,第1级比例尺为 512*512, 分为 两行、两列256*256的图片。第2级比例尺为 1024*1024,即4*4=16个256*256的图片...以此类推, 每一级拥有 2^n 行, 2^n 列个瓦片组成,左上角编号为0,0,右下角为 2^n-1,2^n-1. 具体编号参见更多资料。rnrn rnrn3、详细搭建方法rn 老外已经写得不能再详细了,见http://weait.com/content/build-your-own-openstreetmap-server, 直接按照他说的做,准OK!rnrn rnrn4、网页服务与客户端程序rn 客户端有很多实现方法,这里给出的是 Windows 下的 VC++ 2008/2010的工程。原理很简单,通过读取特定比例尺下的瓦片,在屏幕上拼接显示。对没有渲染的瓦片,登记入数据库,由渲染程序生成。范例中演示的比较简单,希望起到抛砖引玉的效果!rnrn rnrn注意: 所有口令都是1234567,确保VMWare 共享文件夹可用!光盘中附带了VM软件!界面:rnrn[img=http://hi.csdn.net/attachment/201105/8/0_1304820345wZ93.gif][/img]rn[img=http://hi.csdn.net/attachment/201105/8/0_1304820339CEaK.gif][/img]rn[img=http://hi.csdn.net/attachment/201105/8/0_1304820330ppHh.gif][/img]rn[img=http://hi.csdn.net/attachment/201105/8/0_1304820334L4q5.gif][/img]rn

没有更多推荐了,返回首页