如何从OSM XML planet文件中提取分层的城市/州/国家/地区数据?

时间:2011-09-16 10:39:54

标签: openstreetmap

我想编写一个解析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 个答案:

答案 0 :(得分:15)

在OSM中,一切都是“自由形式”。有关于标记的约定,但不能保证人们会坚持使用它们。因此,您需要进行一些数据清理和后处理才能获得一致的信息。

对于父子关系,OSM中没有硬连线关系,而不是:

  • 节点以一种或多种方式使用
  • 节点是一个或多个关系的成员
  • 一种方式是一种或多种关系的成员
  • 关系是一个或多个关系的成员

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

如果您正在寻找“is_in”关系,我认为您需要使用几何方法来建立它。不幸的是,你不能仅仅依靠OSM标记。