วิธีการทำ RASTER จากข้อมูลจุดผิดปกติโดยไม่ต้องแก้ไข


13

ฉันพยายามสร้างภาพแรสเตอร์จากฐานข้อมูลจุดที่เว้นระยะไม่สม่ำเสมอ ข้อมูลดูเหมือนว่า -

> head(s100_ras)
         x       y         z
1 267573.9 2633781 213.29545
2 262224.4 2633781  69.78261
3 263742.7 2633781  51.21951
4 259328.4 2633781 301.98413
5 264109.8 2633781 141.72414
6 255094.8 2633781  88.90244

ฉันต้องการค่า 'z' เหล่านี้ภายในตาข่ายที่ฉันสร้างขึ้น

# Create a fine mesh grid
my_mesh=expand.grid(seq(min(s100_ras$Y),max(s100_ras$Y),l=100),
                    seq(min(s100_ras$X),max(s100_ras$X),l=100))

ฉันต้องการให้ค่า z ถูกกำหนดเป็น 'NA' สำหรับจุดตาข่ายที่อยู่นอกจุดข้อมูล คะแนนเหนือตาข่ายมีลักษณะดังนี้: https://drive.google.com/file/d/0B6GUNg-8d30vYzlwTkhvaHBFTnc/edit?usp=sharingเมื่อฉันลงจุด

plot(my_mesh)
points(s100_ras$Y, s100_ras$X, pch="*", col='blue')

ปัญหาคือฉันไม่แน่ใจว่าจะสร้างสิ่งนี้ได้อย่างไรขั้นตอนต่อไปนี้ใช้ไม่ได้เพราะตะแกรงตาข่ายและจุดข้อมูลของฉันไม่ได้อยู่ในระดับเดียวกัน !!

library(rgdal)
library(raster)
xyz<-cbind(my_mesh, s100_ras)
r <- rasterFromXYZ(xyz)
image(r)

ถ้าฉันพยายามสร้างแรสเตอร์โดยใช้จุดข้อมูล (ไม่มีตาข่าย) R จะเกิดข้อผิดพลาดเนื่องจากข้อมูลของฉันมีระยะห่างไม่สม่ำเสมอ!

library(sp)
s100_ras <- data.frame(expand.grid(x = s100_ras$Y, y = s100_ras$X), 
                       z = as.vector(s100_ras$mean))
coordinates(s100_ras) <- ~x+y
proj4string(s100_ras) <- CRS("+proj=utm +zone=46 +datum=WGS84")
gridded(s100_ras) = TRUE

suggested tolerance minimum: 0.916421 
Error in points2grid(points, tolerance, round) : 
  dimension 1 : coordinate intervals are not constant

ยิ่งกว่านั้นฉันพยายามเล่นด้วยฟังก์ชั่น 'rasterize' (สำหรับกริดที่ผิดปกติ) ของ 'raster package' แต่ไม่สามารถหามันได้ :( ฉันรู้วิธีการสอดแทรกและสร้างกริดปกติ แต่เพื่อประโยชน์ ของความคิดริเริ่มฉันต้องการหลีกเลี่ยงการแก้ไขมันเป็นไปได้ที่จะทำให้ raster ของจุดข้อมูลที่มีระยะห่างไม่สม่ำเสมอโดยไม่ต้องใช้วิธีการ idw หรือ kriging?


ปัญหาของกริดที่มีระยะห่างไม่สม่ำเสมอคืออัลกอริธึมล้มเหลวหากคะแนนอยู่ใกล้กันมากเกินไป วิธีแก้ปัญหา (ไม่เหมาะสม): ทำไมไม่ใช้ระยะห่างน้อยที่สุดระหว่างเซลล์และสร้างกริดเวกเตอร์สี่เหลี่ยม จากนั้นเข้าร่วมค่าเฉลี่ยของคะแนนไปยังกริดนั้นและทำให้ rasterize
Curlew

ฉันมีปัญหาเดียวกัน - วิธีแก้ไขคือใช้SpatialPixelsDataFrameกับtoleranceอาร์กิวเมนต์ที่แนะนำ(0.916421 ในกรณีของคุณ)
Tomas

คำตอบ:


18

ฉันคิดว่าคุณต้องการข้อมูลจุดผิดปกติของคุณในแรสเตอร์ปกติ ในกรณีดังกล่าว rasterize ควรทำงานและตัวอย่างใน? rasterize แสดงให้เห็นว่า นี่คือบางสิ่งจากข้อมูลของคุณ

s100 <- matrix(c(267573.9, 2633781, 213.29545, 262224.4, 2633781, 69.78261, 263742.7, 2633781, 51.21951, 259328.4, 2633781, 301.98413, 264109.8, 2633781, 141.72414, 255094.8, 2633781, 88.90244),  ncol=3,  byrow=TRUE)
colnames(s100) <- c('X', 'Y', 'Z')

library(raster)
# set up an 'empty' raster, here via an extent object derived from your data
e <- extent(s100[,1:2])
e <- e + 1000 # add this as all y's are the same

r <- raster(e, ncol=10, nrow=2)
# or r <- raster(xmn=, xmx=,  ...

# you need to provide a function 'fun' for when there are multiple points per cell
x <- rasterize(s100[, 1:2], r, s100[,3], fun=mean)
plot(x)

วิธีแก้ปัญหาที่ยอดเยี่ยม @ Robert
ToNoY

ขออภัยคุณสามารถอธิบายได้ว่าทำไมคุณเพิ่ม e <- e + 1000?
mmann1123

@ mman1123 นั่นเป็นเพียงการทำให้สิ่งต่าง ๆ ทำงานกับข้อมูลตัวอย่างที่แปลก ๆ เหล่านี้ พิกัด y ทั้งหมดเท่ากันและด้วยเหตุนี้ขอบเขตจึงเป็นศูนย์ในทิศทาง y ดังนั้นฉันจึงเพิ่ม 1,000 --- โดยพลการทั้งหมด --- เพื่อให้สามารถแรสเตอร์จากขอบเขต
Robert Hijmans

มีวิธีแก้ pythonic นี้หรือไม่?
raaj

5

สิ่งนี้ใช้ได้ผลสำหรับฉัน - วิธีแก้ไขคือใช้ SpatialPixelsDataFrame กับอาร์กิวเมนต์เผื่อที่แนะนำ (0.916421 ในกรณีของคุณ):

points <- SpatialPoints(s100_ras[,c('x','y')], s100_ras[,c('z')])
pixels <- SpatialPixelsDataFrame(points, tolerance = 0.916421, points@data)
raster <- raster(pixels[,'z'])

แม้ว่าเนื่องจากค่าความอดทนสูงแรสเตอร์จึงไม่เหมาะกับจุดเริ่มต้น อาจจะพอดีดีกว่ามาก


1
บรรทัดแรกของรหัสมีวงเล็บปิดหายไป?
Antti

@ Antti ขอบคุณแก้ไขแล้ว!
โทมัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.