You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效绘制基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:06:21