关闭sf_use_s2()裁剪sf对象是否可行?操作后需恢复开启吗?
问题
我正在处理包含栅格数据的数据集,结合rnaturalearth的地图开展分析,主要使用terra包处理栅格数据(包括聚合、重投影及通过app执行多图层均值计算等操作)。出于可视化需求,我需裁剪栅格并使用ggplot展示区域数据——用crop()裁剪栅格十分便捷,但裁剪sf对象时遇到问题:
旧教程中的代码触发错误:
library(sf) library(rnaturalearth) world <- ne_countries(scale = "small", returnclass = "sf") europe <- st_crop(world, xmin = -20, xmax = 45, ymin = 30, ymax = 73)
错误信息:
Error in wk_handle.wk_wkb(wkb, s2_geography_writer(oriented = oriented, : Loop 0 is not valid: Edge 0 crosses edge 78
我知道该错误源于sf从平面空间切换至球面几何,通过关闭sf_use_s2()可解决:
sf_use_s2(FALSE) europe <- st_crop(world, xmin = -20, xmax = 45, ymin = 30, ymax = 73)
运行后提示:
Spherical geometry (s2) switched off although coordinates are longitude/latitude, st_intersection assumes that they are planar Warning: attribute variables are assumed to be spatially constant throughout all geometries
我使用WGS84经纬度数据进行分析,仅在可视化时通过coord_sf()投影为摩尔威德投影,常处理全球数据并进行局部可视化。现咨询:
- 为裁剪sf对象关闭
sf_use_s2()是否存在问题? - 操作后是否需重新开启该功能?
解答
1. 关闭sf_use_s2()裁剪sf对象的风险
对于你的使用场景,关闭S2几何的风险极低:
- 你裁剪的是欧洲区域,既不跨180°经线也不涉及极地,平面近似(默认将经纬度视为平面笛卡尔坐标)带来的误差可以忽略,完全满足可视化需求。
- 错误提示里的
st_intersection assumes planar只是模式切换的提醒,并非致命问题。原错误是S2对几何合法性的严格校验触发的,平面模式下会自动忽略这类非致命的几何冲突,反而能顺利完成裁剪。
2. 是否需要重新开启S2功能
建议操作完成后重新开启,原因如下:
- S2几何是sf处理球面空间数据的标准方式,后续若处理跨极地、跨日界线的全球数据,或需要精确的球面运算(如计算球面距离、面积),开启S2能保证结果的准确性,避免平面近似带来的误差。
- 重新开启的代码非常简单:
sf_use_s2(TRUE)
- 即使后续会话暂时不需要球面运算,养成恢复默认设置的习惯,也能避免其他脚本因几何处理模式不一致出现意外问题。
内容的提问来源于stack exchange,提问作者Jaken
相关产品推荐
相关产品推荐

