回答一个关于OSM技术栈的问题

      目前围绕OSM的技术很成熟了,这里介绍一下OpenStreetMap主线的一些名词,以免混淆,举例子!

      假设我是地产老板,现在开发了个小区,把以前的一片农田变成了新的道路。

1、原始数据  

     此时,有一个OpenStreetMap志愿者小狐狸恰好从这里路过,利用手持的GPS记录下了新路的轨迹。回到家,她导出了GPS,并在OSM社区上传了她的发现。这段GPS轨迹通过在线编辑,被记录进入最原始的矢量原始数据服务器。这个服务器的目的是

     1、存储完整的地理空间数据,包括贡献者、修改情况等等;

     2、不仅存储各个道路的数据,更注重道路网之间的节点,以便路由算法可以做导航计算。注意,这个行为是与后面说的渲染用矢量图元服务器最大的不同。

     与这个服务器对应的工具是osmsis,用于导入、导出数据集。

     不幸的是,地产老板修了一半就倒闭球了,最终这片地被龅牙大老板盘下来,建了个生活广场。此时,另一个志愿者小白兔登录并修改了结果,她的修改也完整的存入了矢量原始数据服务器。

     OpenStreetMap 每个小时、每天、每周会导出变更包(changeset)和镜像(full-planet export)。这个镜像中包含了所有的原始数据。对于这个生活广场而言,里面不但记录了生活广场的经纬度,还有小狐狸、小白兔的信息。

2、渲染用矢量图元服务器

      然而,原始数据库很庞大,记录了很多与呈现位图无关的字段,且为了路由算法,提供了很多额外的拓扑结构。为了方便快速制图,OSM的设计者采用了折中方案,将原始数据中与制图相关的部分整合出来,导入到一个专门供制图所用的数据库中,这个数据库就是 渲染用矢量图元服务器

     程序 osm2pgsql 负责从原始数据导出包(PBF)中析取有用的数据,存入渲染用矢量图元服务器。

3、渲染引擎

     存储在渲染用矢量图元服务器上的只是矢量数据,对应到生活广场的经纬度,表示为点、线、面。可是坐在电脑前的我是不喜欢这些东西的。于是,我想要一个 程序库,可以按照我的需求把某块区域的数据变成图片,最有名的一个程序库就是 mapnik。这个库可以根据我给的四角坐标,从数据库中 select 出来区域中的所有图元,并按照一个XML文件给定的风格(比如男厕所用烟斗图标,停车场用黑色小汽车,主干线用红色等规定),在空白的图像上画图,变成PNG。

4、瓦片栅格服务器(版本服务器)

      渲染引擎只是一个程序库,我可以每次重写一个程序,调用这个库来得到图像。然而,如果有成千上万个绘图需求,就不行了。需要一个管理机制,帮助我们:
      1、按照需求自动产生图片,并存储他们;
      2、在数据更新后,递归更新所有已有图片;
      3、迅速检索一个图片是否存在。
      这个程序是一个后台服务,叫做  renderd,开放了socket接口,供别人调用。

5、Web服务器

      可是,在远程的用户如何看到这些图片呢?我们需要一个Web服务器,以http协议返回相应的图片。这个服务器是 apache2, 实现这个功能的是 模块 mod_tile
     mod_tile 会检查本地有没有现成的缓存,有的话就返回PNG,没有的话就下命令给 renderd,立马去画。
-------------------------------------------------
     一般来说,为了支持在线编辑和路由计算,需要搭建两个服务器。如果只是为了显示,只要搭渲染服务器即可。
    最后上图:

   回答一个关于OSM技术栈的问题_第1张图片

你可能感兴趣的:(openstreetMap)