绘制NetCDF的部分并覆盖形状文件-R

时间:2018-01-25 19:21:12

标签: r plot shapefile netcdf

我一直在绘制NetCDF文件并覆盖形状文件。然而,这是一个全世界的形象,我只想要它的一部分,即只有墨西哥。 我使用This tutorial来绘制一切并且完美无缺。但是我应该在哪个部分裁剪地图。 这是我的代码:

require(utils)
require(colorRamps)
require(RNetCDF)
require(rasterVis)
require(rgdal)


Datos <- open.nc("./ERAII_viento_2014_300.nc")

u <- var.get.nc(Datos, "u")
v <- var.get.nc(Datos, "v")
lon <- var.get.nc(Datos, "longitude")
lat <-- var.get.nc(Datos, "latitude")

u[u == -32767] <- NA
v[v == -32767] <- NA

u9 <- raster(t(u[ , ,9])[ncol(u):1, ])
v9 <- raster(t(v[ , ,9])[ncol(v):1, ])

y <- brick(u9,v9)
projection(y) <- CRS("+init=epsg:4326")
extent(y) <- c(min(lon), max(lon), min(lat), max(lat))


slope <- sqrt(y[[1]]^2 + y[[2]]^2)
aspect <- atan2(y[[1]], y[[2]])


cntry <- readOGR(dsn="./shape_countries", layer="country")

we <- crop(y, extent(c(0, (180* res(y)[1]), min(lat), max(lat))))
ww <- crop(y, extent(c((180 * res(y)[1]), 360 * res(y)[1], min(lat), max(lat))))
extent(ww) <- c(-180 * res(y)[1], 0, min(lat), max(lat))

#extent(ww) #-180.50:0 y -90:90
#extent(we) #0:180.5 y -90:90
y2 <- merge(ww,we)

slope2 <- sqrt(y2[[1]]^2 + y2[[2]]^2)
vectorplot(y2 * 1.5, isField = "dXY", region = slope2, margin = FALSE, par.settings = rasterTheme(region = matlab.like(n = 10)),narrows = 10000, at = -15:50) + layer(sp.polygons(cntry))

我从以下网址下载了风数据:http://apps.ecmwf.int/datasets/data/interim-full-daily/levtype=sfc/注意:我使用nco.exe转换变量u和v,来自&#34; short&#34;到&#34;漂浮&#34;。 我不记得我在哪里获得了shapefile,但我认为它来自ArcGIS。

1 个答案:

答案 0 :(得分:2)

不幸的是,该教程使 的内容比需要的更复杂。您所需要做的就是:

library(raster)
library(ncdf4)    

u <- brick("./ERAII_viento_2014_300.nc", var="u")
v <- brick("./ERAII_viento_2014_300.nc", var="v")

将数据裁剪到墨西哥:

mex <- getData('GADM', country='MEX', level=0)
ux <- crop(u, mex)
uv <- crop(v, mex)

我没有您的文件,但我下载了一个:

f <- "_grib2netcdf.nc"
b <- brick(f, var="u10")

请注意经度从0到360(气候学家这样做),而不是标准的-180到180.

extent(b)
#class       : Extent 
#xmin        : -0.375 
#xmax        : 359.625 
#ymin        : -90.375 
#ymax        : 90.375 

解决这个问题:

bb <- rotate(b)

bb
#class       : RasterBrick 
#dimensions  : 241, 480, 115680, 31  (nrow, ncol, ncell, nlayers)
#resolution  : 0.75, 0.75  (x, y)
#extent      : -179.625, 180.375, -90.375, 90.375  (xmin, xmax, ymin, ymax)
#coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0 
#data source : in memory
#names       : X2016.01.01, X2016.01.02, X2016.01.03, X2016.01.04, X2016.01.05, X2016.01.06, X2016.01.07, X2016.01.08, X2016.01.09, X2016.01.10, X2016.01.11, X2016.01.12, X2016.01.13, X2016.01.14, X2016.01.15, ... 
#min values  :   -17.75753,   -30.02454,   -27.94626,   -18.51657,   -24.09466,   -22.60716,   -26.89947,   -24.13576,   -19.69050,   -20.82237,   -29.23778,   -20.65125,   -20.09774,   -26.92337,   -27.70344, ... 
#max values  :    21.46595,    22.34927,    25.07379,    24.71817,    20.92774,    21.60935,    24.50690,    23.31480,    24.46388,    25.14835,    26.64731,    21.74223,    20.15436,    29.76378,    27.18361, ... 
#Date/time   : 2016-01-01, 2016-01-31 (min, max)

现在你可以做到:

mex <- getData('GADM', country='MEX', level=0)
bbmex <- crop(bb, mex)