Як зупинити writeOGR від скорочення імен полів при використанні драйвера "ESRI Shapefile"


18

Наразі я використовую такий сценарій, щоб додати деякі дані атрибутів із таблиці до безлічі індивідуальних файлів:

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". Чи є спосіб вимкнути це скорочення?

Будь-яка допомога дуже цінується.


Чи є якесь із імен полів у формі файла> 10 символів? Схоже, помилка в R-прив'язці до мене.
geographika

1
Привіт, я просто перезапустив сценарій і тепер він не скорочується. Я не впевнений, що змінилося, щоб викликати це, хоча ...
JPD

Відповіді:


9

Ви не можете, це проблема форм-файлів. Див. Http://gdal.org/drv_shapefile.html у розділі "Параметри створення"


значить, це не питання writeOGR? Це насправді питання формату?
Томаш

1
Правильно. Довжина імен стовпців dbf обмежена. Інший формат, наприклад sqlite /paceite, не повинен би усікати імена (у sqlite є дуже великі обмеження, але багато порядків вище 10).

3
Що ж, є різниця між нормальною абревіатурою назв стовпців під час запису в dbf і тим, що там пишеOGOGR! writeOGR калічить навіть назви полів коротше 10. Мої приклади: Моє ім'я R-стовпця "ora_nachweis_id" стає "or_nch_", тоді як writeSpatilaPolygon робить звичайне абревіатуру -> "ora_nachwe". Навіть моя змінна "LblColor" (8 символів!) Стає "LblColr".
Бернд В.

Чи схожі назви стовпців у структурі db / data? Я не міг повторити з ogr2ogr та sqlite db з цими іменами. Якщо ви можете надати зразок, я міг би подивитись далі, або, можливо, прив'язки R викликають проблеми.

1
Посилання мертве, але також у мене є файли форм з іменами полів набагато довші 10 символів; чому це можливо, якщо це проблема з форматом файлів?
Метт

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 нарешті мертвий і замінений на ... ну?


Замінений геопакетом?
jsta

3

У мене були подібні проблеми, працюючи в RStudio. За порадами в різних коментарях та відповідях вище, моє рішення про випалену землю:

  • в момент, коли SpatialWeverDataFrame готовий для запису у Shape, зробіть копію
  • 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 () було обгорнуто скороченим ().


Гей, дякую. Я не хотів втрачати файл PRJ, тому читання цієї відповіді допомогло. Перед тим, як зателефонувати на writeOGR, я зробив ВСІ назви своїх полів 10 і менше, і жодне не було скорочено до 7.
Нова

-1

Як уже згадувалося, форма файлів має обмеження символу поля на 10 символів. writeOGR відповідає цій вимозі, змінюючи заголовки поля за допомогою алгоритму, який визначає пріоритет, які символи потрібно видалити, коли є ім'я поля, яке перевищує обмеження. Я не впевнений, як це працює, але, схоже, скорочувати назви полів дивними та непередбачуваними способами, і можу скоротити імена полів таким чином, що вже відповідав умові 10.

Ось моя робота навколо. Використання strtrim () та встановлення довжини символів до 10 дозволить скоротити імена полів на 10 символів більш передбачувано, ніж автоматизація writeOGR.

Одне з питань, яке у вас може виникнути, - це якщо у вас є імена полів, однакові для перших 10 символів, але у мене рідко виникає ця проблема.

Я застосовую це щоразу, коли експортую файл форми, на всякий випадок.

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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.