Làm thế nào để sản xuất lưới không gian từ raster?


9

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?


6
Ném cho chúng tôi một số phế liệu ở đây. Một ít mã để tạo raster và những gì bạn mong đợi về nó?
Spainedman

Câu trả lời:


14

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 - SpatialGridcá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.


cảm ơn bạn, tôi cũng không chắc muốn gì Tôi cố gắng phát triển một quy trình công việc để tạo ra các bản đồ raster giống hệt nhau (về độ phân giải, phối hợp, crs, ...) từ các dữ liệu điểm không gian khác nhau. rasterize không phải là một lựa chọn do tán xạ điểm không gian. Cần sử dụng iwd hoặc tương tự. Bạn nói đúng, lưới là trực tràng - thứ tôi cần làm mẫu chính có lẽ là SpatialPointsDataFrame. mà có thể được lưới S.
Janbob Squarebrains

Bạn có thể muốn có một raster chính (ha!) Và sau đó tạo ra tất cả các lưới tiếp theo đồng thời với nó.
Radar

2
Đã đồng ý. Nếu mọi thứ là lưới, raster gần như luôn luôn là câu trả lời. Hoặc là, hoặc lướt qua khoảng 20 trang Phân tích dữ liệu không gian ứng dụng trong R để tìm ra cách thực hiện SpatialPixels. Thực tế, tôi đã đưa ra lựa chọn đó cho một nghiên cứu sinh. Anh chọn ... một cách khôn ngoan!
Spacesman

20

Để 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)

7

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.

  • (Có thể cho rằng, vì bạn có thể lưu trữ các ô thưa thớt bằng cách chỉ lưu trữ chỉ mục của chúng chứ không phải tọa độ rõ ràng và tọa độ ô "hơi bất thường" ban đầu chỉ có thể được lưu trữ dưới dạng các thuộc tính nếu bạn thực sự muốn chúng. thậm chí không phải là trường hợp trực tràng đơn giản - điều này phù hợp với hầu hết các công cụ GIS, nhưng thật không may vì nó khá phổ biến trong các định dạng như NetCDF và được xử lý bởi chức năng đồ họa cũ tốt của R (mặc dù không sử dụng tùy chọn rasterImage gần đây) .)

Cảm ơn các tuyên bố rất hướng dẫn, mà tôi cần phải tiêu hóa. Hy vọng cho phép tôi giải quyết vấn đề của mình hoặc gửi một câu hỏi rõ ràng hơn!
Squarebrains Janbob

Ngoài ra @Spacesman: Tôi xác định chính xác hơn câu hỏi của tôi ở đây trong diễn đàn.
Squarebrains Janbob
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.