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

luk*_*uke 13 openstreetmap

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

USA -> California -> San Francisco County -> San Francisco
Run Code Online (Sandbox Code Playgroud)

也许在英国这样:

United Kingdom -> England -> Middlesex -> London -> Soho
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Python和"imposm"解析器库,我可以毫无问题地加载和解析文件; 我的问题是缺乏对OSM数据结构的理解:我不知道如何知道OSM数据中节点之间的父/子关系.例如,如果我找到"Soho"的节点,我怎么能把它绑回"威斯敏斯特市","大伦敦","米德尔塞克斯"和"英格兰"的节点?

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

  • A)这是不一致的
  • B)它似乎是一个自由格式的文本字段,而不是指向OSM节点的链接(即is_in:"威斯敏斯特市"并没有给我任何指向威斯敏斯特节点的链接).

如果您对如何分层链接这些节点有任何建议,请告诉我.

Igo*_*ejc 15

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

至于父子关系,OSM中没有硬连线关系,除了:

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

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

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