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

在R中使用mapview绘制含无数据县空心边界的中国县级地图

解决无数据县域不显示的问题

核心思路

  1. 从原始县级边界数据中筛选出未匹配到CSV数据的县域,单独作为一个图层
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:06:05