我该如何从OSM XML星球文件中提取分层的城市/州/国家数据?

14

我想编写一个脚本来解析OpenStreetMap(OSM)XML文件,并以分层方式构建城镇和城市的数据库。 我希望生成的数据集在美国可能如下所示:

USA -> California -> San Francisco County -> San Francisco

也许在英国是这样的:

United Kingdom -> England -> Middlesex -> London -> Soho
输出的结果将是一个JSON文档,其中描述了OSM文件中所有城市的层次结构,其结构类似于上面的示例。
我正在使用Python和"imposm"解析库,可以加载和解析文件,但我缺乏了解OSM数据结构的知识:我不知道如何查找OSM数据中节点之间的父/子关系。例如,如果我定位了"Soho"节点,如何将其与“威斯敏斯特市”、“大伦敦”、“米德尔塞克斯”和“英格兰”的节点联系起来?
我知道一些节点具有"is_in"标签,可能会提供一些信息,但是,
A)这是不一致的,并且
B)它似乎是一个自由格式的文本字段,而不是指向OSM节点的链接(即is_in:“威斯敏斯特市”不会给我任何指向威斯敏斯特节点的链接)。
请让我知道是否有任何建议,如何将这些节点按层次链接起来。
1个回答

15

在OSM中,基本上一切都是“自由格式的”。有关标记的惯例是存在的,但并不能保证人们会遵守这些惯例。因此,您需要进行一些数据清洗和后处理工作,以确保一致性。

至于父子关系,在OSM中除了以下几个硬编码的关系之外,其他没有:

  • 一个节点被一个或多个路径使用
  • 一个节点是一个或多个关系的成员
  • 一个路径是一个或多个关系的成员
  • 一个关系是一个或多个关系的成员

OSM关系可以用来定义层次关系,但是这些关系的定义方式非常通用。语义是基于惯例的(通常在OSM Wiki页面上描述)。

如果您正在寻找“所属于”关系,则认为您需要使用几何方法来建立它。不幸的是,您无法仅依靠OSM标记来进行这项工作。


谢谢您的回复,Igor。那是有用的信息,看起来我不能完全依赖OSM数据结构来获取我需要的数据。我认为从像geonames.org这样的地方获取我的数据会更好。 - luke
他不能搜索所有边界围绕着感兴趣点的节点吗?例如,如果您有一条街道,应该找到节点,如城市、省份、区域和国家,因为它们的边界围绕着街道的纬度和经度位置。 - Tom
@luke - 你找到你要找的信息了吗?我也在寻找这个。但是找不到方法。我从OSM首页上看到我们可以这样做。例如,如果我搜索“King Of Prussia”,我会看到完整的路径.. https://www.openstreetmap.org/search?query=king%20of%20prussia#map=14/40.0949/-75.3817 - Bujji
@igor-brejc - 你能否请检查一下我上面的评论? - Bujji

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接