Làm thế nào để trích xuất các giá trị từ các raster tại vị trí của các điểm trong R?


13

Câu hỏi của tôi là về việc trích xuất các giá trị từ các raster tại vị trí của các điểm. Với chức năng trích xuất, việc này rất dễ dàng và hàm cung cấp cho tôi một khung dữ liệu với các giá trị của tất cả các biến trong các điểm. Tôi muốn có trong khung dữ liệu đó tọa độ của từng điểm. Làm thế nào tôi có thể làm điều đó xảy ra? Có thể nói với R rằng khi trích xuất các giá trị từ raster cũng thêm các cột của điểm vị trí.

Đây là thủ tục của tôi:

presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")

lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)

variables_presencia<-extract(variables, presencias)

kết quả là như thế này:

> bio1  bio12  bio18  bio2  bio4 
> 90    875    165    95    4886
> 115   1085   158    83    4075
> 135   1153   153    67    3402
> 85    1026   137    99    5203
> 96    667    128    108   5823
> 98    531    109    113   6305
> 132   450    63     123   6598
> 132   569    104    106   5963
> 95    814    196    98    5571
> 146   474    39     114   6603

Nhưng tôi muốn có thêm hai cột với dữ liệu tọa độ (nhưng có thể là các cột khác từ bảng vị trí trích xuất csv của tôi).

Cảm ơn rất nhiều.


Xin lỗi định dạng của kết quả hiển thị trước đó là không chính xác.
JMCosta

Phải là năm cột (bio1, bio12 .... bio4)
JMCosta

Không phải các giá trị tương ứng với tọa độ của bạn presencias?
Roman Luštrik

Các giá trị của các biến là từ các điểm prensence. Nhưng tôi cũng muốn sự phối hợp của các điểm trong bảng. nhưng tôi không biết làm thế nào để làm
JMCosta

Điều gì về một cái gì đó dọc theo dòng cbind(coordinates(presencias), variables_presencia)? Sau đó, bạn có thể chuyển đổi sang SPDF bằng cách sử dụng coordinates(result) <- ~ X + Yvà bạn có thể sử dụng rất nhiều phương thức được thiết kế cho các đối tượng không gian một lần nữa.
Roman Luštrik

Câu trả lời:


20

Giả sử rằng presenciasvariableschia sẻ cùng một phép chiếu, đây sẽ là một nhiệm vụ dễ dàng. Tôi khuyên bạn nên thêm các dòng mã này sau read.table()câu lệnh của mình để chuyển đổi presenciaskhung dữ liệu thành đối tượng SpatialPointsDataFrame (chỉ tinh chỉnh tên của các cột chứa tọa độ x và y nếu chúng khác với ví dụ của tôi).

coordinates(presencias) <- c("x", "y")

Để cung cấp một ví dụ có thể lặp lại, tôi cố gắng mở ra phạm vi câu trả lời của tôi nhiều hơn một chút. Trước hết, tải xuống và giải nén shapefile ESRI này với các vị trí quan trọng hơn hoặc ít hơn ở Đức. Chúng sẽ phục vụ như dữ liệu điểm sau này. Bạn cũng sẽ cần gói dismo, rgdalrasterví dụ ngắn này, do đó hãy chắc chắn rằng các thư viện này (và tất cả phụ thuộc của chúng) được cài đặt trên ổ cứng cục bộ của bạn.

Hãy bắt đầu với việc tải các gói cần thiết.

library(dismo)
library(rgdal)
library(raster)

Tiếp theo, bạn nên tạo một RasterLayer mẫu. Trong trường hợp của chúng tôi, chúng tôi sẽ sử dụng gmap()chức năng từ dismogói để có được bản đồ vật lý của Đức.

germany.mrc <- gmap("Germany")

Bây giờ bạn có thể nhập shapefile điểm của bạn thông qua gói readOGRcủa R. rgdalĐảm bảo điều chỉnh tên nguồn dữ liệu (dsn = ...). Toàn bộ công cụ trình chiếu đã lỗi thời trong trường hợp cụ thể của bạn. Tuy nhiên, nó phải được thực hiện trong ví dụ của chúng tôi để phủ thành công dữ liệu điểm của chúng tôi với RasterLayer của Đức.

# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))

Để giảm kích thước khổng lồ của dữ liệu điểm của chúng tôi, chúng tôi sẽ vẽ một mẫu ngẫu nhiên gồm mười địa điểm ở Đức. Điều này là đủ cho mục đích của chúng tôi.

set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]

Bây giờ công cụ chuẩn bị đã kết thúc, chúng ta có thể bắt đầu trích xuất các giá trị của các pixel cụ thể đó, mười điểm được lấy mẫu ngẫu nhiên của chúng ta nằm trong.

data <- data.frame(coordinates(germany.places.mrc.sample),
                   germany.places.mrc.sample$name, 
                   extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")

Để hợp nhất tọa độ điểm với các giá trị pixel được trích xuất, chúng ta chỉ cần thiết lập một khung dữ liệu chứa tọa độ của SpatialPointsDataFrame của chúng tôi. Đó là nó!

data
           x       y          name value
1  1073490.3 6513446 Veitsteinbach   208
2  1269100.8 6156690   Assenhausen   231
3  1336757.5 6246284    Frauenwahl   195
4   828579.9 6634122      Altenhof   189
5  1571418.1 6662558         Wohla   151
6  1192299.4 6864087     Flechtorf   170
7   976270.0 6362050    Hilsenhain   208
8  1117416.4 6092146      Nestbaum   175
9  1274192.0 6344490 Wappeltshofen   236
10  878488.2 6839843        Leeden   208

1

Chắc chắn bạn chỉ có thể làm:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(giả sử dữ liệu tọa độ của bạn nằm trong hai cột được gọi là 'x' và 'y')


Tôi đã nghĩ theo cách đó, nhưng tôi đã có những nghi ngờ này: khung dữ liệu kết quả từ trích xuất có cùng thứ tự hiện diện. (hàng đầu tiên của khung dữ liệu là hàng đầu tiên của bảng hiện diện)
JMCosta

Và một điều nữa, nếu không có dữ liệu biến đổi cho bất kỳ điểm nào (3 hoặc 4), số lượng hàng sẽ không giống nhau và chắc chắn thứ tự sẽ không giống nhau.
JMCosta

@JMCosta: bạn đã sai về điều đó. Giá trị NA sẽ được trả về cho những điểm đó.
Robert Hijmans
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.