使用read_sf读取含德语变音符号的Shapefile时遇警告与错误
解决R中read_sf读取德语Shapefile的编码与数据丢失问题
核心原因
你的Shapefile采用非UTF-8编码(德语区常见编码为ISO-8859-1或Windows-1252),read_sf默认未适配该编码,导致变音符号解析错误,进而在数据合并时因州名不匹配丢失记录。
解决方案步骤
1. 检测并指定正确编码读取Shapefile
先确定Shapefile的实际编码,可借助readr包的工具检测DBF文件:
library(readr) guess_encoding('geo_ger/vg2500_bld.dbf')
选择返回结果中置信度最高的编码(比如ISO-8859-1),用以下方式读取:
# 方式1:设置全局编码后读取 options(encoding = "ISO-8859-1") ger <- read_sf('geo_ger/vg2500_bld.shp') # 方式2:通过st_read直接指定编码(read_sf的底层函数) ger <- st_read('geo_ger/vg2500_bld.shp', options = "ENCODING=ISO-8859-1")
如果读取后字段仍乱码,手动转换编码:
# 替换NAME为你的实际州名字段名 ger$NAME <- iconv(ger$NAME, from = "ISO-8859-1", to = "UTF-8")
2. 验证数据合并匹配
编码修复后,州名(如Baden-Württemberg、Schleswig-Holstein)会正常显示,此时合并数据不会出现匹配失败:
# 假设你的统计数据框为state_data,含州名字段state_name和数值字段value ger_merged <- merge(ger, state_data, by.x = "NAME", by.y = "state_name", all.x = TRUE) # 检查是否保留全部16个州 nrow(ger_merged)
3. 用ggplot2绘制分级统计图
编码问题解决后,正常绘制即可:
library(ggplot2) ggplot(ger_merged) + geom_sf(aes(fill = value)) + scale_fill_viridis_c(option = "mako") + labs(title = "德国联邦州分级统计图", fill = "指标值") + theme(axis.text = element_blank(), axis.ticks = element_blank())
额外提示
- 避免使用
rgdal的readOGR,其编码处理逻辑更复杂,sf包是当前R空间数据处理的标准工具。 st_transform(4326)仅用于坐标系转换,和编码问题无关,无需调整这一步。
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

