projectRaster:在太平洋世界地图中使用marmap在太平洋进行水深测量数据(" NOAA.nc')的光栅投影

时间:2017-11-01 03:05:55

标签: r r-raster orthographic noaa

我想重现marmap小插图中的最后一个例子:' marmap-DataAnalysis'对于太平洋地区。该示例显示了以lon = 50为中心的世界的正交投影。以下是示例:

library(marmap)
library(raster)
# Get data for the whole world. Careful: ca. 21 Mo!
world <- getNOAA.bathy(-180, 180, -90, 90, res = 15, keep = TRUE)

# Switch to raster
world.ras <- marmap::as.raster(world)

# Set the projection and project
my.proj <-   "+proj=ortho +lat_0=0 +lon_0=50 +x_0=0 +y_0=0"
world.ras.proj <- projectRaster(world.ras,crs = my.proj)

# Switch back to a bathy object
world.proj <- as.bathy(world.ras.proj)

# Set colors for oceans and land masses
blues <- c("lightsteelblue4", "lightsteelblue3",
           "lightsteelblue2", "lightsteelblue1")
greys <- c(grey(0.6), grey(0.93), grey(0.99))

# And plot!
plot(world.proj, image = TRUE, land = TRUE, lwd = 0.05,
     bpal = list(c(0, max(world.proj, na.rm = T), greys),
                 c(min(world.proj, na.rm = T), 0, blues)),
     axes = FALSE, xlab = "", ylab = "")
plot(world.proj, n = 1, lwd = 0.4, add = TRUE)

但是,我想将中心改为太平洋子午线,例如: lon = 155.5。我通过将投影参数更改为

来尝试此操作
my.proj <- "+proj=ortho +lat_0=20 +lon_0=155.5 +x_0=0 +y_0=0" 

然后,

world.ras.proj <- projectRaster(world.ras,crs = my.proj)

结果:

Error in if (nr != x@nrows | nc != x@ncols) { : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In rgdal::rawTransform(projfrom, projto, nrow(xy), xy[, 1],     xy[,  :
  259 projected point(s) not finite
2: In rgdal::rawTransform(projection(raster), crs, nrow(xy), xy[,     1],  :
  4 projected point(s) not finite

我怎样才能绘制水深世界&#39;在太平洋地区?

2 个答案:

答案 0 :(得分:2)

我简化了你的问题(总是很好,对我来说数据下载不起作用)。实质上:

library(raster); library(rgdal)
prj1 <- "+proj=ortho +lat_0=0 +lon_0=0 +x_0=0 +y_0=0"
prj2 <- "+proj=ortho +lat_0=20 +lon_0=155.5 +x_0=0 +y_0=0" 
r <- raster()
r <- init(r, 'col')

# works
x1 <- projectRaster(r, crs = prj1)
# fails
x2 <- projectRaster(r, crs = prj2)

这是一个错误。我已经在光栅版2.6-2中修复了它(正在开发中,应该在下周左右开始使用)

答案 1 :(得分:0)

可以使用marmap包的当前/先前版本在raster中解决此问题。您必须使用antimeridian=TRUE函数的getNOAA.bathy()参数和一些技巧来允许栅格包计算投影。

第一个技巧是用lon1 = lon2 = 0下载数据,因为antimeridian下载了2个不同的数据集:从antimeridian到lon1,从lon2到antimeridian。设置lon1和lon2等于0会下载整个世界。

然后,您必须手动切换回-180到180之间的经度值(而不是由animeridian的{​​{1}}参数产生的0到360),因此{{1}行。

最后,您必须应用相同的getNOAA.bathy()更正来指定投影。 这是代码:

rownames(world2) <- ...

结果如下:

enter image description here

新版-180(2.6-7)解决了跨日期线投影的问题。但是,由于从NOAA服务器下载测深数据时出现舍入误差,因此可能会在图中显示一些丢失的单元格。以下是您在原始问题中发布的代码示例:

enter image description here

以下是数据的library(marmap) library(raster) # Get data for the whole world. Careful: ca. 21 Mo! world2 <- getNOAA.bathy(0, 0, -90, 90, res = 15, keep = TRUE, antimeridian=TRUE) rownames(world2) <- as.numeric(rownames(world2))-180 # Switch to raster world.ras <- marmap::as.raster(world2) # Set the projection and project my.proj <- "+proj=ortho +lat_0=20 +lon_0=155-180 +x_0=0 +y_0=0" world.ras.proj <- projectRaster(world.ras,crs = my.proj) # Switch back to a bathy object world.proj <- as.bathy(world.ras.proj) # Set colors for oceans and land masses blues <- c("lightsteelblue4", "lightsteelblue3", "lightsteelblue2", "lightsteelblue1") greys <- c(grey(0.6), grey(0.93), grey(0.99)) # And plot! plot(world.proj, image = TRUE, land = TRUE, lwd = 0.05, bpal = list(c(0, max(world.proj, na.rm = T), greys), c(min(world.proj, na.rm = T), 0, blues)), axes = FALSE, xlab = "", ylab = "") plot(world.proj, n = 1, lwd = 0.4, add = TRUE)

raster

因此,使用上面详述的summary()的解决方案应该是最好的。