使用sf包st_crop与极投影后,北亚区域出现异常竖线问题咨询
解决sf包极投影后北亚区域地图异常竖线问题
问题根源:关闭S2球面几何支持(sf_use_s2(FALSE))后,st_crop采用平面几何逻辑处理跨180°经线的区域(如北亚部分),导致多边形拓扑错误,转换到正射极投影后出现异常竖线。
方案1:启用S2球面几何处理裁剪
利用S2的球面空间运算,正确处理跨180°经线的裁剪操作:
library(sf) library(maps) # 启用S2球面几何支持(默认已开启,此处明确设置) sf_use_s2(TRUE) # 加载世界地图并转换为WGS84坐标系 world1 <- sf::st_as_sf(map('world', plot = FALSE, fill = TRUE)) |> st_transform(crs = 4326) # 定义北纬60度以上的裁剪范围 bbox <- st_bbox(c(xmin = -180, ymin = 60, xmax = 180, ymax = 90), crs = 4326) # 裁剪后转换到正射极投影并绘图 st_crop(world1, bbox) |> st_transform(crs = "+proj=ortho +lat_0=90 +lon_0=0") |> plot()
方案2:先投影再裁剪
避免在WGS84平面裁剪跨经线区域,先转换到极投影再进行裁剪:
library(sf) library(maps) # 加载世界地图并转换为WGS84坐标系 world1 <- sf::st_as_sf(map('world', plot = FALSE, fill = TRUE)) |> st_transform(crs = 4326) # 定义正射极投影 ortho_crs <- "+proj=ortho +lat_0=90 +lon_0=0" # 先将地图转换到极投影 world_ortho <- st_transform(world1, crs = ortho_crs) # 计算极投影下对应北纬60度的边界坐标 lat60_point <- st_sfc(st_point(c(0, 60)), crs = 4326) |> st_transform(ortho_crs) lat60_coords <- st_coordinates(lat60_point)[1, ] # 定义极投影下的裁剪范围 bbox_ortho <- st_bbox(c(xmin = -lat60_coords[1], ymin = -lat60_coords[2], xmax = lat60_coords[1], ymax = lat60_coords[2]), crs = ortho_crs) # 裁剪并绘图 st_crop(world_ortho, bbox_ortho) |> plot()
两种方案都能解决异常竖线问题,方案1更简洁,推荐优先使用。
内容的提问来源于stack exchange,提问作者Breeze
相关产品推荐
相关产品推荐

