You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:34:57