基于R语言的空间信息聚合:国家转大洲级数据聚合需求
实现国家到大洲的数据聚合与层级切换
1. 数据聚合(从国家到大洲)
从你已合并好的sp对象(假设名为merged_sp)中提取内嵌数据框,用dplyr按大洲分组聚合。以下示例以求和为例,你可根据需求替换为均值、中位数等统计方式,同时处理NA值:
library(dplyr) # 从sp对象提取数据并聚合 continent_agg_data <- merged_sp@data %>% group_by(大洲) %>% # 注意匹配你实际的大洲字段名,比如英文"continent" summarise( Value1 = sum(Value1, na.rm = TRUE), Value2 = sum(Value2, na.rm = TRUE), Value3 = sum(Value3, na.rm = TRUE), Value4 = sum(Value4, na.rm = TRUE), country_count = n_distinct(Country, na.rm = TRUE) # 可选:统计大洲内有效国家数 ) %>% ungroup()
如果你的countryValueData已关联大洲信息,也可直接基于该数据框聚合:
continent_agg_data <- countryValueData %>% left_join(merged_sp@data %>% select(Country, 大洲), by = "Country") %>% group_by(大洲) %>% summarise( Value1 = sum(Value1, na.rm = TRUE), Value2 = sum(Value2, na.rm = TRUE), Value3 = sum(Value3, na.rm = TRUE), Value4 = sum(Value4, na.rm = TRUE) ) %>% ungroup()
2. 构建大洲级空间对象(如需绘制带边界的气泡图)
若原shapefile无大洲级边界,可将国家级sp对象按大洲合并:
library(sp) # 按大洲合并空间多边形 continent_sp <- unionSpatialPolygons(merged_sp, IDs = merged_sp@data$大洲) # 将聚合数据关联到大洲空间对象 continent_sp@data <- continent_agg_data %>% right_join(data.frame(大洲 = names(continent_sp)), by = "大洲")
3. 实现气泡图层级切换
以tmap为例,通过图层分组实现交互切换:
library(tmap) # 国家层级气泡图 map_country <- tm_shape(merged_sp) + tm_bubbles(size = "Value1", col = "Value1", popup.vars = c("Country", "Value1", "Value2")) + tm_layout(title = "国家层级数据") # 大洲层级气泡图 map_continent <- tm_shape(continent_sp) + tm_bubbles(size = "Value1", col = "Value1", popup.vars = c("大洲", "Value1", "country_count")) + tm_layout(title = "大洲层级数据") # 开启交互模式并添加切换控件 tmap_mode("view") tm_add_layer(map_country, group = "国家层级") + tm_add_layer(map_continent, group = "大洲层级") + tm_view(control.pos = "topright", legend.pos = "bottomright")
若使用leaflet,可通过addLayersControl实现切换:
library(leaflet) # 构建切换地图 leaflet() %>% addTiles() %>% addLayersControl( baseGroups = c("国家层级", "大洲层级"), options = layersControlOptions(collapsed = FALSE) ) %>% # 添加国家层级气泡 addCircleMarkers( data = merged_sp, radius = ~sqrt(Value1)*2, # 调整气泡缩放比例 color = ~colorNumeric("viridis", Value1)(Value1), popup = ~paste("<b>", Country, "</b><br>Value1:", Value1, "<br>Value2:", Value2), group = "国家层级" ) %>% # 添加大洲层级气泡 addCircleMarkers( data = continent_sp, radius = ~sqrt(Value1)*3, color = ~colorNumeric("viridis", Value1)(Value1), popup = ~paste("<b>", 大洲, "</b><br>Value1总和:", Value1, "<br>国家数量:", country_count), group = "大洲层级" )
关键注意事项
- 确保大洲字段名在所有数据集中统一,避免匹配错误。
- 聚合逻辑需贴合业务需求:总量用
sum、平均水平用mean,务必保留na.rm = TRUE处理缺失值。 - 气泡大小的缩放比例需根据数据范围调整,避免气泡过大或过小影响可视化效果。
内容的提问来源于stack exchange,提问作者Mr.CR
相关产品推荐
相关产品推荐

