ทำไมช่อง @ data @ values ​​สำหรับ RasterLayer มีเพียงลอจิคัล (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. มีวิธีทำให้กระบวนการนี้เป็นอัตโนมัติ (อาจใช้วิธีที่คล้ายกับ lapply) เพื่ออ่านไฟล์ในรูปแบบ RasterLayers และเข้าถึงค่าสำหรับไฟล์เหล่านั้นหรือไม่? โครงการปัจจุบันของฉันเกี่ยวข้องกับการอ่านครั้งละ 6-10 ไฟล์สำหรับ NDVI, ปริมาณน้ำฝนและตัวแปรสภาพแวดล้อมอื่น ๆ เพื่อรวมเข้าด้วยกันและทำงานซ้อนทับแบบถ่วงน้ำหนัก มันจะเป็นประโยชน์ในการทำให้กระบวนการนำเข้าข้อมูลเป็นไปโดยอัตโนมัติ


6
อย่าใช้ @ ยกเว้นว่าคุณกำลังพัฒนารหัสภายใน - ใช้ readAll (NDVI) มันเกิดขึ้นเป็นเทคนิคหน่วยความจำ - ประสิทธิภาพคุณสามารถเปิดกริดที่มีขนาดใหญ่มากเป็นสัญญา - แรสเตอร์สัญญาว่าจะดึงข้อมูล (ผ่าน rgdal ผ่าน GDAL ในกรณีนี้) เมื่อคุณต้องการตัวเลขจริง ๆ หากคุณต้องการบันทึกวัตถุเป็นวัตถุ R แบบสแตนด์อโลนโดยไม่ผูกติดกับไฟล์ readAll เป็นวิธีที่ทำได้ โปรดดู? raster "ในหลาย ๆ กรณี.. (เริ่มแรก) ไม่มีค่าเซลล์ (พิกเซล) ใน (RAM)"
mdsumner

2
logical(0)ในความเป็นจริงค่าสำหรับการใด ๆ Raster * วัตถุที่สร้างขึ้นจากแฟ้ม ไม่ว่าจะด้วยวิธีใดอย่างที่ @mdsumner บอกว่าอย่าอ่านค่าเหล่านี้โดยตรงและอย่าตั้งค่าแน่นอน! (แม้ว่าคุณNDVI1@data@values <- getValues(NDVI19east)จะไม่ส่งผลกระทบใด ๆค่าเหล่านี้จะถูกละเว้น) อาจเป็นไปได้อีกว่าสคริปต์ของคุณซึ่งคุณไม่เข้าใจวิธีการใช้วัตถุเหล่านี้อย่างมีประสิทธิภาพ คุณสามารถใช้ getValues ​​แต่ก็ไม่จำเป็น ยกตัวอย่างง่ายๆที่มีในตัวของสิ่งที่คุณพยายามทำ
Robert Hijmans

2
ขอบคุณมาก ๆ ฉันลงเอยด้วยการบรรลุสิ่งที่ฉันต้องการด้วย readAll () ตามที่ mdsumner พูดดังนั้นขอบคุณสำหรับสิ่งนั้น - มันเป็นคำแนะนำที่ดี! ฉันเพิ่งเริ่มใช้แพ็คเกจแบบแรสเตอร์เมื่อเร็ว ๆ นี้ดังนั้นฉันจึงยังไม่ทราบถึงฟังก์ชั่นนั้นและจำเป็นต้องใช้มันเพื่อเข้าถึงค่าจริงของไฟล์ขนาดใหญ่
เฮนรี่ฮอว์กินเวลส์

คำตอบ:


3

คำถามนี้ได้รับการตอบในความคิดเห็น (โดยmdsummer ) นี่เป็นเพียงวิธีที่จะนำความคิดเหล่านั้นมาเรียงลำดับและทำให้คำถามนี้ไม่อยู่ในคิว

ที่นี่คุณสามารถดาวน์โหลดทั่วโลก JPG ของ NVDI จากองค์การนาซ่า

ที่นี่คุณมีโค้ดและไฟล์ Raster ไปทดลอง

ดังที่ปรากฏในคำถามการโหลดแรสเตอร์ลงใน R ด้วยฟังก์ชั่น raster () ไม่ได้โหลดค่าจริงลงในหน่วยความจำ

ป้อนคำอธิบายรูปภาพที่นี่

อย่างที่คุณเห็นค่า NVDI @ data @ ไม่มีค่าในขณะที่พล็อตสามารถแสดงผลได้โดยแสดงค่า "hiden" เหล่านั้น คุณสามารถเห็นได้ว่าถ้าคุณโหลดไฟล์ลงใน 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.