获取一个最简单的OSM文件,并学习其最基础的结构。
操作很简单:
进入官网:https://www.openstreetmap.org/
点击左上角的 “导出” 按钮。

然后,填入坐标范围,点击按钮即可导出osm文件:

当然,直接填坐标范围是不直观的,为此,可以点击 “手动选择不同的区域”,这样即可手动选择范围了:

Wiki上有关于OSM格式的简单介绍,可见附录。不过这里将通过例子来学习:

导出后的osm文件内容如下:
<osm version="0.6" generator="CGImap 0.8.8 (2798843 spike-07.openstreetmap.org)" copyright="OpenStreetMap and contributors" attribution="http://www.openstreetmap.org/copyright" license="http://opendatacommons.org/licenses/odbl/1-0/">
<bounds minlat="31.3618700" minlon="121.8012200" maxlat="31.3620700" maxlon="121.8015200"/>
<node id="7603536329" visible="true" version="1" changeset="86368470" timestamp="2020-06-08T19:00:07Z" user="Reboot01" uid="9856191" lat="31.3618772" lon="121.8012886"/>
<node id="7603536330" visible="true" version="1" changeset="86368470" timestamp="2020-06-08T19:00:07Z" user="Reboot01" uid="9856191" lat="31.3619399" lon="121.8014870"/>
<node id="7603536331" visible="true" version="1" changeset="86368470" timestamp="2020-06-08T19:00:07Z" user="Reboot01" uid="9856191" lat="31.3620542" lon="121.8014375"/>
<node id="7603536332" visible="true" version="1" changeset="86368470" timestamp="2020-06-08T19:00:07Z" user="Reboot01" uid="9856191" lat="31.3619915" lon="121.8012390"/>
<way id="813970381" visible="true" version="1" changeset="86368470" timestamp="2020-06-08T19:00:07Z" user="Reboot01" uid="9856191">
<nd ref="7603536329"/>
<nd ref="7603536330"/>
<nd ref="7603536331"/>
<nd ref="7603536332"/>
<nd ref="7603536329"/>
<tag k="building" v="yes"/>
way>
osm>
可以看到有以下信息:
lon和latbounds节点记录了这个文件的范围node节点代表了4个位置。way节点引用了node节点(通过id),以这样的方式表示出了一个范围。以此可见way节点并不仅表示“路(way)”。tag指出了这个way节点是一个建筑(building)
这里就出现了多个way节点,并且根据tag可以区分出各自的种类:

比如这里不仅有建筑,还有操场,和跑道。

这是横沙岛的一个边界。可以在文件中找到一个relation节点,它指明了自己的边界包含了哪些way节点:

结合这些简单的例子,以及Wiki的介绍,我学到关于OSM文件的一些最基础的结构:
node节点代表空间中的一个位置,具有经纬度属性。way节点引用了node,以有序列表的方式定义了一个范围。relation节点(关系)引用了way节点(wiki指出还可能引用node或其他relation)作为成员(member),并且指出了每个成员在这个关系中所扮演的角色。tag属性,来附带上额外的信息。Wiki地址:https://en.wikipedia.org/wiki/OpenStreetMap
OpenStreetMap uses a topological data structure, with four core elements (also known as data primitives):