R: Làm thế nào để có được vĩ độ và kinh độ từ RasterLayer?


14

Tôi là người mới bắt đầu tuyệt đối với dữ liệu địa lý, vì vậy xin vui lòng, tha thứ cho tôi nếu câu hỏi không phù hợp.

Tôi đã tải xuống dữ liệu từ NCDC NARR và quản lý để tải vào R bằng cách sử dụng rastergói. Tôi muốn có được một danh sách với vĩ độ, kinh độ và giá trị. Tôi hiểu rằng rasterToPoints()nên làm chính xác những gì tôi muốn, tuy nhiên, giá trị vĩ độ và kinh độ của tôi trông lạ:

r <- raster(myfile)
data_matrix <- rasterToPoints(r)
head(data_matrix)
            x       y value
[1,] -5405401 4347242    70
[2,] -5372938 4347242    88
[3,] -5340475 4347242    76
[4,] -5308012 4347242    85
[5,] -5275549 4347242    87
[6,] -5243086 4347242    88

Tôi cho rằng tôi nên làm một cái gì đó với phép chiếu hiện tại là Lambert Conformal Conic (LCC). Dưới đây là thông tin thêm về raster.

> r
class       : RasterLayer 
dimensions  : 277, 349, 96673  (nrow, ncol, ncell)
resolution  : 32463, 32463  (x, y)
extent      : -5648874, 5680713, -4628777, 4363474  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=lcc +lat_1=50 +lat_2=50 +lat_0=50 +lon_0=-107 +x_0=0 +y_0=0 +a=6371200 +b=6371200 +units=m +no_defs 
data source : mypath-to-file
names       : value

Tôi phải làm gì để có được các giá trị kinh độ và vĩ độ thực của Hoa Kỳ?

Câu trả lời:


14

bạn cần thực sự chuyển hướng raster thành phép chiếu địa lý (độ thập phân) bằng cách sử dụng "projectRaster" hoặc "spTransform". Cũng xem xét các định nghĩa sp CRS chỉ định chuỗi chiếu mong muốn của bạn. Ví dụ trong trợ giúp cho "projectRaster" khá rõ ràng trong cách thực hiện việc này.

Nếu bạn ép dữ liệu raster của mình vào một đối tượng SpatialPointsDataFrame thì bạn sẽ sử dụng "spTransform" và kéo tọa độ từ khe @coordins và thêm chúng vào data.frame trong khe @data. Dưới đây là một ví dụ về những gì sẽ trông như thế nào.

library(raster)
library(rgdal) # for spTransform

# Create data
r <- raster(ncols=100, nrows=100)
  r[] <- runif(ncell(r))
  crs(r) <- "+proj=lcc +lat_1=48 +lat_2=33 +lon_0=-100 +ellps=WGS84"
  projection(r)

# Convert raster to SpatialPointsDataFrame
r.pts <- rasterToPoints(r, spatial=TRUE)
  proj4string(r.pts)

# reproject sp object
geo.prj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0" 
r.pts <- spTransform(r.pts, CRS(geo.prj)) 
  proj4string(r.pts)

# Assign coordinates to @data slot, display first 6 rows of data.frame
r.pts@data <- data.frame(r.pts@data, long=coordinates(r.pts)[,1],
                         lat=coordinates(r.pts)[,2])                         
head(r.pts@data)

Tôi nên lưu ý rằng việc chuyển đổi các trình raster thành một lớp đối tượng vector không phải là một cách thực hành tốt và phủ nhận các ưu điểm của gói raster cung cấp xử lý an toàn cho bộ nhớ. Nó thường là khôn ngoan để thực sự suy nghĩ về vấn đề của bạn và đánh giá nếu bạn đang tiếp cận nó một cách chính xác. Nếu OP đã cung cấp bối cảnh về lý do tại sao họ cần tọa độ [x, y] cho mọi ô, thì cộng đồng diễn đàn có thể đã cung cấp các lựa chọn thay thế tính toán sẽ giữ vấn đề trong môi trường raster.


1
Một cách để bạn thận trọng (về việc tránh chuyển đổi dữ liệu) là loại bỏ raster ban đầu (có lẽ là một lưới rất thô), tạo hai lưới các giá trị vĩ độ và kinh độ bao phủ phạm vi của phép chiếu và chiếu chúng vào phạm vi của lưới ban đầu. Không có lớp vectơ nào được tạo: nó hoàn toàn là một tập hợp các thao tác raster.
whuber

4

Lấy tọa độ của các trung tâm ô và tạo một đối tượng Không gian:

spts <- rasterToPoints(r, spatial = TRUE)

Chuyển đổi các điểm thành mục tiêu mong muốn của bạn:

library(rgdal)
llprj <-  "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
llpts <- spTransform(spts, CRS(llprj))

Các giá trị đã được sao chép dưới dạng các cột trên SpatialPointsDataFrame này.

print(llpts)

Bây giờ để kết thúc, hãy lấy data.frame:

x <- as.data.frame(llpts)

Có một triển khai chung trong gói SGAT, xem chức năng lonlatFromCell ở đây:

https://github.com/SWotherspoon/SGAT/blob/master/R/Raster.R


Tôi đã thử điều này nhưng nhận được thông báo lỗi sau: > llpts$layer1 <- values(r[[1]]) Error in [[<-. Data.frame (* tmp *, name, value = c(NA, NA, NA, NA, NA, : replacement has 96673 rows, data has 95025
janosdivenyi

Trên thực tế bạn không cần chuyển các thuộc tính, tôi sẽ xóa nó.
mdsumner

Khác với lời khuyên gói SGAT, đây có phải chính xác là cùng một câu trả lời / ví dụ mà tôi đã cung cấp không? Các tọa độ không được truyền tới data.frame trong khe dữ liệu, chỉ các giá trị từ raster. Các tọa độ, trên thực tế, được giữ trong khe tọa độ và cần được thêm vào data.frame.
Jeffrey Evans

Cảm ơn, tôi đã thêm bước as.data.frame. Tôi nghĩ rằng đó là lời khuyên khủng khiếp để thêm tọa độ làm thuộc tính - đặc biệt là bằng cách trộn với khe - vì tọa độ của đối tượng có thể thay đổi. Nếu bạn muốn một data.frame thô, hãy tạo một cái. Tôi không quan tâm thông tin ở đâu, có thể chỉ cần chỉnh sửa thông tin của bạn và chúng tôi có thể hạ gục câu trả lời này.
mdsumner

OP đặc biệt muốn tọa độ và tôi nghĩ rằng nó là dự phòng để lưu vào một data.frame riêng biệt. Tôi thường không thích thêm tọa độ vào khe dữ liệu, vì nó là dự phòng với khe tọa độ. Khác với điều này, việc thêm thông tin vào khe dữ liệu không phải là "lời khuyên khủng khiếp". Nếu bạn muốn có hai hệ tọa độ. Bạn có thể thêm lat / long vào khe dữ liệu và có đối tượng trong một phép chiếu hoàn toàn khác. Ngoài ra, nếu bạn chỉ muốn xuất một tệp phẳng chứ không phải định dạng GIS theo từng se, bạn có thể thêm tọa độ vào data.frame và lưu dưới dạng csv.
Jeffrey Evans

0

Dường như bạn có Tọa độ dự kiến ​​ở đó (không phải tọa độ Vĩ độ / Kinh độ hay còn gọi là GCS). Có lẽ bạn đã không rõ ràng rằng đó là vấn đề. Xem bài này. Chuyển đổi hệ tọa độ địa lý trong R


Tôi không bắt bài bạn tham khảo trước khi tôi trả lời. Bạn có thể muốn gắn cờ này là một bản sao. Mặc dù việc bổ sung sự ép buộc và phối hợp SpatialPointsDataFrame sẽ tạo ra một chút khác biệt. Cuộc gọi của bạn.
Jeffrey Evans

Tôi đã nghĩ về việc đánh dấu nó như vậy nhưng tôi nghĩ nếu một người khác đang tìm kiếm một câu trả lời tương tự mà không biết rằng họ cần phải chiếu các giá trị, thì điều này có thể hiển thị cho họ. Bên cạnh đó, câu trả lời của bạn cung cấp một cách khác để đến đó (Upvote).
jbeclill

Tôi đã cố gắng nhìn vào các nguồn bạn liệt kê. Để có được vĩ độ / kinh độ tiêu chuẩn tôi đã ban hành lonlat_r <- projectRaster(r, crs="+init=epsg:4326"). Tuy nhiên, phạm vi của raster mới khác -181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)xa so với những gì tôi mong đợi từ Hoa Kỳ (nên nằm trong khoảng từ 30 đến 70 đến -60 đến -160). Tôi nên hiểu lầm một cái gì đó.
janosdivenyi
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.