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

在R中创建植物物种罗宾逊分布图:多边形等问题求助

解决方案:植物物种分布图绘制与批量处理

一、地图优化(解决重叠、杂乱、隐藏南极洲)

参考你想要的简洁风格地图,可通过以下步骤优化:

  • 移除南极洲:从shp数据中直接筛选掉名称为"Antarctica"的区域
  • 简化细碎多边形:用st_simplify()合并小岛屿或过度细分的区域,减少视觉杂乱感
  • 替换为Level2数据:WGS84的Level3数据北极区域存在重复多边形,改用Level2数据(区域划分更宏观),能直接避免北极重叠问题,更贴合参考图的简洁效果

二、修复现有代码错误

你的代码中存在变量名不一致的问题,修正如下:

# 原错误代码
tdwg.introduced.name <- list()
for (i in 1:length(introduced)){
  tdwg.introduced.code[[i]]<- introduced[[i]]$name  # 使用了未定义的tdwg.introduced.code
}
tdwg.introduced.name <- unlist(tdwg.introduced.code)  # 同样变量名错误

# 修正后代码
tdwg.introduced.name <- list()
for (i in 1:length(introduced)){
  tdwg.introduced.name[[i]] <- introduced[[i]]$name
}
tdwg.introduced.name <- unlist(tdwg.introduced.name)

三、批量处理100种物种的方案

将物种ID存入向量,编写通用绘图函数,通过循环自动获取每个物种的分布数据、生成地图并保存图片。

完整示例代码

# 加载依赖包
library(kewr)
library(sf)
library(ggplot2)
library(dplyr)

# 1. 预处理地图数据
# 读取Level2 shp文件(比Level3更简洁)
tdwg_level2.shp <- read_sf("wgsrpd-master/level2/level2.shp")
# 转换为罗宾逊投影
tdwg_robinson <- st_transform(tdwg_level2.shp, crs = "+proj=robin +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
# 移除南极洲+简化多边形
tdwg_clean <- tdwg_robinson %>%
  filter(LEVEL2_NAM != "Antarctica") %>%
  st_simplify(dTolerance = 10000)  # 10000米容差,数值越大简化程度越高

# 2. 定义单物种绘图函数
plot_species_dist <- function(species_id, save_dir = "./species_plots/") {
  # 创建保存目录
  if (!dir.exists(save_dir)) dir.create(save_dir)
  
  # 获取POWO分布数据
  powo_data <- lookup_powo(species_id, distribution = TRUE)
  # 提取原生/引入区域名称
  native_regions <- if (!is.null(powo_data$distribution$natives)) {
    unlist(lapply(powo_data$distribution$natives, function(x) x$name))
  } else character(0)
  introduced_regions <- if (!is.null(powo_data$distribution$introduced)) {
    unlist(lapply(powo_data$distribution$introduced, function(x) x$name))
  } else character(0)
  
  # 给地图数据标记分布类型
  plot_data <- tdwg_clean %>%
    mutate(
      dist_type = case_when(
        LEVEL2_NAM %in% native_regions ~ "原生分布",
        LEVEL2_NAM %in% introduced_regions ~ "引入分布",
        TRUE ~ "无分布"
      )
    )
  
  # 绘制地图
  p <- ggplot() +
    geom_sf(data = plot_data %>% filter(dist_type == "无分布"), fill = "#f0f0f0", color = "#cccccc") +
    geom_sf(data = plot_data %>% filter(dist_type == "原生分布"), fill = "#B8DE95", color = "#cccccc") +
    geom_sf(data = plot_data %>% filter(dist_type == "引入分布"), fill = "#9F6CCC", color = "#cccccc") +
    theme_void() +
    labs(title = powo_data$taxon$name) +
    theme(plot.title = element_text(hjust = 0.5, size = 14))
  
  # 保存图片
  ggsave(paste0(save_dir, powo_data$taxon$name, ".png"), p, width = 12, height = 6, dpi = 300)
  return(p)
}

# 3. 批量处理物种ID列表
id_list <- c("17414550-1", "296290-1", "263221-1")
# 循环生成所有物种地图
lapply(id_list, plot_species_dist)

关键说明

  • 用Level2数据替代Level3:从根源避免北极重叠和细碎区域问题,输出效果更接近参考图
  • 多边形简化参数:st_simplify()的dTolerance可根据需求调整,单位为米
  • 空分布处理:函数中加入了原生/引入分布为空的判断,避免运行报错
  • 批量管理:自动创建保存目录,每个地图以物种名称命名,便于后续整理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:30:51