介绍
OpenStreetMap(OSM)是一个由志愿者创建并维护的免费和开源的地图数据库。其目的是为全球任何人提供可自由使用、编辑和分发的地图数据。OpenStreetMap数据库中的地理要素包括道路、建筑、河流、森林、山脉、公共设施等。由于OpenStreetMap是开放的平台,任何人都可以添加新的地理信息,从而使其不断发展和更新。OpenStreetMap已经成为诸如Google地图等商业地图的一个重要替代品。
疫情这三年来,OpenStreetMap上的用户和上传的数据又是爆炸式的增长,有越来越多有用的信息可以供大家使用和挖掘。
我们可以看下OpenStreetMap的数据统计报告,具体链接可以查看https://wiki.openstreetmap.org/wiki/Stats?spm=a2c6h.12873639.article-detail.6.3c354ac5SIXVmR#Registered_users_statistics_reports,我分别贴了两张图,一张图是注册用户数增长曲线,一张图是录入的数据增长曲线,足以看得出来越来越多的数据在加入其中。
数据结构
OSM uses a topological data structure with four core elements.
上面翻译过来就是:osm使用拓扑类型的数据结构,基于四种核心的元素。
1. Nodes: 点,带有经纬度的信息。Nodes are points with a geographic position, stored as coordinates(pairs of a latitude and a longitude).
2. Ways: 路径,由一系列有顺序的Nodes列表组成,表现形式可以为折线或者封闭的多边形。Ways are ordered lists of nodes, representing a polyline, or possibly a polygon if they form a closed loop.
3. Relations: 关系,由Nodes, Ways,其他Relations组合而成的。 Relations are ordered lists of nodes, ways and relations(together called “member”.
4. Tags: 一个键值对。Tags are key-value pairs
数据格式
我们现在就去down一份数据下来看看具体的数据格式是什么样子的。osm的数据有很多源可以去下载,我选择了下面的源
Geofabrik Download Server 这个网站上定期更新的洲、 国家和特定城市数据库,格式包括OSM XML、OSM PBF、ESRI Shape文件等
选择美国一个州的数据来下载,如下图,这个网站比较好的地方就是可以在选择某个州可以预览大概的区域范围(图中两个箭头标注)
随便找一个.bz2的小文件下载下来即可,(pbf文件类型具体的格式可以暂时不用深入了解,只把它当做是压缩率更好的xml文件即可)
我们将下载下来的bz2文件解压缩,就可以得到.osm尾缀的文件,如下图
使用文本编辑器打开.osm文件,就可以看到具体的内容
我们使用下面这段范例来解释下各种数据类型
<?xml version='1.0' encoding='UTF-8'?>
<osm version="0.6" generator="osmium/1.14.0">
<bounds minlat="38.45043" minlon="-75.78974" maxlat="40.03221" maxlon="-74.96121"/>
<node id="75390099" version="11" timestamp="2023-01-22T00:03:05Z" lat="39.7221284" lon="-75.7886029">
<tag k="description" v="Lat-Long (NAD27) N39°43'26.3" W75°47'19.9" UTM (NAD27) 18S 432415 4397212 UTM (WGS84) 18S 432391 4397420"/>
<tag k="man_made" v="survey_point"/>
<tag k="name" v="Tri-State Marker"/>
</node>
<way id="11749873" version="4" timestamp="2012-09-21T05:23:27Z">
<nd ref="105203702"/>
<nd ref="105203705"/>
<tag k="highway" v="track"/>
</way>
<relation id="117172" version="5" timestamp="2020-06-19T22:26:18Z">
<member type="way" ref="33502448" role="outer"/>
<member type="node" ref="157622606" role="admin_centre"/>
<tag k="name" v="Townsend"/>
<tag k="type" v="boundary"/>
<tag k="boundary" v="administrative"/>
<tag k="wikidata" v="Q755689"/>
<tag k="wikipedia" v="en:Townsend, Delaware"/>
<tag k="admin_level" v="8"/>
<tag k="border_type" v="town"/>
</relation>
</osm>
line1:OSM的原始数据保存在xml格式的文件中,所以第一行声明的即为xml格式的数据
line2:OSM定义,所有的数据都是包含在<OSM></OSM>标签内
line3:声明这份OSM的数据所包含的地图区域范围
line4:nodes类型的节点,带有经纬度坐标的信息,nodes相关的数据都包含在<node></node>标签内,此标签内含有多个tag的数据,tag中包含了这个点的名字和描述等信息
line9:ways类型的节点,ways相关的数据都包含在<way></way>标签内,此标签内包含了两个nodes类型的节点,此标签内包含了一个tag,用来标识这是一条铁路
line14:relations类型的节点,成员包含nodes和ways类型的数据,同时有多个标签的数据
总结起来,osm原始数据就是由node/way/relation/tag组合而成。