Tôi cần một Lưới không gian như một lưới chính cho các bản đồ chuyên đề đa dạng. Làm cách nào để tạo lưới không gian từ raster loại bỏ tất cả các pixel NA?
Tôi cần một Lưới không gian như một lưới chính cho các bản đồ chuyên đề đa dạng. Làm cách nào để tạo lưới không gian từ raster loại bỏ tất cả các pixel NA?
Câu trả lời:
Bạn có thể nhận được tất cả các tọa độ không NA của các ô trong raster với:
r = raster(matrix(runif(20),5,4))
r[r>.5]=NA
coordinates(r)[!is.na(values(r)),]
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
đó là những tế bào không NA. Sau đó, bạn có thể cung cấp chúng cho SpatialPixels
SpatialPixels(SpatialPoints(coordinates(r)[!is.na(values(r)),]))
Object of class SpatialPixels
Grid topology:
cellcentre.offset cellsize cells.dim
x 0.125 0.25 4
y 0.100 0.20 4
SpatialPoints:
x y
[1,] 0.375 0.7
[2,] 0.125 0.5
[3,] 0.375 0.5
[4,] 0.625 0.5
[5,] 0.875 0.5
[6,] 0.125 0.3
[7,] 0.375 0.3
[8,] 0.625 0.3
[9,] 0.375 0.1
[10,] 0.875 0.1
Coordinate Reference System (CRS) arguments: NA
Mặc dù cá nhân bất cứ điều gì trên lưới tôi sẽ giữ như một raster.
Tôi không hoàn toàn chắc chắn về những gì bạn muốn - SpatialGrid
các đối tượng được xác định các lưới hình chữ nhật đầy đủ, do đó, một đối tượng không có pixel NA sẽ không có ý nghĩa.
Để chuyển đổi RasterLayer thành đối tượng Spatial * (Grid hoặc Pixels), bạn có thể sử dụng chức năng cưỡng chế "as"
library(raster)
r <- raster(matrix(runif(20),5,4))
r[r>.5] <- NA
g <- as(r, 'SpatialGridDataFrame')
p <- as(r, 'SpatialPixels')
plot(r)
points(p)
Hai yêu cầu của bạn dường như là về những điều khác nhau:
1) Một số loại mẫu lưới raster đáng tin cậy.
2) Một lưới thưa thớt không lưu trữ rõ ràng các ô bị thiếu.
sp :: GridTopology cung cấp cái đầu tiên, nó chỉ là một mô tả về lưới dựa trên tọa độ ô bên trái phía dưới (cellcentre.offset), khoảng cách ô (cellize) và kích thước của lưới (cell.dim).
Lớp sp :: SpatialPixelsDataFrame cho phép bạn lưu trữ các lưới thưa thớt, nhưng trên chính nó, nó lưu trữ nhiều hơn "mẫu" - nó cũng lưu trữ mọi tọa độ một cách rõ ràng. Điều này là do nó thực hiện hai công việc, một công việc cho phép bạn duy trì tọa độ ban đầu xuất phát từ lưới và có thể hơi bất thường, hai công việc này cho phép bạn chỉ lưu trữ các ô có giá trị hợp lệ. (Có thể cho rằng * hai mục tiêu này đáng lẽ phải được tách ra, nhưng đó là một câu chuyện khác).
Tôi không nghĩ rằng gói raster có sự tương tự rõ ràng với GridTopology, nhưng bạn có thể nắm giữ các thành phần để "tự lăn":
library(raster)
r1 <- raster(nrows=108, ncols=21, xmn=0, xmx=10)
## "cellsize"
res(r1)
## [1] 0.4761905 1.6666667
## extreme cell corners (just a different convention to sp's cellcentre)
extent(r1)
class : Extent
xmin : 0
xmax : 10
ymin : -90
ymax : 90
## we can also use bbox to get the same thing
bbox(r1)
min max
s1 0 10
s2 -90 90
## grid dimensions (including number of attributes/layers as 3rd "dim")
dim(r1)
## [1] 108 21 1
Liên kết tất cả những thứ này lại với nhau, chúng ta có thể đi từ raster đến sp:
GridTopology(bbox(r1)[,1] + res(r1)/2, res(r1), dim(r1)[2:1])
(Lưu ý cách kích thước phải được đảo ngược). Một cách đơn giản khác là ép buộc SpatialGrid và sử dụng getGridTopology của sp, mặc dù điều này tốn kém hơn vì các tọa độ cuối cùng được tạo ra trên đường đi:
getGridTopology(as(r1, "SpatialGrid"))
Ba phần của "cấu trúc liên kết" raster không phải là tất cả, vì một số là dư thừa nhưng không có cách nào khác để bắt tất cả chúng như một đối tượng - ngoại trừ, raster được tạo ở trên là "trống rỗng" và vì vậy nó có thể làm được công việc mà GridTopology làm cho sp. Tôi không chắc chắn về các chi tiết về mức độ "trống" của nó, nhưng chắc chắn nó không lưu trữ rõ ràng khe "dữ liệu" và nhỏ hơn so với giá trị trong đó. Gói raster nói chung làm hết sức để giữ mức sử dụng bộ nhớ ở mức tối thiểu, và vì vậy với nó, bạn có thể không cần phải lo lắng về việc thực sự "thưa thớt".
Điều đó có thể giúp giải thích thêm một chút, tôi biết tôi đang chồng chéo câu trả lời của Spacesman nhưng vẫn chưa rõ chính xác ý bạn là gì trong câu hỏi.