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

瑞士地形SHP文件绘图报错:无法分配超大内存向量求助

解决瑞士DHM25地形数据绘图时的内存溢出错误

错误原因

你遇到的内存溢出问题,核心是用错了绘图方法:geom_raster要求输入是规则网格的栅格数据,但dhm25_p.shp是离散的高程点数据集。直接将点数据转成data.frame后用geom_raster,R会尝试为所有可能的x/y组合生成栅格单元,这必然导致内存爆炸(错误提示的6539542.5 Gb就是明证)。

解决方案

1. 直接可视化离散点(快速简单)

如果仅需要展示高程点分布,用geom_point替代geom_raster,无需转换为Spatial对象:

library(sf)
library(ggplot2)

# 读取SHP点数据
aux <- st_read(dsn="dhm25_p.shp")

# 查看数据列名,找到存储高程的字段(比如Z、H或elevation)
names(aux)

ggplot(aux) +
  geom_point(aes(color = Z), size = 0.1) + # 替换Z为实际的高程列名
  scale_color_viridis_c(option = "plasma") +
  theme_minimal()

2. 插值为栅格后绘制连续地形

如果需要生成平滑的地形表面,用插值工具将离散点转换为规则栅格:

library(sf)
library(terra)
library(ggplot2)

# 读取点数据
aux <- st_read(dsn="dhm25_p.shp")
# 转换为terra支持的矢量格式
v <- vect(aux)
# 创建对应DHM25精度的空栅格模板(25米分辨率)
r <- rast(v, resolution = 25)
# 反距离加权插值生成高程栅格
r_elev <- interpolate(r, v, method = "idw")

# 转换为ggplot可用的数据格式
r_df <- as.data.frame(r_elev, xy = TRUE)

ggplot(r_df) +
  geom_raster(aes(x = x, y = y, fill = Z)) + # Z为插值后的高程列名
  scale_fill_viridis_c(option = "plasma") +
  coord_sf(crs = st_crs(aux)) +
  theme_minimal()

3. 内存优化技巧

  • 裁剪数据范围:如果不需要全瑞士地形,先裁剪到目标区域再处理:
    # 定义裁剪范围(示例坐标,替换为你需要的区域)
    bbox <- st_bbox(c(xmin=600000, ymin=200000, xmax=650000, ymax=250000), crs=st_crs(aux))
    aux_cropped <- st_crop(aux, bbox)
    
  • 降低栅格分辨率:内存不足时,可将resolution设为更大的值(比如50米)

内容的提问来源于stack exchange,提问作者MPB_2022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:35:24