使用“ ESRI Shapefile”驱动程序时如何从缩写字段名称中停止writeOGR


18

我目前正在使用以下脚本将表中的某些属性数据添加到很多单独的shapefile中:

library(rgdal)
specieslist <- read.csv("SpeciesList1.txt", header=F)
attdata <- read.table("TestAtt.csv", sep = ",", header=T)
for (n in 1:dim(specieslist)[1]) 
{
speciesname <- specieslist[n,1]
shp <- readOGR("Mesoamerica_modified_polygons", speciesname)
shp$ENGL_NAME<-attdata[n,2]
writeOGR(shp, "PolygonsV2", speciesname, driver="ESRI Shapefile")
}

最后我得到以下警告:

1: In writeOGR(shp, "PolygonsV2", speciesname, driver = "ESRI Shapefile") :
Field names abbreviated for ESRI Shapefile driver

在此过程之后查看shapefile的属性表时,字段名称已缩短为“ ENGL_”,但我希望它保持为“ ENGL_NAME”。有没有办法关闭此缩写?

任何帮助,不胜感激。


shapefile中是否有任何字段名称> 10个字符?看起来像是我的R绑定中的错误。
geographika

1
嗨,我只是重新运行了脚本,现在它不是缩写。我不确定是什么原因导致的...
JPD 2012年

Answers:


9

您不能,这是一个shapefile问题。请参阅“创建选项”下的http://gdal.org/drv_shapefile.html


所以这不是问题writeOGR吗?确实是格式问题吗?
2014年

1
正确。dbf列名称长度受到限制。另一种格式,例如sqlite / spatialite不会截断名称(sqlite有非常大的限制,但10以上的数量级很多)。

3
好吧,写入dbf时,通常使用的列名缩写与writeOGR在此处所做的操作之间有区别!即使字段名短于10,writeOGR也会使它们残缺不全。我的示例:我的R列名称“ ora_nachweis_id”变为“ or_nch_”,而writeSpatilaPolygon进行普通缩写->“ ora_nachwe”。甚至我的变量“ LblColor”(8个字符!)也变为“ LblColr”。
Bernd V.

db / data结构中是否有相似的列名?我无法使用ogr2​​ogr和带有这些名称的sqlite数据库进行复制。如果您可以提供一个示例,我可以进一步看一下,否则R绑定可能会引起问题。

1
链接已死,而且我的shapefile的字段名长于10个字符;为什么这是一个shapefile问题,为什么可行?
马特

7

您的“ ENGL_NAME”根本不应缩写(少于10个字符),但是writeOGR似乎有其自己的意愿。

代替

writeOGR(shp, "PolygonsV2", speciesname, driver="ESRI Shapefile")

你可以尝试

library(maptools)
currdir <- getwd() #store your current working directory
setwd(paste(currdir,"PolygonsV2",sep="/")) #switch to your desired folder

writeSpatialShape(shp, speciesname) # write shapefile

setwd(currdir) #switch back to parent folder

由于writeSpatialShape似乎没有目标的参数,因此我发现此解决方法来回切换工作目录。

另一个问题是,它不会产生.prj文件,但是与被破坏的字段名称相比,这是一个小问题。

等待+ *#-!(/ ESRI Shapefile格式最终失效并由...替换吗?


替换为geopackage?
jsta

3

我在RStudio中遇到了类似的麻烦。根据以上各种评论和答案中的建议,我的焦土解决方案是:

  • at the point where the SpatialWhateverDataFrame is ready to be written to Shape, make a copy
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) 只是要确定
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') 但不要运行它
  • 保存脚本,清除包含隐藏对象的工作区,重新启动R,重新运行整个脚本。

writeOGR()使用base ::缩写 -这是一个测试,带有第158-164行的副本:

fld_names <- c('short', 'longlonglong', 'middle_1')
if (any(nchar(fld_names) > 10)) {
    fld_names <- abbreviate(fld_names, minlength = 7)
    warning("Field names abbreviated for ESRI Shapefile driver")
    if (any(nchar(fld_names) > 10)) 
      fld_names <- abbreviate(fld_names, minlength = 5)
  }

> fld_names
       short longlonglong     middle_1 
     "short"    "lnglngl"    "middl_1" 
> names(fld_names)
[1] "short"        "longlonglong" "middle_1"  

您可以看到它实际上两次调用了缩写(可能毫无意义,我无法弄清楚如何触发该子循环),并且即使一个列名> 10,也将缩短任何列名,且其字符数> 7。我不能弄清楚为什么以前必须在同一个对象上运行writeOGR才能清理工作区并重新启动,但是也许与fld_names是一个命名字符向量有关。如果将as.character()包裹在abbreviate()周围,则可能会更好。


嘿,谢谢。我不想丢失我的PRJ文件,因此阅读此答案很有帮助。在致电writeOGR之前,我将所有字段名都设置为10个或更少的字符,并且都没有缩写为7。–
Nova

-1

如前所述,shapefile的字段名称字符限制为10个字符。writeOGR通过使用某种算法来更改字段标题来满足此要求,该算法优先考虑当字段名称超过限制时要删除的字符。我不确定它是如何工作的,但是它似乎以奇怪且不可预测的方式缩短了字段名,并且可以以这种方式缩短已经满足10个要求的字段名。

这是我的工作。使用strtrim()并将字符长度设置为10将比writeOGR的自动化方式更容易地将字段名截断为10个字符。

您可能遇到的一个问题是,如果字段名的前10个字符相同,但我很少遇到此问题。

每次导出shapefile时都会应用此方法,以防万一。

library(sp)
library(rgdal)

table <- data.frame(X_Coordinates = runif(10)*1000, 
                    Y_Coordinates = runif(10)*1000, 
                    LongFieldNameForData = runif(10))

p <- SpatialPointsDataFrame(SpatialPoints(table), data = table)

names(p) <- strtrim(names(points),10)

writeOGR(p, "OutputDirectory", "Points", "ESRI Shapefile")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.