聊聊OSM

做路网的同学一定对OSM并不陌生,OSM是一个由英国人Steve Coast创立的一个项目,这个项目的目标是创建一个内容自由,且能让所有人编辑的世界地图。类似于维基百科的概念。和它对标的是谷歌的google map。google map是谷歌提出的电子地图服务。它是收费的。且并不提供友善的可以提供给所有人编辑的地图服务。

OSM最值得称道的是它的语义结构,设计的非常简单,但是却非常通用,我们可以很方便的使用这个语义结构来定义我们需要的路网。

语义结构

OSM 仅仅定义了四个语义结构,node, way, relation, tag。 基本思想是一个路网是可以使用点和线来进行划分的。如果有更为宏观的信息需要展示,就使用 relation 来进行展示。而每种元素的属性都可以使用tag进行无限延生。

node表示的最重要的属性是地理位置坐标。它表示的是一个点。

way是由一系列有序的node组成的,它可以表示三种结构(非闭合线,闭合线,区域)。非闭合线,通常用来表示道路,河流,铁路等。闭合线,通常可以用来表示环形的东西,比如地铁等。区域,表示一个真实闭合的区域。

relation 是由一系列的node,way,和其他的relation组合而成。它的作用其实比较大,比如,在路网里面,我用node和way画了一个路网,现在我想要画公交车121的路线,那么就可以使用relation来进行绘画。当然,如果你要表示的地图并不想有这样的信息,这个relation是可以不画的。

node, way, relation就相当于是地图世界中的三原色,使用这三个元素理论上能绘制出所有你需要的地图。当然,这三个元素也有对应的属性,比如你这个way叫做“后厂村路”。那么这个名字就是一个属性。这里OSM抽象出了tag 概念,tag是key, value的组合。所以它可以无限延展。

三原色也有一些公用的属性。

  • user 最后修改/创建这个对象的用户
  • uid 最后修改/创建这个对象的用户id
  • timestamp 最后修改/创建这个对象的时间
  • visible 这个对象是否要在地图中显示出来
  • version 最后修改/创建这个对象的版本号
  • changeset 这个节点的最后修改/创建这个对象的所在的changeList ID,这个和version不一样,version是每个对象自带的,changeset是全局的。

如果你使用过git,那么这个和git就很像了。当地图在开放的时间,一些人补充上了一些变动,如果平台每天收集,那么这些变动就会生成一个changeset。https://www.openstreetmap.org/history 这个地址告知了你指定的区域有哪些changeset。

例子

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <osm version="0.6" generator="CGImap 0.0.2">
  3. <bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
  4. <node id="298884269" lat="54.0901746" lon="12.2482632" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
  5. <node id="261728686" lat="54.0906309" lon="12.2441924" user="PikoWinter" uid="36744" visible="true" version="1" changeset="323878" timestamp="2008-05-03T13:39:23Z"/>
  6. <node id="1831881213" version="1" changeset="12370172" lat="54.0900666" lon="12.2539381" user="lafkor" uid="75625" visible="true" timestamp="2012-07-20T09:43:19Z">
  7. <tag k="name" v="Neu Broderstorf"/>
  8. <tag k="traffic_sign" v="city_limit"/>
  9. </node>
  10. ...
  11. <node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
  12. <way id="26659127" user="Masch" uid="55988" visible="true" version="5" changeset="4142606" timestamp="2010-03-16T11:47:08Z">
  13. <nd ref="292403538"/>
  14. <nd ref="298884289"/>
  15. ...
  16. <nd ref="261728686"/>
  17. <tag k="highway" v="unclassified"/>
  18. <tag k="name" v="Pastower Straße"/>
  19. </way>
  20. <relation id="56688" user="kmvar" uid="56190" visible="true" version="28" changeset="6947637" timestamp="2011-01-12T14:23:49Z">
  21. <member type="node" ref="294942404" role=""/>
  22. ...
  23. <member type="node" ref="364933006" role=""/>
  24. <member type="way" ref="4579143" role=""/>
  25. ...
  26. <member type="node" ref="249673494" role=""/>
  27. <tag k="name" v="Küstenbus Linie 123"/>
  28. <tag k="network" v="VVW"/>
  29. <tag k="operator" v="Regionalverkehr Küste"/>
  30. <tag k="ref" v="123"/>
  31. <tag k="route" v="bus"/>
  32. <tag k="type" v="route"/>
  33. </relation>
  34. ...
  35. </osm>

这个是osm wiki上摘抄出来的例子。我们可以看到,这个例子已经包含了所有的定义。它表达了在

  1. <bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>

这个矩形框范围内的4个node,一个way, 还有一个relation。这个relation表达的就是Küstenbus Linie 123公交交通工具的线路。

我们从上面例子也看出,OSM描述自己的语言是选择XML,XML是一种清晰且易于人类解读的结构。OSM输出的XML文件通常以.osm后缀。这个文件现在已经被多种工具所适配。OSM的schema如下:https://wiki.openstreetmap.org/wiki/API_v0.6/XSD

比如最常用的qgis 和 arcgis 都支持直接使用osm文件导入进行编辑的功能。

OSM(openstreetmap)矢量数据下载方法(路网,水系,铁路,建筑物)这篇文章展示了各种用osm绘制的地图。

当然,OSM只是描述了地图的路网,而在绘制地图的时候,地图的底图需要使用地图底图提供商的服务,比如mapbox。

OSM的生态也非常好,比如不用百度API也能计算驾驶距离——OSMnx计算多点驾车距离 使用的是OSM的数据,以及python的osmnx包,直接提供了计算最短路径的服务。

OSM存储在数据库中一般使用POSTGIS(http://blog.geoserver.org/2009/01/30/geoserver-and-openstreetmap/)它会创建几张表:

  • planet_osm_line
  • planet_osm_point
  • planet_osm_polygon
  • planet_osm_roads

聊聊OSM的更多相关文章

  1. 聊聊GIS中的坐标系|再版

    本文约6500字,建议阅读时间15分钟. 作者:博客园/B站/知乎/csdn/小专栏 @秋意正寒 版权:转载请告知,并在转载文上附上转载声明与原文链接(https://www.cnblogs.com/ ...

  2. 聊聊Unity项目管理的那些事:Git-flow和Unity

    0x00 前言 目前所在的团队实行敏捷开发已经有了一段时间了.敏捷开发中重要的一个话题便是如何对项目进行恰当的版本管理.项目从最初使用svn到之后的Git One Track策略再到现在的GitFlo ...

  3. Mono为何能跨平台?聊聊CIL(MSIL)

    前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...

  4. fir.im Weekly - 聊聊 Google 开发者大会

    中国互联网的三大错觉:索尼倒闭,诺基亚崛起,谷歌重返中国.12月8日,2016 Google 开发者大会正式发布了Google Developers 中国网站 ,包含了Android Develope ...

  5. 聊聊asp.net中Web Api的使用

    扯淡 随着app应用的崛起,后端服务开发的也越来越多,除了很多优秀的nodejs框架之外,微软当然也会在这个方面提供更便捷的开发方式.这是微软一贯的作风,如果从开发的便捷性来说的话微软是当之无愧的老大 ...

  6. 没有神话,聊聊decimal的“障眼法”

    0x00 前言 在上一篇文章<妥协与取舍,解构C#中的小数运算>的留言区域有很多朋友都不约而同的说道了C#中的decimal类型.事实上之前的那篇文章的立意主要在于聊聊使用二进制的计算机是 ...

  7. [原]在GeoServer中为OpenStreetMap数据设置OSM样式

    转载请注明作者think8848和出处(http://think8848.cnblogs.com) 在前面几篇文章中,我们讲到了部署Postgresql,部署PostGis,部署GeoServer以及 ...

  8. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  9. 聊聊 Apache 开源协议

    摘要 用一句话概括 Apache License 就是,你可以用这代码,但是如果开源你必须保留我写的声明:你可以改我的代码,但是如果开源你必须写清楚你改了哪些:你可以加新的协议要求,但不能与我所 公布 ...

随机推荐

  1. HTML5 & MUI 界面样式

    垂直居中+自动换行 样式效果如下所示,当文字没有超出一行时,显示如“备注信息”,当文字超出一行时,显示如“维修地点” HTML代码如下: <div class="mui-input-r ...

  2. version.go

    package blog4go const ( // 版本号 VERSION = "0.5.6" )

  3. BZOJ_2595_[Wc2008]游览计划_斯坦纳树

    BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...

  4. 虚拟机console基础环境部署——系统基础环境

    1. 概述2. 工具类安装2.1 安装vim2.2 安装tree2.3 安装expect2.4 安装lsof3. 编译环境类安装 1. 概述 本系列博客是在最小化安装CentOS6.5的基础上,通过配 ...

  5. 关于” 记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引” 这篇博客相关的优化采坑记录

    之前写过一篇博客是关于记录日志的简单方式的   主要就是  应用->redis->logstash->elasticsearch 整个流程的配置方法和过程的 虽然我们部分线上应用使用 ...

  6. Promise原理—一步一步实现一个Promise

    promise特点 一个promise的当前状态只能是pending.fulfilled和rejected三种之一.状态改变只能是pending到fulfilled或者pending到rejected ...

  7. 详解线程池execute和submit用法

    在使用线程池时,我们都知道线程池有两种提交任务的方式,那么他们有什么区别呢? 1.execute提交的是Runnable类型的任务,而submit提交的是Callable或者Runnable类型的任务 ...

  8. Docker 快速开始

    1.  概念 对于开发人员和系统管理员来说,Docker是一个使用容器开发.部署和运行应用程序的平台.使用Linux容器部署应用程序称为容器化.容器并不新鲜,但是将它们用于轻松部署应用程序却很新鲜. ...

  9. SQL优化指南

    慢查询日志 开启撒网模式 开启了MySQL慢查询日志之后,MySQL会自动将执行时间超过指定秒数的SQL统统记录下来,这对于搜罗线上慢SQL有很大的帮助. SHOW VARIABLES LIKE 's ...

  10. 第一次上机,HTML静态网页的开发

    <html> <head> <title>第一次上级,cyy</title> </head> <body> <h3 ali ...