在R中使用mapview绘制含无数据县空心边界的中国县级地图
解决无数据县域不显示的问题
核心思路
- 从原始县级边界数据中筛选出未匹配到CSV数据的县域,单独作为一个图层
- 在mapview中先渲染有数据的填充图层,再叠加无数据的空心轮廓图层
修改后的完整代码
library(sf) library(sp) library(tidyverse) library(mapview) library(leaflet) # 读取并转换县级边界数据 admin2 = readOGR("CHN_adm2.shp", verbose = FALSE) admin2_sf = st_as_sf(admin2) # 读取CSV数据并转换数值类型 AllLines_ins <- read_csv("AllLines_Updated.csv") AllLines_ins$`All Lines` <- as.numeric(AllLines_ins$`All Lines`) # 关联数据:保留所有县级边界(all.x=TRUE),标记未匹配到数据的县域 China_Alllines <- merge(x = admin2_sf, y = AllLines_ins, by = "NAME_2", all.x = TRUE) # 处理数值分段(修正原代码中zcol的变量名错误:TSI改为TSB) breaks2 <- c(min(China_Alllines$All.Lines, na.rm = TRUE), 10000000,50000000,100000000,150000000,200000000,250000000, 300000000,350000000,400000000,450000000,500000000,550000000, 600000000,650000000,max(China_Alllines$All.Lines, na.rm = TRUE)) lable2 <- c("<= 10 Million", "10 - 50 Million", "50 - 100 Million", "100 - 150 Million", "150 - 200 Million" , "200 - 250 Million", "250 - 300 Million","300 - 350 Million" , "350 - 400 Million" , "400 - 450 Million", "450 - 500 Million" , "500 - 550 Million", "550 - 600 Million","600 - 650 Million" ,"> 650 Million" ) China_Alllines$All.Lines <- as.numeric(China_Alllines$All.Lines) China_Alllines$TSB <- cut(China_Alllines$All.Lines, breaks=breaks2, include.lowest=TRUE, right=FALSE, labels=lable2, na.rm = TRUE) # 拆分有数据/无数据的县域图层 has_data <- China_Alllines %>% filter(!is.na(All.Lines)) no_data <- China_Alllines %>% filter(is.na(All.Lines)) # 渲染地图:先加载填充图层,再叠加空心轮廓图层 mapView(has_data, zcol = "TSB", col.regions=c("#FFFC33","#FFE333","#FFD433","#FFB833","#FF9933","#FF8333", "#FF6833","#E3511E","#E3451E","#CB3611","#AF2C0B","#AF210B", "#971D0B","#B22222","#971D0B"), aspect=1.5, legend=TRUE) + mapView(no_data, col.regions = "transparent", # 填充透明 color = "#888888", # 边框设为灰色 lwd = 1) # 边框宽度调整
关键改动说明
- 将
merge的all=F改为all.x=TRUE:保留所有原始县级边界,同时用NA标记未匹配到数据的县域 - 拆分出两个图层:分别处理有数据的填充样式和无数据的空心轮廓样式
- 修正原代码中
zcol="TSI"的错误:实际生成的分段列是TSB - 叠加图层时设置无数据图层的填充透明、边框灰色,还原QGIS的空心轮廓效果
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

