В настоящее время я использую следующий сценарий для добавления некоторых данных атрибутов из таблицы во множество отдельных шейп-файлов:
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
При просмотре таблицы атрибутов шейп-файлов после этого процесса имя поля было сокращено до «ENGL_», но я хочу, чтобы оно оставалось «ENGL_NAME». Есть ли способ отключить это сокращение?
Любая помощь высоко ценится.
Ответы:
Вы не можете, это проблема с шейп-файлом. См. Http://gdal.org/drv_shapefile.html в разделе «Параметры создания».
источник
writeOGR
? Это действительно вопрос формата?Ваше 'ENGL_NAME' вообще не должно быть сокращенным (менее 10 символов), но, похоже, writeOGR имеет свою собственную волю.
Вместо того
ты можешь попробовать
Поскольку writeSpatialShape, похоже, не имеет параметра для места назначения, я нашел этот обходной путь, переключая рабочий каталог назад и вперед.
Другая проблема заключается в том, что он не создает .prj-файл, но это небольшая проблема по сравнению с уничтоженными именами полей.
В ожидании времени, когда формат + * # -! (/ ESRI Shapefile окончательно сдох и заменен на ... хорошо?
источник
У меня были похожие проблемы с работой в RStudio. Согласно совету в различных комментариях и ответах выше, мое решение для выжженной земли:
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')
но пока не запускайтеwriteOGR () использует base :: abbreviate - вот тест с копией строк 158-164:
Вы можете видеть, что на самом деле он вызывает сокращения дважды (возможно, бессмысленно, я не могу понять, как вы вызвали бы этот цикл), и если хотя бы одно имя столбца> 10, то оно укорачивает любое имя столбца с> 7 символами. Я не могу понять, почему нужно очищать рабочее пространство и перезапускать, если writeOGR ранее выполнялся для того же объекта, но, возможно, это как-то связано с тем, что fld_names является именованным символьным вектором. Это могло бы работать лучше, если as.character () был обернут вокруг abbreviate ().
источник
Как уже упоминалось, шейп-файлы имеют ограничение на количество символов в имени поля 10 символов. writeOGR удовлетворяет этому требованию, изменяя заголовки полей с помощью некоторого алгоритма, который устанавливает приоритеты для символов, которые нужно удалить, когда имя поля превышает предел. Я не уверен, как это работает, но кажется, что он сокращает имена полей странным и непредсказуемым образом и может сократить имена полей таким образом, который уже удовлетворял требованию 10.
Вот моя работа вокруг. Использование strtrim () и установка длины символа в 10 приведет к усечению имен полей до 10 символов более предсказуемо, чем автоматизация writeOGR.
Одна из проблем, с которой вы можете столкнуться, заключается в том, что если у вас есть имена полей, которые идентичны для первых 10 символов, но у меня такая проблема возникает редко.
Я применяю это каждый раз, когда экспортирую шейп-файл, на всякий случай.
источник