openstreetmap – 如何从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”的节点,我该怎么把它重新连接到“威斯敏斯特城”,“大伦敦”,“米德尔塞克斯”和“英格兰”的节点?

我知道一些节点有一个“is_in”标签可能会给出一些这样的信息,但是

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

如果您有任何建议如何分层地链接这些节点,请让我知道.

基本上OSM中的一切都是“自由”的.有标签的公约,但不能保证人们会坚持.所以你需要做一些数据清理和后处理来获得一切.

对于父子关系,除OSM之外没有硬连线关系:

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

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

如果你正在寻找一个“is_in”的关系,我想你将需要使用几何方法建立它.不幸的是,您不能真正依靠OSM标记.

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念