“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

답변:


9

당신은 할 수 없습니다. 이것은 shapefile 문제입니다. '작성 옵션'의 http://gdal.org/drv_shapefile.html 을 참조하십시오.


그래서 그것은 문제가되지 writeOGR않습니까? 실제로 형식의 문제입니까?
Tomas

1
옳은. dbf 열 이름 길이가 제한됩니다. 예를 들어 sqlite / spatialite와 같은 다른 형식은 이름을 자르지 않습니다 (sqlite에는 매우 큰 한계가 있지만 10보다 큰 차수는 있습니다).

3
dbf에 쓸 때 열 이름의 일반적인 약어와 거기에서 writeOGR 이하는 일에는 차이가 있습니다! writeOGR은 10보다 짧은 필드 이름조차도 무너 뜨립니다. 내 예 : 내 R 열 이름 "ora_nachweis_id"는 "or_nch_"가되고 writeSpatilaPolygon은 일반적인 약어- "ora_nachwe"를 사용합니다. 내 변수 "LblColor"(8 자!)조차 "LblColr"이됩니다.
Bernd V.

db / data 구조에 유사한 열 이름이 있습니까? 나는 ogr2ogr과 그 이름을 가진 sqlite db로 복제 할 수 없었습니다. 샘플을 제공 할 수 있다면 더 자세히 보거나 R 바인딩이 문제를 일으키는 것일 수 있습니다.

1
링크가 죽었지 만 필드 이름이 10 자보다 긴 shapefile이 있습니다. shapefile 문제인 경우 왜 이것이 가능합니까?
Matt

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에서 비슷한 문제가 발생했습니다. 위의 다양한 의견과 답변에 대한 조언에 따르면, 내 황량한 해결책은 다음과 같습니다.

  • SpatialWhateverDataFrame을 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 :: abbreviate를 사용 합니다 . 다음은 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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.