如何高效绘制基于sf包的全球10分钟分辨率陆地网格?
全球高分辨率陆地网格高效绘制方案
问题背景
已通过R的sf包生成全球10分钟(1/12度)分辨率的陆地网格,包含grid_ID字段,保存为global_10m_grid.gpkg。使用tmap直接绘制时,因数据量过大(约280万+网格单元),本地加载耗时极长,集群交互式环境下生成空文件,需更高效的绘制方法。
原始绘制代码:
grid <- st_read('global_10m_grid.gpkg') bitmap('test_grid.png') tm_shape(grid) + tm_fill(col = 'red') dev.off()
高效绘制方法
1. 快速检查:合并网格为陆地轮廓(无需绘制单个网格)
如果仅需验证网格覆盖范围是否正确,无需绘制每个网格单元,直接将所有网格合并为单一多边形,渲染速度极快:
library(sf) library(tmap) # 加载网格并合并 grid <- st_read('global_10m_grid.gpkg', quiet = TRUE) land_outline <- st_union(grid) %>% st_as_sf() # 绘制轮廓 tmap_save(tm_shape(land_outline) + tm_fill(col = "red"), "land_outline.png")
2. 分区域绘制(仅渲染目标区域)
若只需检查特定区域,过滤对应范围的网格后绘制,大幅减少数据量:
grid <- st_read('global_10m_grid.gpkg', quiet = TRUE) # 定义目标区域(示例:东亚地区,东经70-140,北纬10-55) target_bbox <- st_bbox(c(xmin=70, ymin=10, xmax=140, ymax=55), crs=st_crs(grid)) target_grid <- grid[st_intersects(grid, st_as_sfc(target_bbox), sparse=FALSE), ] # 绘制目标区域网格 tmap_save(tm_shape(target_grid) + tm_fill(col = "red"), "east_asia_grid.png")
3. tmap优化:启用栅格化渲染 + 正确输出设置
tmap默认矢量渲染大网格会卡顿,改用栅格化渲染,并直接用tmap_save替代bitmap/dev.off,避免集群环境设备问题:
library(tmap) grid <- st_read('global_10m_grid.gpkg', quiet = TRUE) # 切换到绘图模式(非交互式),启用栅格化渲染 tmap_mode("plot") tm <- tm_shape(grid) + tm_fill(col = "red", raster = TRUE) # raster=TRUE将矢量转为栅格渲染 # 直接保存,无需手动调用设备 tmap_save(tm, "global_grid_raster.png", width = 1200, height = 600)
4. 转换为栅格格式后绘制
将sf网格转为栅格对象(terra包效率更高),栅格对大区域渲染远快于矢量:
library(terra) library(tmap) # 加载网格并转为栅格 grid <- st_read('global_10m_grid.gpkg', quiet = TRUE) r <- rast(grid, res = 1/12) # 指定分辨率与原网格一致 r <- rasterize(vect(grid), r, field = "grid_ID") # 绘制栅格 tmap_save(tm_shape(r) + tm_raster(palette = "reds"), "global_grid_raster.png")
5. 集群环境适配:使用无界面图形设备
集群交互式shell无图形界面,需明确使用支持无界面的设备(如png()或cairo_png()),确保绘制完成后正确关闭:
library(sf) library(tmap) grid <- st_read('global_10m_grid.gpkg', quiet = TRUE) # 使用cairo_png(集群环境兼容性更好) cairo_png("global_grid.png", width = 1200, height = 600) tmap_mode("plot") print(tm_shape(grid) + tm_fill(col = "red", raster = TRUE)) dev.off()
内容的提问来源于stack exchange,提问作者MJezierski
相关产品推荐
相关产品推荐

