Làm cách nào tôi có thể chuyển đổi dữ liệu dưới dạng lat, lon, value thành tệp raster bằng R?


40

Tôi có một bộ dữ liệu các giá trị trên một km lưới ở lục địa Hoa Kỳ Các cột là "vĩ độ", "kinh độ" và "quan sát", ví dụ:

"lat"    "lon"     "yield"
 25.567  -120.347  3.6 
 25.832  -120.400  2.6
 26.097  -120.454  3.4
 26.363  -120.508  3.1
 26.630  -120.562  4.4

hoặc, dưới dạng khung dữ liệu R:

mydata <- structure(list(lat = c(25.567, 25.832, 26.097, 26.363, 26.63), 
lon = c(-120.347, -120.4, -120.454, -120.508, -120.562), 
yield = c(3.6, 2.6, 3.4, 3.1, 4.4)), .Names = c("lat", 
"lon", "yield"), class = "data.frame", row.names = c(NA, -5L))

(bộ dữ liệu đầy đủ có thể được tải xuống dưới dạng csv tại đây )

Dữ liệu là đầu ra từ một mô hình cây trồng (dự định sẽ được bật) lưới 30km x 30km (từ Miguez et al 2012 ).

nhập mô tả hình ảnh ở đây

Làm cách nào tôi có thể chuyển đổi chúng thành tệp raster với siêu dữ liệu liên quan đến GIS như chiếu bản đồ?

Lý tưởng nhất là tệp văn bản (ASCII?) Vì tôi muốn nó độc lập với nền tảng và phần mềm.


Là CSV, đây đã một "tệp văn bản" trong ASCII. Ngoài ra, vì nó hoàn toàn không sử dụng phép chiếu, nên có thể có rất ít siêu dữ liệu có liên quan để thêm (phần lớn, chủ yếu). Bạn có thể nói rõ hơn một chút về loại đầu ra mà bạn tìm kiếm và những gì bạn định làm với nó không?
whuber

Tôi muốn giúp người dùng sử dụng dữ liệu dễ dàng nhất có thể với nhiều phần mềm lập bản đồ (ArcGIS, Google Maps, Grass, R, v.v.) để tạo điều kiện sử dụng lại, ví dụ như không yêu cầu các bước chuyển đổi bổ sung. Dựa trên trang Wikipedia về các định dạng tệp GIS, tôi suy ra 1) tệp "raster" phải có tên gọi với vĩ độ và tên cột kinh độ, như hình ảnh và 2) siêu dữ liệu phải bao gồm thông tin địa lý (vị trí của một góc, khu vực được bao phủ theo dữ liệu).
Abe

Đây là một trong những tài liệu tham khảo tốt nhất tôi đã gặp trên R và GIS. Cảm ơn nhiều! Bạn có thể vui lòng cung cấp một csv khác với lat và long với proj4 chuỗi chính xác không? Tôi sẽ thực sự đánh giá cao điều đó.

@Nandini Không chắc chắn proj4 chuỗi chính xác là gì, tôi nghi ngờ lambert tuân thủ :proj +proj=lcc +lat_1=50.0 +lat_2=50.0 +units=km +lon_0=-145.5 +lat_0=1.0 . Tôi không chắc chắn những gì bạn đang yêu cầu đối với tệp csv khác - nó khác với câu hỏi được liên kết đến trong câu hỏi như thế nào, hoặc điều đó sẽ được tạo ra bởi câu trả lời được chấp nhận?
Abe

Đối với tôi không làm việc! Tôi không biết phải đặt gì trên tọa độ "x" và "y" thành "(pts) = ~ x + y"

Câu trả lời:


44

Một số bước cần thiết:

  1. Bạn nói rằng đó là lưới 1km thông thường, nhưng điều đó có nghĩa là thời gian dài không thường xuyên. Trước tiên, bạn cần chuyển đổi nó thành một hệ tọa độ lưới thông thường để các giá trị X và Y thường xuyên cách nhau.

    a. Đọc nó vào R dưới dạng khung dữ liệu, với các cột x, y, sản lượng.

    pts = read.table("file.csv",......)

    b. Chuyển đổi khung dữ liệu thành SpatialPointsDataFrame bằng gói sp và đại loại như:

    library(sp)
    library(rgdal)
    coordinates(pts)=~x+y

    c. Chuyển đổi sang hệ thống km thông thường của bạn bằng cách trước tiên cho nó biết CRS là gì và sau đó spTransform đến đích.

    proj4string(pts)=CRS("+init=epsg:4326") # set it to lat-long
    pts = spTransform(pts,CRS("insert your proj4 string here"))

    d. Nói với R rằng đây là lưới:

    gridded(pts) = TRUE

    Tại thời điểm này, bạn sẽ gặp lỗi nếu tọa độ của bạn không nằm trên một lưới thông thường đẹp.

  2. Bây giờ sử dụng gói raster để chuyển đổi thành raster và đặt CRS của nó:

    r = raster(pts)
    projection(r) = CRS("insert your proj4 string here")
  3. Bây giờ hãy xem:

    plot(r)
  4. Bây giờ hãy viết nó dưới dạng tệp GeoTIFF bằng gói raster:

    writeRaster(r,"pts.tif")

GeoTIFF này có thể đọc được trong tất cả các gói GIS chính. Phần còn thiếu rõ ràng ở đây là chuỗi proj4 để chuyển đổi thành: đây có thể sẽ là một loại hệ thống tham chiếu UTM. Thật khó để nói mà không có thêm dữ liệu ...


+1 Cảm ơn bạn đã đặt ra quy trình làm việc. Lưu ý rằng dữ liệu có sẵn tại liên kết được cung cấp trong câu hỏi: hãy xem. Bạn sẽ khám phá ra rằng một số giả định của bạn về chúng là không chính xác. (Cụ thể, tôi đã săn lùng bất kỳ tài liệu nào về phép chiếu được sử dụng để tạo lưới nhưng không tìm thấy. Và đó là một phép chiếu kỳ lạ, như bạn có thể thấy bằng cách vẽ các điểm.)
whuber

Nó rất gần với hệ thống UTM, nhưng không có hệ thống nào tôi từng thử đủ gần với lưới thông thường để R kết nối chúng. Tôi bị cám dỗ một nửa để lặp qua toàn bộ cơ sở dữ liệu epsg của R ....
Spainedman

Đó sẽ là một chuyến tham quan thực sự nếu bạn có thể khám phá ra hình chiếu theo cách đó! Điều quan trọng là tìm ra một tiêu chí hiệu quả và hiệu quả để xác định khi 7.000 điểm này đủ gần để nằm trên một lưới thông thường (bởi vì có thể chúng không thể tạo thành một lưới hoàn hảo trong bất kỳ phép chiếu tiêu chuẩn nào). Để chạy nhanh qua cơ sở dữ liệu, cần so sánh một số lượng nhỏ khoảng cách, chẳng hạn như khoảng cách đông-tây ở phía bắc của lưới với khoảng cách đông-tây ở phía nam. Điều đó phải loại bỏ phần lớn các ứng cử viên một cách nhanh chóng.
whuber

3
Tôi chạy qua tất cả các (mặc định) dự báo được hỗ trợ bởi Mathematica 8. Nó tìm thấy một chiếu, trong đó những điểm thực sự dường như rơi vào một mạng lưới: Alaska Nhà nước Plane (1983) Khu 10! Đây là một hình chiếu Lambert Conformal Conic. Tôi tin rằng đó là EPSG 26940 . Nếu bạn sửa đổi điều này để tập trung vào khoảng kinh độ -106, các điểm sẽ tạo thành một lưới khá tốt.
whuber

1
Abe, bạn có nghĩa là để đọc trang web? Nó đã được r = Import[ "https://ebi-forecast.igb.illinois.edu/bety/miscanthusyield.csv", "Data"];. Bạn có thể nhận được một âm mưu nhanh chóng về các điểm sau đó thông qua data = Rest[r]; ListPlot[data[[;; , {3, 2}]]](hoặc ListPointPlot3D[data[[;; , {3, 2, 4}]]]). Đối với các phản hồi, hãy bắt đầu với trợ giúp GeoGridPosition, sau đó đưa ra một số dự đoán thông minh và tham khảo chéo để tìm hiểu điều gì đang xảy ra :-). Giải thích của BTW, @ Spacesman thực sự có liên quan: biến dạng số liệu từ 25 đến 49 độ bằng cos (25) / cos (49) = 1,38; đó là đáng kể.
whuber

29

Vì câu hỏi đã được trả lời lần cuối, nên có một giải pháp dễ dàng hơn nhiều bằng cách sử dụng rasterFromXYZchức năng của gói raster gói gọn tất cả các bước cần thiết (bao gồm cả đặc điểm kỹ thuật của chuỗi CRS).

library(raster)
rasterFromXYZ(mydata)

1
Lời xin lỗi đến @Spacesman không mệt mỏi, người đã thường xuyên giúp đỡ tôi, nhưng tôi nghĩ câu trả lời này xứng đáng được thừa hưởng dấu tick xanh.
địa lý

@geotheory Tôi sẽ chọn câu trả lời này, đây là một chức năng tuyệt vời, nhưng dường như nó rất chậm trên bộ dữ liệu tôi đang sử dụng (được liên kết đến trong op)
Abe

1
... thực tế nó bị nghẹn vì đã lấy tệp ~ 400KB của tôi và tạo một tệp trong /tmp/đó là ~ 19GB khi tôi hết dung lượng đĩa.
Abe

Có lẽ có một quá trình n bình phương ở đó ở đâu đó. Bạn có thể nhóm dữ liệu điểm theo một lưới rộng, rasterise từng nhóm riêng lẻ và sau đó merge()kết quả cùng nhau.
địa lý

Với tất cả sự tôn trọng, nhưng câu trả lời này tốt hơn nhiều so với Spacesman.
Ma
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.