OSM数据规范、下载、解析和三维渲染

OpenStreetMap数据规范

数据模型

OpenStreetMap(以下简称osm)数据由三个基本元素组成:node, way, relation

Node代表一个经纬度坐标点;

Way是由一系列有序的node组成的线条或者封闭的面;

Relation用来组合node、way和其他relation,表达一种组合关系,比如多个way组成的一条高速公路或者公交线路;两条马路之间的转向限制;带有孔洞的多边形区域(外圈和内圈);

上述三个基本元素中都可以包含一个或多个tag标签 ;

Tag标签用于记录一切属性信息,一个tag由一个key字段和一个value字段组成,如一个way元素由一个highway=residential的tag表示这个way元素是一条连通居民区的道路。一个元素不能拥有两个key字段相同的标签。

数据格式

pbf:高度压缩优化的二进制格式,推荐用于下载和数据解析;https://wiki.openstreetmap.org/wiki/PBF_Format

xml:最原始的xml格式,https://wiki.openstreetmap.org/wiki/OSM_XML

o5m:使用pbf的编码方式,内容又与xml数据结构相同,但是支持的应用不多

Overpass JSON:仅供overpass api使用的json

Level0L:可读性强的文本格式

数据下载API

接口下载

下载特定范围(bbox)的数据,返回数据是xml格式的osm文件 https://api.openstreetmap.org/api/0.6/map?bbox=11.54,48.14,11.543,48.145
上述接口下载的速度还没有测试,毕竟是国外的服务器

网站下载

还有一些网站可以下载全球,或者分国家、分地区的osm数据,格式可以是pbf,shapefile,geojson等,但是暂时没有找到接口下载。

如果要自己维护一套osm数据的,可以考虑用先下载全球或者全国的osm数据,存入数据库,用户按需从服务器下载。

现成的数据解析代码库

Osmium(C++)

Osmium是基于C++实现的代码库

它包含一下几个模块:

  • libosmium:解析和处理osm数据的C++代码库
  • osmium-tool:基于C++代码库的命令行工具
  • PyOsmium:基于C++代码库的python接口
  • node-osmium:集于C++代码库的nodejs接口

使用Osmium你可以实现以下操作:

  • 获取osm数据的信息
  • 将osm数据转换成其他格式
  • 将osmchange 文件合并到osm文件中
  • 从osm数据中提取地理位置和区域
  • 通过tags属性标签提取特定的数据
  • 通过osm历史文件提取特定时间或时间段的数据

Osmctools(C)

Osmctools是由C编写的osm解析库,功能相对少一些,但是速度快,代码量少(官方说的)

Osmosis(Java)

Osmosis是基于Java的osm解析和转换工具,特点是支持将osm数据解析并导入Postgresql数据库中,方便服务端存储和查询。

三维渲染方法

如何解析osm中的三维属性

基本操作

  • 如果只提取三维建筑,需要从下载的osm数据中,提取所有带tag带有key值为building、 building:part或者tag为type=building的元素,它们可能是way也可能是relation。
  • 先解析出way中的顶点,建立二维多边形面。
  • 然后解析出元素中key值为height,minheight,building:levels,building:minlevel的标签(不一定都有,可能都没有,此时就需要一个默认高度)。
  • 根据提取到的height和level属性,参照下图,将二维多边形面按照高度突起 根据提取到的height和level属性,参照下图,将二维多边形面按照高度突起

进阶操作

如果要做出更逼真的建筑物,比如带带有屋顶的建筑物,或者不同材质和颜色的建筑物,可以参考这个链接里的roof和Surface color and material章节,提取相应的tag,参数化建模。

基于OSM数据参数化建模的相关应用

OSM2World:一个Java应用,导入osm,生成三维场景,包括带有屋顶颜色的建筑物、草地、体育场、森林、道路、桥梁和河流等景观,虽然建模结果简单而且难看,但是该有的都有了。可以导出obj格式模型。(开源)

BlenderOSM:一款Blender的建模插件,同样是导入osm,生成三维场景,建模效果比OSM2World强一点,功能基本一样。(半开源,有一个付费版)

CityEngine:CityEngine有一个针对osm数据建模的模板,建筑物模型可以贴图,但是其他效果和上面的差不多;道路建模的效果比上面两个强太多。(商用)

其他获取白模的方法

Mapbox的vector-tile数据是切片化、带LOD的矢量图形,图形中带有building属性和height属性,相对于osm数据的复杂结构,mapbox的vector-tile简单很多,而且mapbox在中国的服务器节点多一点,速度快一点。缺点是数据已经经过切片丢失了完整性(可能会出现同一个楼被切到两个瓦片中),也没有屋顶、颜色和材质等属性;另外商用mapbox数据可能要收费。

参考链接

https://wiki.openstreetmap.org/wiki/Develop

浙ICP备16041529号-1