我有一个python脚本来分析OSM数据,目标是用来自OSM relation的特定数据构建一个OSM。
我目前关注的是OSM关系,它表示像这一个这样的“徒步旅行”路径。
根据文档
成员 (只读)关系成员的有序列表。见osmium.osm.RelationMemberList。
relation对象有一个属性members,它收集关系的所有成员。
因此,脚本的第一部分设法提取具有标记sac_scale=hiking的所有关系,并收集其所有方式。
下面的脚本只关注一个特定的关系: r104369
class HikingWaysfromRelations(osmium.SimpleHandler):
def __init__(self):
super(HikingWaysfromRelations, self).__init__()
self.dict = {}
def _getWays(self, elem, elem_type):
# tag
if 'sac_scale' in elem.tags and elem.tags['sac_scale']=='hiking' and elem.id==104369:
list=[]
for mem in elem.members:
if mem.type=="w":
list.append(str(mem.ref))
self.dict["r"+str(elem.id)]=list
else:
pass
def relation(self,r):
self._getWays(r, "relation")
ml = HikingWaysfromRelations()
ml.apply_file('../pbf/new-zealand.osm.pbf')结果是一个字典,其中包含期望的关系作为唯一的键,以及它的方式:
{"r104369": ["191668175", "765285136", "765285135", "765285138", "765285139", "191668225", "765542429", "765542430", "765542432", "765542431", "765542435", "765542436", "765542434", "765542433", "765542437", "765542438", "765542439", "765542440", "765542441", "765542442", "765548983", "271277386", "765548985", "765548984", "684295241", "684295239", "464603363", "464603364", "464607430", "299788481", "178920047", "155711655", "155711646", "684294192", "259362037", "684294189", "259362038", "259362041", "259362036", "259362043", "259362039", "259362040"]}现在的问题是:如何构建一个包含单一功能的GeoJson,将所有这些方式连接起来,并重建预期的徒步旅行路径?

根据我在网络上所发现的,我应该在完整的simpleHander文件上重新运行一个.pbf,每次我遇到我正在寻找的一种方法--基于上述字典的值--我可以用以下方法重建一个LineString:
import shapely.wkb as wkblib
wkbfab = osmium.geom.WKBFactory()
def getRelationGeometry(elem):
wkb=wkbfab.create_linestring(elem)
return wkb问题是,看起来有些方法只有一个节点,因此触发了以下错误:
RuntimeError: need at least two points for linestring (way_id=155711655)那么,重新构建一个多方式的GeoJson特性-- multiLineString --能够在https://geojson.io/#map=2/20.0/0.0上绘制结果的解决方案是什么?
例如,当我点击链接时,openstreetmap如何设法重新构建关系的轨道,如果不是通过连接从关系发出的所有节点(从所有方式)来实现的?
非常感谢你的帮助
我知道bash有一种方法,您首先通过只与标记sac_scale=hiking保持关系来过滤初始pbf,然后将过滤后的结果转换为GeoJson --但我真的希望能够在python中生成同样的结果,以了解OSM数据是如何存储的。我只是想不出一个简单的方法来做到这一点,因为知道吡啶相当于锇,我相信在那里也应该有一个简单的方法。
osmium export output/output_food-drinks.pbf -f geojson发布于 2022-09-15 17:36:28
通过在post (155711655)中的错误中显示id的方式,它有两个节点,而不是一个节点。在这个答案的时候,可见的这里。
知道了这一点,我想出了两个原因来解释为什么你会犯这个错误:
location=True所建议的那样将参数apply_file传递给apply_file方法:
由于OSM数据的结构方式,当处理程序想要处理方式和区域的几何图形时,锇需要内部缓存节点几何图形。如果需要这个缓存,apply_file()方法本身无法推断。因此,需要通过将locations参数设置为True显式启用位置:
h.apply_file("test.osm.pbf", locations=True, idx='flex_mem')查看上面的代码,apply_file方法只将输入文件作为参数,所以我认为这可能是您的问题。
Nodes in ways missing: 0。https://stackoverflow.com/questions/72515657
复制相似问题