使用sf绘制跨180°日界线的对象时出现竖线问题
解决跨180°日界线绘图出现竖线的问题
问题根源
跨180°日界线的面要素经st_shift_longitude()转换后,几何会被拆分为跨东西半球的多部分,ggplot绘制时会自动连接不同部分的顶点,从而出现180°位置的竖线。以下是几种可行的解决方法:
方法一:用st_wrap_dateline()拆分跨日界线几何
该函数会将跨180°的几何拆分为多个不跨日界线的独立部分,避免绘图时的错误连线:
library(sf) library(tidyverse) # 读取数据 pmnm <- st_read("data/gis/hi_noaa_nwhi_papahanaumokuakea.shp", quiet = TRUE) # 处理跨日界线几何并转换经度 pmnm_fixed <- pmnm %>% st_wrap_dateline(options = c("WRAPDATELINE=YES", "DATELINEOFFSET=180")) %>% st_shift_longitude() # 绘图 ggplot(pmnm_fixed) + geom_sf()
方法二:切换到GEOS几何并过滤无效小要素
S2球面几何在这类平面绘图场景中可能出现异常,切换到GEOS后拆分几何,过滤掉跨日界线产生的细长无效部分:
# 切换到GEOS平面几何处理 sf_use_s2(FALSE) pmnm_fixed <- pmnm %>% st_shift_longitude() %>% # 将多部分几何拆分为单个多边形 st_cast("POLYGON") %>% # 过滤面积极小的无效要素(阈值可根据数据调整) filter(st_area(.) > units::set_units(1, km^2)) ggplot(pmnm_fixed) + geom_sf()
方法三:先修复几何有效性再处理
若原始shapefile存在几何无效问题,先修复再处理日界线:
pmnm_fixed <- pmnm %>% st_make_valid() %>% st_wrap_dateline(options = c("WRAPDATELINE=YES")) %>% st_shift_longitude() ggplot(pmnm_fixed) + geom_sf()
内容的提问来源于stack exchange,提问作者Luther Blissett
相关产品推荐
相关产品推荐

