我想编写一个解析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”标签,可能会提供一些此类信息,但
如果您对如何分层链接这些节点有任何建议,请告诉我。
答案 0 :(得分:15)
在OSM中,一切都是“自由形式”。有关于标记的约定,但不能保证人们会坚持使用它们。因此,您需要进行一些数据清理和后处理才能获得一致的信息。
对于父子关系,OSM中没有硬连线关系,而不是:
OSM关系可用于定义层次关系,但这些关系的定义方式非常通用。语义基于约定(通常在OSM Wiki页面上描述)。
如果您正在寻找“is_in”关系,我认为您需要使用几何方法来建立它。不幸的是,你不能仅仅依靠OSM标记。