RasterLayer의 @ data @ values ​​슬롯에 실제 값이 아닌 논리 (0) 만 포함되는 이유는 무엇입니까?


12

왜 NDVI의 래스터를 읽을 때 @ data @ values ​​슬롯에 수동으로 설정할 때까지 실제 값이 포함되어 있지 않은 이유를 알아 내려고합니다. 예를 들면 다음과 같습니다.

    NDVI <- raster("./filename.tif", crs="+proj=longlat +datum=WGS84")
    NDVI@data@values
            ## returns: logical(0)

이것은 같은 방법으로로드 한 다른 래스터에서는 발생하지 않았으므로 혼란 스럽습니다. 좀 더 구체적으로 할 수 있기를 바라지 만 이전에 다르게 행동 한 것을 기억하지 못합니다. 다음을 사용하여 수동으로 값을 얻는 것이 쉽습니다.

    NDVI1@data@values <- getValues(NDVI19east)

그러나 모든 파일에 대해 그렇게 해야하는 것은 여전히 ​​고통 스럽습니다. 그래서 두 부분으로 된 질문 :

  1. 왜 이런 일이 처음에 일어 났습니까? 래스터 파일이 저장되는 방법 (예 : 메모리에 있는지 여부)과 관련이있을 수 있지만 데이터 액세스에 사용해야하는 방법이 어떻게 변경되는지 이해할 수는 없습니다 ...

  2. RasterLayers로 파일을 읽고 해당 파일의 값에 액세스하기 위해이 프로세스를 자동화 할 수있는 방법이 있습니까 (아마도 lapply와 유사한 방법을 사용)? 현재 진행중인 프로젝트는 NDVI, Rainfall 및 기타 환경 변수에 대해 한 번에 6-10 개의 파일을 읽고 이들을 결합하고 가중치 중첩을 수행하는 것입니다. 데이터 가져 오기 프로세스를 자동화하는 것이 도움이됩니다.


6
내부 코드를 개발하지 않는 한 @를 사용하지 마십시오. readAll (NDVI)을 사용하십시오. 메모리 효율성 기술로 발생하므로 매우 큰 그리드를 일종의 약속으로 열 수 있습니다. 래스터는 실제로 숫자가 필요할 때 (rgdal, GDAL을 통해) 데이터를 가져 오는 약속입니다. 객체를 파일에 묶이지 않은 독립형 R 객체로 저장해야하는 경우 readAll이 수행 방법입니다. "많은 경우에 ... (RAM)에 어떤 셀 (픽셀) 값도 포함하지 않습니다"
mdsumner

2
logical(0)사실에 대한 값입니다 어떤 파일에서 생성 된 래스터 * 객체입니다. 어느 쪽이든 @mdsumner가 말했듯 이이 값을 직접 읽지 말고 확실히 설정하지 마십시오! ( 아무것도NDVI1@data@values <- getValues(NDVI19east) 영향을 미치지 않지만 이러한 값은 무시됩니다). 이러한 객체를 효과적으로 사용하는 방법을 이해하지 못하는 경우 스크립트 아래에있을 것입니다. getValues를 사용할 수 있지만 거의 필요하지 않습니다. 달성하고자하는 것에 대한 단순하고 독립적 인 예를 제공하십시오.
Robert Hijmans

2
대단히 감사합니다. mdsumner가 말한 것처럼 readAll ()을 사용하여 필요한 것을 달성 했으므로 감사합니다. 좋은 조언이었습니다! 나는 최근 래스터 패키지를 처음 사용했기 때문에 그 기능을 아직 알지 못했고 큰 파일의 실제 값에 액세스하기 위해이 기능을 사용해야한다는 것을 솔직히 알지 못했습니다.
Henry Hawkins Wells

답변:


3

이 질문에 대한 코멘트는 mdsummer에 의해 답변되었습니다 . 이것은 아이디어를 정리하고 답을 얻지 못한 채이 질문을 얻는 방법입니다.

여기에서 nasa에서 전세계 jpg의 NVDI를 다운로드 할 수 있습니다 .

여기에 코드와 래스터 파일이 있습니다.

문제에서 알 수 있듯이 raster () 함수를 사용하여 래스터를 R에로드하면 실제 값이 메모리에로드되지 않습니다.

여기에 이미지 설명을 입력하십시오

보시다시피, NVDI @ data @ values에는 값이 없지만 그 "숨겨진"값을 표시하는 플롯을 렌더링 할 수 있습니다. 파일을 QGIS에로드하면 실제로 값을 읽는 것을 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

따라서 래스터 패키지에서 readAll () 함수를 사용해야합니다 ( mdsummer 가 주석에서 언급 했듯이 ). 코드는 다음과 같습니다.

library(raster)

NDVI <- raster("./RenderData.tif", crs="+proj=longlat +datum=WGS84")
NDVI@data@values
str(NDVI)
plot(NDVI)

NDVI.all <- readAll(NDVI)
head(NDVI.all@data@values)

이 기능을 사용하면 파일 내의 래스터 값에 액세스 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.