geom_sf与ggplot问题:正射投影下部分多边形(国家)消失
解决正射投影下geom_sf多边形消失问题
问题原因
正射投影(ortho)是半球视角的投影,任何完全处于视野半球外的多边形,或者**跨越投影视野边界(如180°经线)**的多边形,经过st_transform转换后会变成无效几何(自相交、空几何等),而geom_sf默认不会绘制无效/空几何,导致国家“消失”。
解决方案
通过拆分跨边界多边形+修复无效几何的组合操作,保留所有可显示的几何部分:
步骤1:拆分跨日界线多边形
用st_wrap_dateline把跨180°经线的多边形拆分为多个独立部分,避免投影时产生无效几何:
library(tidyverse) library(sf) data("World") # 拆分跨日界线的国家多边形 World_processed <- World %>% st_wrap_dateline(options = c("WRAPDATELINE=YES", "DATELINEOFFSET=180"))
步骤2:投影+修复几何
投影后用st_make_valid修复无效几何,再过滤掉完全在视野外的空几何:
# 正射投影(默认视角) World_processed %>% st_transform("+proj=ortho") %>% st_make_valid() %>% filter(!st_is_empty(.)) %>% ggplot() + geom_sf(aes(fill = life_exp)) # 正射投影(纬度40°视角) World_processed %>% st_transform("+proj=ortho +lat_0=40") %>% st_make_valid() %>% filter(!st_is_empty(.)) %>% ggplot() + geom_sf(aes(fill = life_exp))
补充说明
st_wrap_dateline专门处理跨日界线的多边形,确保每个子多边形都在±180°经度范围内,避免投影时出现几何异常。st_make_valid能修复投影过程中产生的自相交、重叠等无效几何问题,保证geom_sf可以正常绘制。filter(!st_is_empty(.))会剔除完全处于视野半球外的国家(比如当视角在北半球时,部分南半球国家可能完全不可见),这是正常的投影特性。
内容的提问来源于stack exchange,提问作者Mark R
相关产品推荐
相关产品推荐

