2017-05-18 14 views
0
에서 I 사용 다각형 모양 파일에 여러 개의 래스터 레이어의 중앙값 추출한

:R : 추출 래스터 데이터는 매트릭스로 추가 Shape 파일 방법 - 오류 writeOGR

:
#read shapefile 
huc12 <- readOGR(dsn=gdb1, layer="HUC12_proj") 

#read raster 
temp.avg <- raster("projected_climate_rasters/temp_avg_copy") 

#extract median of raster for each polygon 
huc12$Temp.Avg.Med <- extract(temp.avg, huc12, fun = median) 

난 수치에 데이터 변환을
[email protected] <- transform([email protected], Temp.Avg.Med = as.numeric(Temp.Avg.Med)) 

데이터가 모두 셰이프 파일에 첨부 된 것처럼 보입니다. 그러나 추가 된 데이터 세트 중 하나는 매트릭스로 첨부 된 것처럼 보입니다. 또 다른 (PET_AnCV)는 다음과 같이 나타납니다 동안

.. ..$ Temp.Avg. Med: num [1:877000] 962 ... 

: I가 시도 될 때까지

.. ..$ PET_AnCV : num [1:87700, 1] 94.4 ... 

나는이 발견되지 않았습니다 예를 들어, Temp.Avg.Med 데이터는 데이터 @ huc12 아래에 나타납니다 새 모양 파일을 작성하면 다음 오류가 발생합니다.

> write_shape(huc12, "huc12") 
Error in writeOGR(shp, dir, base, driver = "ESRI Shapefile", overwrite_layer = TRUE) : 
Can't convert columns of class: matrix; column names: PET_AnCV 

제안 사항? (데이터를 포함하고 있기 때문에 이것을 재현 할 수 없으며 예제 shapefile을 사용하여 재현 할 수 없습니다.)

답변

0

이것은 PET_AnCV의 값 추출이 벡터가 아닌 행렬이기 때문입니다. 피쳐 당 행 (즉, 다각형)이있는 행렬과 레이어 당 열이있는 다중 레이어 래스터에서 값을 추출하면 정상입니다. 이 경우 하나 개의 레이어 (및 열), 그래서 당신은 쉽게 당신이 Shape 파일에 할당하고있는 각각의 열을 선택할 수 있습니다 :

vals <- extract(PET_AnCV,huc12) 
huc12$PET_AnCV <- vals[,1] 

을하지만 그건 정말 가장 좋은 방법이 아니다 이후, 나는 ' 조금 더 설명하고 예를 들어 보겠습니다.

이 전체 행렬이 shapefile 속성 테이블의 하나의 열에 지정되었다는 오류 메시지가 나타납니다. 이것은 R에있는 동안 (목록의 슬롯이기 때문에) 괜찮지 만 일단 파일을 디스크에 쓰려고하면 문제가 발생합니다.

추출 된 값을 shapefile에 직접 쓰는 대신 foreign 패키지의 기능을 사용하여 shapefile의 dbf 파일에 결과를 저장할 수 있습니다. 이것은보다 깨끗한 접근 방식이며, 수행중인 작업을보다 잘 제어 할 수 있습니다. 셰이프 파일의 크기가 크거나 다각형이 많은 경우 훨씬 빠릅니다. 재현 예를 들어로서

, 방법이있다 :

나는 당신의 Shape 파일로 펜던트로 (11 별개의 다각형을 가지고) 오스트리아의 관리-1 테두리를 사용하고 있습니다 : 여기

# load libraries 
library(raster) 
library(rgdal) 
library(foreign) 

# download shapefile which is used for extraction 
huc12 <- getData('GADM', country='AUT', level=1) 

아직 dbf 파일이 없기 때문에 디스크에 쓰기를해야합니다. 이미 가지고 있기 때문에이 부분을 건너 뛸 수 있습니다.

# create fake value rasterbrick 
ras <- raster() 
PET_AnCV <- lapply(1:10,function(x) setValues(ras,runif(ncell(ras)))) 
PET_AnCV <- do.call(brick,PET_AnCV) 

가 지금은 값을 추출하고있어 cbind를 사용하여 DBF 파일을 추가합니다에서 추출하는 어떤 임의의 값으로 10 층 rasterbrick 만들기

# write to disk 
writeOGR(huc12,dsn = 'huc12.shp','huc12',driver = 'ESRI Shapefile') 

.변수 이름은 다중 레이어 래스터의 레이어 이름에 해당하는 열 이름입니다. 이것들이 일반적이거나 설명이 충분하지 않으면 colnames(vals) <- new_name_vector으로 쉽게 변경할 수 있습니다.

# extract values and append to dbf 
vals <- extract(PET_AnCV,huc12,fun=median) 

dbf <- read.dbf('huc12.dbf') 
dbf <- cbind(dbf,vals) 
write.dbf(dbf,'huc12.dbf') 

HTH

+0

발 : 시간을내어 주셔서 대단히 감사합니다! 이것은 매우 도움이되었다! – Micah