【问题标题】:R: over-write xy coordinates of raster layerR:覆盖光栅层的xy坐标
【发布时间】:2016-06-30 13:50:25
【问题描述】:

我有一个 XY 像素坐标的栅格,我想将其转换为纬度和经度。

class       : RasterLayer 
dimensions  : 1617, 1596, 2580732  (nrow, ncol, ncell)
resolution  : 1, 1  (x, y)
extent      : 0, 1596, 0, 1617  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
data source : C:\janW1.png 
names       : janW1 
values      : 0, 255  (min, max)

我使用here 指定的公式计算了纬度/经度坐标。

这导致了以下数据框

heads(cords)
       lat       lon   x      y janW1
1 46.99401 -14.99122 0.5 1616.5     0
2 46.99401 -14.97367 1.5 1616.5     0
3 46.99401 -14.95611 2.5 1616.5     0
4 46.99401 -14.93856 3.5 1616.5     0
5 46.99401 -14.92100 4.5 1616.5     0
6 46.99401 -14.90345 5.5 1616.5     0

如何覆盖或创建空间范围为 lat/long 而不是图像坐标(XY 像素)的重复栅格?或者有没有更简单的方法将像素转换为纬度/经度?

代码

library(raster)
test <- raster('janW1.png')
data_matrix <- rasterToPoints(test)

#  Calculate longitude.

lonfract = data_matrix[,"x"] / (1596 - 1)
lon = -15 + (lonfract * (13 - -15))

#  Calculate latitude.

latfract = 1.0 - (data_matrix[,"y"] / (1617 - 1))  
Ymin = log(tan ((pi/180.0) * (45.0 + (47 / 2.0))))
Ymax = log(tan ((pi/180.0) * (45.0 + (62.999108 / 2.0))))
Yint = Ymin + (latfract * (Ymax - Ymin))
lat = 2.0 * ((180.0/pi) * (atan (exp (Yint))) - 45.0)

# Make single dataframe with XY pixels and latlon coords.
latlon <- data.frame(lat,lon)
tmp <- data.frame(data_matrix)
cords <- cbind(latlon, tmp)

janW1.png

【问题讨论】:

  • 欢迎来到 SO。请始终尝试提供可重现的示例 - 包括图像、加载方式和所需的包,以及如何进行地理转换。对于你的问题:如果你只是做extent(r) &lt;- extent(min(cords$lon), max(cords$lon), min(cords$lat), max(cords$lat))呢?
  • 已按要求更新。我也尝试过更改范围,但是图像在绘制时只是被拉伸了。
  • note:与cords 数据框相比,extent(r) &lt;- extent(min(cords$lon), max(cords$lon), min(cords$lat), max(cords$lat)) 产生的纬度/经度坐标似乎略有不同。

标签: r coordinates pixel raster r-raster


【解决方案1】:

更改栅格数据的投影并不像点(以及线、多边形)那么简单。这是因为如果您从当前像元计算新坐标,它们将不在常规栅格中。

您可以使用函数projectRaster(光栅包)来处理这个问题。

library(raster)
test <- raster('janW1.png')

# In this case, you need to provide the correct crs to your data
# I am guessing. (this would be necessary for spatial data sets)
crs(test) <- '+proj=merc +datum=WGS84'

# you may also need to set the extent to actual coordinate values
# extent(test) <- c( , , ,) 
x <- projectRaster(test, crs='+proj=longlat +datum=WGS84') 

或者,您可以将计算的值内插到新栅格中。有关示例,请参阅?raster::interpolate

【讨论】:

  • 不幸的是该代码不返回经度和纬度,即extent(x): -4.49e-05, 0.01438596, -4.826575e-05, 0.01466885 (xmin, xmax, ymin, ymax)
  • 但这很可能是因为分配的 crs 不正确,r 的范围几乎肯定是错误的。您正在使用图形文件,就好像它表示空间数据一样。
  • 但图形文件确实代表了空间数据,它是来自 AVHRR 卫星的海面温度栅格。
  • 由于文件不存储空间参考,我们无法知道数据应该位于地球上的哪个位置。除非您知道这一点并且可以提供该信息。
  • 数据的经纬度范围为Latitude range: 47 — 62.999108Longditude range: -15 — 13。详情请见here
【解决方案2】:

您能否从头开始创建具有所需分辨率和空间范围的栅格,然后将值导入其中。要创建栅格,您可以使用以下内容:

# Create a matrix of coordinates that define the limits of your raster

ex <- matrix(c(-20, -9.5, 20.5, 31.5), nrow = 2, ncol = 2, byrow = T)

# Turn those coordinates into an extent

ex <- extent(ex)

# Create a raster with the same dimensions as your original one

r <- raster(nrows = 1617, ncols = 1596)

# Set the extent of your raster

r <- setExtent(r, ex, keepres=F)

要将先前栅格中的值获取到刚刚创建的栅格中,您可以使用:

test <- raster('janW1.png')

# Create vector of values from test

n <- values(test)

# Give values from test to r

values(r) <- n

我认为我从您的代码中得到了正确的分辨率,但您需要将您的范围的四个坐标放入您自己。空白栅格必须具有与原始栅格完全相同的分辨率,否则它将不起作用。您创建的空白栅格会自动在 WGS84 中,因此您可能需要在输入数据后重新投影它。

【讨论】:

  • 范围的四个坐标如何放置?
  • 另外,我似乎无法生成光栅文件?我可以添加到其他程序中的一个,例如 Arcmap。新的纬度/经度线不会覆盖原始文件。
  • 要添加坐标,您只需用自己的坐标替换我在代码第一行中使用的“-20, -9.5, 20.5, 31.5”。在您告诉它之前,R 不会对您的文件进行任何更改,因此您需要使用 write.raster 之类的东西将新栅格保存为可以加载到其他程序中的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多