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



我想编写一个脚本来解析OpenStreetMap (OSM) XML文件,并以分层方式构建城镇数据库。我希望结果数据集的层次结构在美国看起来像这样:

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

在英国可能是这样的:

United Kingdom -> England -> Middlesex -> London -> Soho

输出将是一个JSON文档,该文档描述OSM文件中所有城市的层次结构,其结构与上面的示例类似。

我正在使用Python和"imposm"解析器库,我可以毫无问题地加载和解析文件;我的问题是缺乏对OSM数据结构的理解:我不知道如何了解OSM数据中节点之间的父/子关系。例如,如果我定位了"Soho"的节点,我如何将它与"威斯敏斯特市"、"大伦敦"、"米德尔塞克斯"one_answers"英格兰"的节点联系起来?

我知道有些节点有一个"is_in"标签,可能会提供一些信息,但是

  • A)这与
  • 不一致
  • B)它似乎是一个自由格式的文本字段,而不是一个链接到OSM节点(即。is_in:"City of Westminster"没有给我任何到Westminster节点的链接)。
如果您对如何分层连接这些节点有任何建议,请告诉我。

在OSM中基本上所有东西都是"自由形式"的。标签有一些惯例,但不能保证人们会遵守。所以你需要做一些数据清理和后处理来得到一致的结果。

对于亲子关系,OSM中除了:

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

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

如果你正在寻找"is_in"关系,我认为你需要使用几何方法来建立它。不幸的是,您不能仅仅依靠OSM标签来实现这一点。

最新更新