R:如何从RasterLayer获取经度和纬度?


14

我绝对是地理数据的初学者,因此,如果问题不适当,请原谅我。

我从NCDC NARR下载了数据,并设法使用该raster软件包将其加载到R中。我想获得一个包含纬度,经度和价值的列表。我知道该功能rasterToPoints()可以完全满足我的要求,但是,我的纬度和经度值看起来很奇怪:

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

我想我应该对当前为Lambert Conformal Conic(LCC)的投影做些什么。以下是有关栅格的更多信息。

> 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

如何获得美国的真实纬度和经度值?

Answers:


14

您实际上需要使用“ projectRaster”或“ spTransform”将栅格重新投影为地理(十进制度)投影。还要查看指定您所需的投影字符串的CRS sp定义。如何执行“ projectRaster”帮助中的示例非常清楚。

如果将栅格数据强制转换为SpatialPointsDataFrame对象,则可以使用“ spTransform”并从@coordinates插槽中提取坐标,并将其添加到@data插槽中的data.frame中。这是一个示例。

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)

我应该注意,将栅格转换为矢量对象类并不是一种好习惯,并且否定了栅格包提供内存安全处理的优点。认真考虑问题并评估是否正确解决问题通常是谨慎的做法。如果OP提供了有关为什么每个单元需要[x,y]坐标的上下文,则论坛社区可能已经能够提供将问题保留在光栅环境中的计算替代方案。


1
请注意(避免避免数据转换)的一种方法是取消投影原始栅格(可能投影至非常粗糙的网格),创建两个覆盖未投影范围的纬度和经度值网格,然后将其投影回原始网格的范围。没有创建向量类:它完全是一组栅格操作。
whuber

4

获取单元中心的坐标并创建一个Spatial对象:

spts <- rasterToPoints(r, spatial = TRUE)

将点转换为所需的目标:

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

这些值已经被复制为该SpatialPointsDataFrame上的列。

print(llpts)

现在完成操作,获取一个data.frame:

x <- as.data.frame(llpts)

SGAT软件包中对此有一个通用实现,请参见lonlatFromCell此处的功能:

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


我尝试了此操作,但收到以下错误消息:> 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 2015年

实际上,您不需要传输属性,我将删除它。
mdsumner 2015年

除了SGAT软件包建议之外,这是否与我提供的答案/示例完全不同?坐标不会传播到数据插槽中的data.frame,仅传播到栅格中的值。实际上,坐标保存在坐标槽中,需要将其添加到data.frame中。
杰弗里·埃文斯

谢谢,我添加了as.data.frame步骤。我认为将坐标添加为属性是一个糟糕的建议,尤其是通过槽缝来增加坐标,因为对象的坐标可能会发生变化。如果您想要原始的data.frame,只需制作一个。我不在乎信息在哪里,也许只是编辑您的信息,我们就可以解决这个问题。
mdsumner 2015年

OP特别想要坐标,我认为将其保存到单独的data.frame是多余的。我通常不主要喜欢将坐标添加到数据插槽,因为它与坐标插槽是多余的。除此之外,将信息添加到数据插槽不是“糟糕的建议”。如果要有两个坐标系怎么办。您可以向数据插槽添加纬度/经度,并使对象处于完全不同的投影中。另外,如果您只想导出一个平面文件,而不是本身的GIS格式,则可以将坐标添加到data.frame并另存为csv。
杰弗里·埃文斯

0

看来您那里有投影坐标(不是纬度/经度,也称为GCS坐标)。您可能不清楚这就是问题所在。看到这篇文章。 在R中转换地理坐标系


在回答之前,我没有收到您引用的帖子。您可能希望将此标记为重复项。尽管增加了SpatialPointsDataFrame的强制和坐标分配,如果有所不同。你的来电。
杰弗里·埃文斯

我考虑过将其标记为这样,但是我想如果其他人正在寻找类似的答案,而又不知道他们需要投影这些值,那么这可能会对他们有用。除了您的答案,还提供了另一种到达那里的方法(已投票)。
jbchurchill 2015年

我试图查看您列出的资源。为了获得标准的纬度/经度,我发布了lonlat_r <- projectRaster(r, crs="+init=epsg:4326")。但是,新栅格的范围与-181.3232, 181.4938, -1.590457, 87.76154 (xmin, xmax, ymin, ymax)我对美国的预期相去甚远(应该在30到70到-60到-160之间)。我应该误会了一些东西。
janosdivenyi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.