使用st_write()与write_sf()导出sf对象为Shapefile遇写入错误求助
导出sf对象为ESRI Shapefile时的写入错误分析
尝试用st_write()和write_sf()导出sf对象为Shapefile时均报错,相关代码及报错信息如下:
1. 第一次调用st_write()的报错
> st_write(twitter_data_sf, "Data/twt.shp", append=F) Deleting layer `twt' using driver `ESRI Shapefile' Writing layer `twt' to data source `Data/twt.shp' using driver `ESRI Shapefile' Updating existing layer twt Writing 68077 features with 29 fields and geometry type Point. Unknown field name `epoch': updating a layer with improper field name(s)? Error: Write error In addition: Warning message: In abbreviate_shapefile_names(obj) : Field names abbreviated for ESRI Shapefile driver
2. 第一次调用write_sf()的报错
> write_sf(twitter_data_sf,"PT14.shp", driver = "ESRI Shapefile", overwrite_layer = TRUE) Unknown field name `in_rply_t_st_': updating a layer with improper field name(s)? Error: Write error In addition: Warning messages: 1: In abbreviate_shapefile_names(obj) : Field names abbreviated for ESRI Shapefile driver 2: In CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), : GDAL Message 6: Normalized/laundered field name: 'in_rply_t_st_' to 'in_rply_t_' 3: In CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), : GDAL Message 6: Normalized/laundered field name: 'in_rply_t_sr_' to 'in_rply__1'
3. 第二次调用st_write()的报错
> st_write(twitter_data_sf, "Data/twt.shp", append=F) Error: Write error
4. 第二次调用write_sf()的报错
> write_sf(twitter_data_sf,"PT14.shp", driver = "ESRI Shapefile", overwrite_layer = TRUE) Unknown field name `in_rply_t_st_': updating a layer with improper field name(s)? Error: Write error In addition: Warning messages: 1: In abbreviate_shapefile_names(obj) : Field names abbreviated for ESRI Shapefile driver 2: In CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), : GDAL Message 6: Normalized/laundered field name: 'in_rply_t_st_' to 'in_rply_t_' 3: In CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options), : GDAL Message 6: Normalized/laundered field name: 'in_rply_t_sr_' to 'in_rply__1'
错误原因分析
ESRI Shapefile对字段名有严格的格式限制:
- 字段名长度不能超过10个字符
- 不能以下划线结尾
- 仅允许包含字母、数字和下划线,无特殊字符
从报错信息可以定位核心问题:
- 字段
epoch在更新已有图层时出现命名匹配问题,可能是旧图层无此字段,或自动命名修正后引发冲突 - 字段
in_rply_t_st_以下划线结尾,违反Shapefile命名规范,GDAL自动修正为in_rply_t_后仍出现识别异常,导致写入失败 - 警告信息
abbreviate_shapefile_names说明存在超过10字符的字段名,系统自动缩写后可能出现重复或不符合规范的情况,进一步触发错误
解决办法
- 手动修改sf对象的字段名,确保所有字段符合Shapefile规范:
# 示例:重命名不符合规范的字段 names(twitter_data_sf)[names(twitter_data_sf) == "in_rply_t_st_"] <- "in_rply_tst" names(twitter_data_sf)[names(twitter_data_sf) == "in_rply_t_sr_"] <- "in_rply_tsr" - 删除目标路径下已存在的所有Shapefile关联文件(.shp/.shx/.dbf等),避免更新图层时的字段冲突
- 导出时明确指定覆盖参数(
st_write用delete_layer = TRUE,write_sf用overwrite_layer = TRUE),确保完全替换旧文件
内容的提问来源于stack exchange,提问作者Pot23
相关产品推荐
相关产品推荐

