使用rnaturalearth添加固定离岸线时遇拓扑错误求助
解决rnaturalearth绘制格陵兰离岸线的几何错误问题
错误原因分析
你遇到的Loop 0 is not valid: Edge 14 crosses edge 25错误,核心来自三个问题:
- 代码中未定义
simplified_world变量,且直接使用全球数据计算buffer会引发几何冲突 - 距离单位错误:在WGS84地理坐标系(EPSG:4326)下,
st_buffer的dist参数单位是度,而非米——你设置的0.06度对应约6.6公里,和需求的60米相差巨大 - 原始地理数据存在自相交几何,触发S2几何引擎的有效性检查报错
修正后的代码
library("rnaturalearth") library("rnaturalearthdata") library("sf") library("ggplot2") library("dplyr") # 1. 获取格陵兰数据并修复几何问题 greenland <- ne_countries(scale = "medium", returnclass = "sf") |> filter(name == "Greenland") |> st_make_valid() # 修复自相交等几何无效问题 # 2. 转换到平面投影(UTM 22N,适配格陵兰东部区域) # 平面坐标系下buffer的距离单位为米,计算更准确 greenland_utm <- st_transform(greenland, crs = 32622) # 3. 生成60米离岸线buffer,再转回WGS84坐标系用于绘图 offshore_line <- st_buffer(greenland_utm, dist = 60) |> st_transform(crs = 4326) # 4. 绘制地图 ggplot(data = greenland) + geom_sf(fill = "antiquewhite") + coord_sf(xlim = c(-60, -45), ylim = c(59, 72), expand = FALSE) + geom_sf(data = offshore_line, colour = "blue", linetype = "solid", size = 1)
关键步骤说明
- 筛选格陵兰数据:只处理目标区域,减少计算量和几何冲突概率
- 修复几何有效性:
st_make_valid()自动修正原始数据中的自相交、拓扑错误,避免buffer计算失败 - 使用平面投影计算buffer:地理坐标系是球面,无法准确计算实际距离;转换到UTM平面投影后,
dist=60就是真正的60米离岸距离 - 可选:关闭S2几何检查:如果仍报错,可在代码开头添加
sf::sf_use_s2(FALSE)临时禁用S2引擎的严格几何检查
内容的提问来源于stack exchange,提问作者Fish_Person
相关产品推荐
相关产品推荐

