Mapdeck加载GeoJSON样式时R崩溃问题求助
解决mapdeck加载GeoJSON样式时R崩溃/内存飙升的问题
可能原因
- 样式参数解析逻辑误解:mapdeck的样式参数(如
fill_colour)默认会尝试从GeoJSON的properties字段中匹配对应列名。如果直接传入字符串颜色(如"green"),而你的GeoJSON中不存在名为green的属性列,可能触发无意义的循环查找,导致内存占用飙升。 - 旧版本bug:早期版本的mapdeck在处理固定颜色样式时存在内存泄漏或解析循环问题。
- GeoJSON格式不规范:虽然文件体积小,但如果GeoJSON存在语法错误(如未闭合的括号、非法属性名),应用样式时可能触发异常解析逻辑。
解决方案
1. 用I()标记固定颜色值
告诉mapdeck直接使用传入的颜色字符串,而非从数据属性中查找:
# 示例:添加面状GeoJSON并设置绿色填充 add_geojson( data = pwr_geo, fill_colour = I("green"), # 用I()包裹固定颜色 fill_opacity = 0.6 ) # 点GeoJSON设置红色描边 add_geojson( data = point_sma_geo, stroke_colour = I("red"), stroke_width = 2 )
2. 更新mapdeck到最新版本
旧版本的bug可能已经被修复,执行以下命令更新:
install.packages("mapdeck")
3. 验证GeoJSON格式合法性
用geojsonlint包检查文件是否存在语法问题:
install.packages("geojsonlint") library(geojsonlint) # 验证两个GeoJSON文件 geojson_lint("pwr.geojson") geojson_lint("point_sma.geojson")
如果检测到错误,用GeoJSON编辑器修正语法后再导入。
4. 优化Shiny中的数据加载逻辑
避免在每次渲染地图时重复读取GeoJSON文件,提前在Server初始化时加载一次:
server <- function(input, output) { # 一次性加载GeoJSON数据,避免重复IO操作 pwr_geo <- geojsonio::geojson_read("pwr.geojson", what = "sp") point_sma_geo <- geojsonio::geojson_read("point_sma.geojson", what = "sp") output$map <- renderMapdeck({ mapdeck(token = Sys.getenv("MAPBOX_TOKEN")) %>% add_geojson(data = pwr_geo, fill_colour = I("green")) %>% add_geojson(data = point_sma_geo, stroke_colour = I("blue")) }) }
5. 内存排查(可选)
用profvis工具定位内存占用的具体来源:
install.packages("profvis") library(profvis) # 运行出现问题的代码段,生成性能分析报告 profvis({ mapdeck(token = Sys.getenv("MAPBOX_TOKEN")) %>% add_geojson(data = pwr_geo, fill_colour = "green") # 用引发崩溃的写法 })
报告中可以看到哪一步占用了大量内存,进一步定位问题。
内容的提问来源于stack exchange,提问作者Natasha Maharani
相关产品推荐
相关产品推荐

