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

德克萨斯州地图填充色时序动画制作遇CRS错误求助

错误解释与解决方法

错误原因

Error: arguments have different crs 表示空间数据图层(底图和事件填充层)的坐标系(CRS)不匹配。你的原始代码存在两个核心问题:

  • 左连接后的dat未被正确转换为sf对象,导致几何列的CRS无法在图层间被一致识别
  • 底图使用包含31行数据的dat绘制,重复渲染德克萨斯州多边形,引发CRS处理异常

修正后的代码

library(ggplot2)
library(dplyr)
library(geodata)
library(sf)
library(gganimate)
library(gifski)

# 获取德克萨斯州空间数据
tx <- gadm(country = 'USA', level = 1, path=tempdir()) %>%
  st_as_sf() %>% 
  filter(NAME_1 %in% 'Texas') %>%
  mutate(State = NAME_1) %>%
  select(State, geometry) %>%
  st_transform(crs = 4269)

# 构建事件数据
df1 <- data.frame(matrix(ncol = 4, nrow = 3))
colnames(df1)[1:4] <- c('State','date_start','date_end','event')
df1$State <- 'Texas'
df1$date_start <- c(as.Date('2020-01-02'),
                    as.Date('2020-01-10'),
                    as.Date('2020-01-16'))
df1$date_end <- c(as.Date('2020-01-05'),
                  as.Date('2020-01-13'),
                  as.Date('2020-01-24'))
df1$event <- c('moderate','strong','severe')

df1 <- left_join(df1, tx, by = 'State')

# 构建日期序列
df2 <- data.frame(date = seq.Date(as.Date('2020-01-01'),
                                 as.Date('2020-01-31'),
                                 1))

# 合并数据并转换为sf对象
dat <- left_join(df2, df1, by = join_by(between(date, date_start, date_end))) %>%
  select(date, event, geometry) %>%
  mutate(geometry = tx$geometry) %>%
  st_as_sf() # 确保数据具有正确的CRS属性

# 创建底图(仅绘制一次德克萨斯州)
base_map <- ggplot() +
  geom_sf(data = tx, color = "black", fill = "white") +
  theme_void()

# 添加事件图层与动画设置
data_map <- base_map + 
  geom_sf(data = dat, aes(fill = event)) +
  scale_fill_manual(values = c(
    moderate = "#f9d56e",
    strong = "#f79767",
    severe = "#e04e39"
  ), na.value = "white") + # 无事件日期保持白色
  transition_time(date) +
  labs(title = "日期: {frame_time}") # 显示当前动画帧日期

# 生成动画
animate(data_map, nframes = 31, renderer = gifski_renderer())

关键修复点

  1. 统一CRS: 使用st_as_sf()将dat转换为sf对象,确保其CRS与tx保持一致(EPSG:4269)
  2. 简化底图: 直接使用单多边形的tx对象作为底图数据源,避免重复渲染
  3. 处理无事件日期: 通过na.value = "white"确保无事件日期的填充色与底图一致
  4. 添加时间标题: 动画标题显示当前日期,明确时序变化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:17:01