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

R语言Leaflet全球地图问题:空间对象添加数据报错

解决Leaflet绘制Choropleth地图时的多边形数据错误

问题重现

尝试复刻Leaflet choropleth地图效果,用自定义数据为有数值的国家上色,但调用addPolygons时触发错误:

Error in to_ring.default(x) : Don't know how to get polygon data from object of class XY,POINT,sfg

操作流程:手动下载世界边界文件并读取为world_spdf(sp对象),将其转为tibble后左连自定义数据框my_df,再通过st_as_sf(coords = c("LON","LAT"))转换为sf对象,最终调用leaflet时出错。

错误原因

核心问题是丢失了多边形几何信息:

  • 将sp多边形对象(world_spdf)转为普通tibble时,几何数据被丢弃,只剩属性列
  • 后续用st_as_sf(coords = c("LON","LAT"))生成的是点要素,而addPolygons需要的是多边形几何对象,因此无法识别数据格式。

修复方案

直接将sp对象转换为sf对象,保留几何信息的同时进行数据关联和处理:

完整修正代码

# Setup
library(leaflet)
library(rgdal)
library(here)
library(tidyverse)
library(sf)  # 确保加载sf包

# 读取世界边界文件(sp对象)
world_spdf <- readOGR( 
  dsn= here() , 
  layer="TM_WORLD_BORDERS_SIMPL-0.3",
  verbose=FALSE
)

# 将sp对象转换为sf对象(保留多边形几何)
world_sf <- st_as_sf(world_spdf)

# 自定义数据
country <- c("Algeria", "Argentina", "Australia")
values <- c(1,4,4)
my_df <- data.frame(country, values)  # 修正:dataframe -> data.frame

# 在sf对象上左连自定义数据,保留几何信息
interactive_data <- world_sf %>% 
  left_join(my_df, by = c("NAME" = "country")) %>% 
  mutate(
    values = replace_na(values, 0),  # 修正:原代码的texts应为values
    exists = values > 1
  )

# 定义颜色映射
bins <- c(seq(0,1,1), Inf)
pal <- colorBin(c("white","#C14A36"), domain = interactive_data$exists, bins = bins, reverse = FALSE)

# 绘制地图
leaflet(interactive_data) %>% 
  addTiles() %>% 
  setView(lat=10, lng=0 , zoom=2) %>%
  addPolygons(fillColor = ~pal(exists))

关键修正点

  • 用st_as_sf(world_spdf)将sp对象转为sf对象,保留多边形几何信息
  • 直接在sf对象上执行left_join,无需转成普通tibble
  • 修正原代码中的笔误:dataframe()改为data.frame(),texts改为自定义数据的列名values
  • addPolygons中直接使用~pal(exists),无需重复指定数据集名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:10:49