如何在Osmosis提取的XML中找到Node与Relation的关联?
问题描述
我有如下Node元素:
<node id="1159592166" version="2" timestamp="2014-06-20T14:18:34Z" uid="1942179" user="CzechAddress" changeset="23044606" lat="50.0121501" lon="15.9559037"> <tag k="addr:conscriptionnumber" v="46"/> <tag k="addr:country" v="CZ"/> <tag k="addr:housenumber" v="46"/> <tag k="addr:place" v="Platěnice"/> <tag k="addr:postcode" v="53002"/> <tag k="ref:ruian:addr" v="7567138"/> </node>
以及如下Relation元素:
<relation id="436721" version="28" timestamp="2018-03-12T20:22:00Z" uid="787799" user="czechreg" changeset="57123511"> <member type="node" ref="1585113507" role="admin_centre"/> <member type="relation" ref="429108" role="subarea"/> <member type="relation" ref="429333" role="subarea"/> <member type="relation" ref="429786" role="subarea"/> <member type="relation" ref="429109" role="subarea"/> <member type="relation" ref="435471" role="subarea"/> <member type="way" ref="179382288" role="outer"/> <member type="way" ref="179456283" role="outer"/> <member type="way" ref="179456430" role="outer"/> <member type="way" ref="179456429" role="outer"/> <member type="way" ref="179456428" role="outer"/> <member type="way" ref="179456432" role="outer"/> <member type="way" ref="179633268" role="outer"/> <member type="way" ref="179641571" role="outer"/> <member type="way" ref="179910070" role="outer"/> <member type="way" ref="179910323" role="outer"/> <member type="way" ref="179910320" role="outer"/> <member type="way" ref="179910319" role="outer"/> <member type="way" ref="179910325" role="outer"/> <member type="way" ref="179913217" role="outer"/> <member type="way" ref="180639038" role="outer"/> <member type="way" ref="180639036" role="outer"/> <member type="way" ref="180639051" role="outer"/> <member type="way" ref="181680255" role="outer"/> <member type="way" ref="181852616" role="outer"/> <member type="way" ref="240282766" role="outer"/> <tag k="admin_level" v="8"/> <tag k="boundary" v="administrative"/> <tag k="name" v="Moravany"/> <tag k="name:cs" v="Moravany"/> <tag k="name:prefix" v="obec"/> <tag k="population" v="1795"/> <tag k="ref" v="CZ0532575399"/> <tag k="source" v="cuzk:ruian"/> <tag k="source:population" v="csu:rso"/> <tag k="type" v="boundary"/> <tag k="wikidata" v="Q2521236"/> <tag k="wikipedia" v="cs:Moravany (okres Pardubice)"/> </relation>
在Nominatim中查看该Node时,地址下方显示关联了Relation 436721,但在Osmosis提取的XML文件里找不到两者的直接绑定关系,请问该如何找到这种关联?
解决方法
1. 先明确关联本质:空间归属而非直接引用
这个Node和Relation的关联是空间包含关系——Node位于该行政边界Relation的范围内,而非作为Relation的<member>被直接引用。Osmosis提取的原始XML仅保存OSM元素间的直接引用关系,不会记录这种空间层面的间接关联。
2. 通过空间查询推导关联
要在本地XML数据中确认这种关联,需要借助支持空间计算的工具,步骤如下:
- 提取Relation的边界多边形:从XML中找出Relation 436721包含的所有
<member type="way">对应的Way元素,再提取每个Way包含的Node坐标,拼接成完整的多边形边界。 - 执行点-in-多边形判断:用点-in-多边形算法,检查目标Node的经纬度是否落在上述多边形范围内。如果结果为是,即可确认两者的空间关联。
3. 优化Osmosis提取流程(可选)
如果需要直接获取带行政归属的Node数据,可以调整提取策略:
- 使用Osmosis的
--bounding-polygon参数,先提取目标Relation对应的边界区域内的所有元素,这样提取的数据集里的Node自然属于该Relation范围。 - 将XML导入PostGIS数据库(可借助osm2pgsql工具),利用SQL的
ST_Contains等空间函数快速查询Node所属的行政Relation。
内容的提问来源于Stack Exchange,提问作者kevas
相关产品推荐
相关产品推荐

