使用R语言sf包裁剪澳大利亚地质shapefile时球面几何报错如何解决?
问题原因
- 原始shapefile存在无效几何。sf v1.0及以上版本默认对地理坐标系(WGS84等经纬度投影)启用
s2球面几何引擎,对矢量拓扑合法性要求远高于旧版平面几何模式,你使用的百万分之一澳大利亚地质图矢量本身存在大量重复顶点、环闭合错误等拓扑问题,触发合法性校验报错。 - 裁剪参数逻辑错误。
st_crop要求传入的参数符合xmin < xmax、ymin < ymax的规则,你传入的ymin = -32、ymax = -43违反了该规则(南纬数值越小位置越靠南,-43小于-32),会导致裁剪范围非法。 - 绘图代码存在索引错误。你裁剪后的对象是
geol_cropped,但fill参数直接调用了未裁剪的geol$LITHOLOGY,二者行数不一致,绘图时会出现填充颜色不匹配的问题。
修复方案
- 先修复矢量拓扑问题,可二选一执行:
# 方案1:直接修复无效几何 geol_valid <- st_make_valid(geol) # 方案2:如果修复后还有报错,可临时关闭s2引擎改用平面几何计算,适合小范围低精度需求 sf::sf_use_s2(FALSE)
- 修正裁剪参数,调整经纬度范围顺序:
geol_cropped <- st_crop(geol_valid, xmin = 138, xmax = 155, ymin = -43, ymax = -32)
- 修正绘图代码的填充参数:
ggplot() + geom_sf(data = geol_cropped, aes(fill = LITHOLOGY)) + ggtitle("Geological Map") + coord_sf()
数据样例上传方法
- 可以随机截取子集发布:按行截取少量要素
geol_sub <- geol[1:20,],再用dput(geol_sub)输出,仅20个要素的字符量完全可以正常发布 - 也可以将裁剪后的小范围矢量另存为gpkg格式,上传到公共文件托管服务后在提问中提供标识即可
内容的提问来源于stack exchange,提问作者Sophie Williams
相关产品推荐
相关产品推荐

