sf::st_crop()裁剪行为异常 无法匹配目标多边形轮廓的问题咨询
问题原因
该异常由sf v1.0版本的默认运算规则变更导致:sf v1.0及以上版本默认引入s2库处理WGS84(EPSG:4326)这类无投影地理坐标的空间运算,该引擎对多边形顶点环绕方向有严格要求:外环顶点需按顺时针顺序排列,内环(洞)需按逆时针顺序排列。示例中构造的裁剪多边形poly1顶点为逆时针顺序,在s2引擎下会被识别为「全球除该矩形外的所有区域」,因此最终裁剪结果和预期不符。
解决方案
以下两种方案二选一即可实现按poly1轮廓精准裁剪:
方案1:切换回旧版本GEOS平面运算逻辑
该方案操作最简便,运算行为和sf v0.9及旧版本完全一致,只需在加载sf库后添加一行代码关闭s2引擎:
library(sf) sf_use_s2(FALSE) # 新增此行即可
之后运行原有代码即可得到正确的裁剪结果。
方案2:调整多边形适配s2引擎规则
如果需要保留s2球面几何的运算能力,无需关闭s2引擎,只需调整裁剪多边形的顶点环绕方向即可:
# 构造poly1后执行顶点顺序翻转 poly1 <- st_reverse(poly1)
调整后再执行st_crop()或st_intersection()即可得到符合预期的结果。
内容的提问来源于stack exchange,提问作者Simon Mills
相关产品推荐
相关产品推荐

