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
相关产品推荐
相关产品推荐

