Tại sao khe dữ liệu @ data @ cho RasterLayer chỉ chứa logic (0) mà không chứa giá trị thực?


12

Cố gắng tìm hiểu sâu về lý do tại sao, khi tôi đọc trong một raster của NDVI, khe giá trị @ data @ không chứa các giá trị thực cho đến khi tôi đặt chúng theo cách thủ công. Ví dụ:

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

Điều này đã không xảy ra với các trình quét khác mà tôi đã tải bằng cùng một phương thức, vì vậy tôi bối rối. Tôi ước tôi có thể cụ thể hơn nhưng tôi không nhớ đã làm gì khác trước đây. Thật dễ dàng để có được các giá trị bằng tay, bằng cách sử dụng:

    NDVI1@data@values <- getValues(NDVI19east)

Nhưng nó vẫn là một nỗi đau để làm như vậy cho mọi tập tin. Vì vậy, câu hỏi hai phần:

  1. Tại sao điều này xảy ra ở nơi đầu tiên? Tôi hiểu rằng nó có thể có liên quan đến cách lưu trữ tệp raster (nghĩa là nó có trong bộ nhớ hay không) nhưng tôi thực sự không thể hiểu làm thế nào thay đổi phương thức tôi nên sử dụng để truy cập dữ liệu ...

  2. Có cách nào để tự động hóa quá trình này (có lẽ sử dụng một phương thức tương tự như lapply) để đọc các tệp dưới dạng RasterLayers và truy cập các giá trị cho các tệp đó? Dự án hiện tại của tôi liên quan đến việc đọc 6-10 tệp tại một thời điểm cho NDVI, Lượng mưa và các biến môi trường khác, để kết hợp chúng và thực hiện một số lớp phủ có trọng số. Nó sẽ hữu ích để tự động hóa quá trình nhập dữ liệu.


6
Không sử dụng @ trừ khi bạn đang phát triển mã nội bộ - sử dụng readAll (NDVI). Nó xảy ra như một kỹ thuật hiệu quả bộ nhớ, bạn có thể mở các lưới rất lớn như một lời hứa - raster hứa sẽ lấy dữ liệu (thông qua rgdal, qua GDAL trong trường hợp này) khi bạn thực sự cần các số. Nếu bạn cần lưu đối tượng dưới dạng đối tượng R độc lập không bị ràng buộc với tệp readAll là cách thực hiện. Xem? Raster "Trong nhiều trường hợp. (Ban đầu) không chứa bất kỳ giá trị ô (pixel) nào trong (RAM)"
mdsumner

2
những logical(0)là trong thực tế giá trị cho bất kỳ Raster * đối tượng được tạo ra từ một tập tin. Dù bằng cách nào, như @mdsumner nói, không trực tiếp đọc các giá trị này và chắc chắn không đặt chúng! (mặc dù bạn NDVI1@data@values <- getValues(NDVI19east)sẽ không ảnh hưởng đến bất cứ điều gì , những giá trị này bị bỏ qua). Nó có thể nằm sâu hơn trong kịch bản của bạn khi bạn không hiểu cách sử dụng hiệu quả các đối tượng này. Bạn có thể sử dụng getValues, nhưng thậm chí điều đó hiếm khi cần thiết. Cung cấp một ví dụ đơn giản, khép kín, về những gì bạn đang cố gắng đạt được.
Robert Hijmans

2
Cảm ơn tất cả rất nhiều. Cuối cùng tôi đã hoàn thành những gì tôi cần với readAll () như mdsumner đã nói, vì vậy cảm ơn vì điều đó - đó là lời khuyên tốt! Gần đây tôi mới sử dụng gói raster vì vậy tôi thực sự chưa nhận thức được chức năng đó và nhu cầu sử dụng nó để truy cập các giá trị thực của các tệp lớn.
Henry Hawkins Wells

Câu trả lời:


3

Câu hỏi này đã được trả lời trong các ý kiến ​​(bởi mdsummer ). Đây chỉ là một cách để đưa những ý tưởng đó theo thứ tự và đưa câu hỏi này ra khỏi hàng đợi chưa được trả lời.

Tại đây bạn có thể tải xuống NVDI của jpg trên toàn thế giới từ nasa .

Ở đây bạn có mã và một tệp raster để thử .

Như trong câu hỏi, tải raster vào R với hàm raster () không tải các giá trị thực vào bộ nhớ.

nhập mô tả hình ảnh ở đây

Như bạn thấy, các giá trị NVDI @ data @ không có giá trị trong khi biểu đồ có thể được hiển thị hiển thị các giá trị "ẩn" đó. Bạn có thể thấy rằng, nếu bạn tải tệp vào QGIS, các giá trị thực sự được đọc.

nhập mô tả hình ảnh ở đây

Vì vậy, bạn phải sử dụng hàm readAll () từ gói raster (như mdsummer đã nói trong các bình luận). Đây là mã:

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)

Sử dụng chức năng này bây giờ bạn có thể truy cập vào các giá trị raster trong tệp.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.