使用Osmosis提取OSM自然区域仅得点而非多边形,求问题排查
问题分析与解决方法
你的操作存在两处关键问题,导致无法得到预期的多多边形要素:
1. Osmosis命令未提取完整的多边形结构
OSM里的自然区域通常有两种存储形式:
- 单个闭合的Way(带有
natural标签) - Multipolygon关系(通过多个Way组合成复杂多边形,标签包含
type=multipolygon和natural相关值)
你原命令只提取了带natural标签的Way,但没包含Multipolygon关系,同时也没有保留这些Way关联的节点,导致输出的OSM文件缺少构建多边形必需的拓扑信息。
修正后的Osmosis命令:
osmosis --read-xml map.osm --tf accept-ways natural=* --tf accept-relations type=multipolygon,natural=* --used-node --write-xml out.osm
参数说明:
--tf accept-ways natural=*:筛选所有带natural标签的Way--tf accept-relations type=multipolygon,natural=*:筛选所有类型为Multipolygon且包含natural标签的关系--used-node:保留上述Way和关系关联的所有节点,确保几何结构完整
2. R的readOGR未指定正确的图层
OSM XML文件包含多个图层(points、lines、multipolygons等),readOGR默认读取的是points图层,所以你只得到点要素。需要明确指定读取multipolygons或lines图层:
library(rgdal) # 读取多边形要素 natural_polygons <- readOGR(dsn = "out.osm", layer = "multipolygons") # 如果有闭合Way形式的自然区域,也可以读取lines图层后转换为多边形 natural_lines <- readOGR(dsn = "out.osm", layer = "lines") # 筛选闭合的线并转为多边形 natural_closed_polygons <- natural_lines[natural_lines$osm_id %in% which(gLineLength(natural_lines, byid=TRUE) > 0 & gIsClosed(natural_lines, byid=TRUE)), ] natural_closed_polygons <- gPolygonize(natural_closed_polygons)
内容的提问来源于stack exchange,提问作者Xavier Prudent
相关产品推荐
相关产品推荐

