R语言sf包EPSG3310投影正常,自定义正射投影报几何无效错误如何解决
R中正射投影绘制地图无效几何报错的原因与解决方案
错误根因
- 正射投影(
+proj=ortho)属于方位投影,仅支持展示投影中心所在的半个地球,落在另一半球的矢量要素在投影转换环节会被裁剪,裁剪过程极易生成不符合几何规范的无效对象:例如原本的闭合多边形裁剪后仅残留2个顶点的线段,无法满足多边形闭合环至少需要4个顶点的要求,因此触发GEOS校验报错。 - 此前使用的EPSG:3310是针对美国加利福尼亚州设计的阿尔伯斯等面积投影,你的所有数据都落在该投影的有效覆盖范围内,投影转换不会产生无效几何,因此运行正常。
修复方案
你可以按以下步骤修改代码即可正常渲染:
- 先完成投影转换,主动修复、过滤无效几何
调整后的代码如下:
library(sf) library(ggplot2) library(dplyr) world <- st_read("world_map_path.shp") syear <- st_read("data_path.shp") proj <- "+proj=ortho +lon_0=35 +lat_0=90" # 预处理全球底图:投影转换→修复无效几何→过滤空几何 world_proj <- st_transform(world, crs = proj) %>% st_make_valid() %>% filter(!st_is_empty(.)) # 预处理业务数据,逻辑同上 syear_proj <- st_transform(syear, crs = proj) %>% st_make_valid() %>% filter(!st_is_empty(.)) ggplot(data = world_proj) + geom_sf() + geom_sf(data = syear_proj, aes(fill = owner), size = 0.2) + coord_sf(crs = proj)
- 若仍报错可在
st_read读取原始数据后先执行一次st_make_valid(),消除原始数据本身存在的隐性几何问题。 - 低版本sf可额外关闭
coord_sf的自动裁剪逻辑,添加参数:coord_sf(crs = proj, lims_method = "geometry_bbox")
内容的提问来源于stack exchange,提问作者Sjiveru
相关产品推荐
相关产品推荐

