为什么数据没有在R中的全局地图上绘制?

为什么数据没有在R中的全局地图上绘制?,r,netcdf,r-raster,rgdal,rworldmap,R,Netcdf,R Raster,Rgdal,Rworldmap,我试图用一个netcdf文件在1度内绘制世界海洋地图集()中海洋表面温度数据的年和十年差异 我已经成功地创建了一张全球地图,但我无法将年度数据覆盖到地图上。我的代码有什么遗漏吗?是否可以沿x轴和y轴添加纬度和经度?我能用1955-64年的十年期数据减去2005-2017年的十年期数据吗?或者我需要对这些数据做些什么?谢谢大家! remove(list=ls()) library(rgdal)

我试图用一个netcdf文件在1度内绘制世界海洋地图集()中海洋表面温度数据的年和十年差异

我已经成功地创建了一张全球地图,但我无法将年度数据覆盖到地图上。我的代码有什么遗漏吗?是否可以沿x轴和y轴添加纬度和经度?我能用1955-64年的十年期数据减去2005-2017年的十年期数据吗?或者我需要对这些数据做些什么?谢谢大家!

remove(list=ls())
library(rgdal)                                                                                                      
library(raster)
library(rgeos)
library(palr) 
library(rworldmap)
library(reshape2)
library(raadtools)
library(raadfiles)
library(sp)
library(spbabel)
library(dplyr)


datafile <- "/Users/Desktop/woa18_decav_t00_01.nc"
path_split <- stringr::str_split(basename(datafile), ".")
img_basename <- basename(datafile)
img_startdate_string <- substr(img_basename, 2,8)
image_startdate <- as.Date(strptime(img_startdate_string, "%Y%j"))


pprj <- "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0, 0, 0"
target_extent = c(-180, 180, -90, 90)


g4 <- rgeos::gBuffer(SpatialPoints(cbind(0, 0), proj4string = CRS(pprj)), 
                 width = spDists(rbind(c(-180, -90), c(-180, -90)), longlat = TRUE, segments   = T) * 1000, 
                quadsegs = 180)
data("countriesLow", package = "rworldmap")
sptable(countriesLow) <- subset(sptable(countriesLow), y_ > -84)
w <- crop(rgeos::gBuffer(spTransform(countriesLow, CRS(pprj)), width = 0), g4)



pal <- palr::sstPal(palette = TRUE)
target <- raster(g4)
res(target) <- c(25000, 25000)
sst <- projectRaster(raster(datafile), target)
sst <- mask(sst, g4)



#png("/Users/Desktop/plot1.png", width = 300, height = 300, units = "mm", res = 400)
par(mar=c(6,6,4,4))
plot(w, col="grey",  breaks = pal$breaks, asp = 1, cex.axis=1.5, cex.lab=1.5,  xlim =     c(xmin(w), xmax(w)), ylim = c(ymin(w), ymax(w)))
mtext(text =  image_startdate, side = 3, line = 0) #need this to state the decadal difference
image(chl, col = pal$cols[-1], breaks = pal$breaks, add = TRUE)
plot(g4, add=TRUE)
plot(w, col="grey", add=TRUE, breaks = pal$breaks, asp = 1, cex.axis=1.5, cex.lab=1.5,  xlim = c(xmin(w), xmax(w)), ylim = c(ymin(w), ymax(w)))
#dev.off()
remove(list=ls())
图书馆(rgdal)
图书馆(光栅)
图书馆(rgeos)
图书馆(palr)
图书馆(世界地图)
图书馆(E2)
图书馆(raadtools)
图书馆(raadfiles)
图书馆(sp)
图书馆(斯巴贝尔)
图书馆(dplyr)

数据文件此代码对我有效

nc_file <- "https://data.nodc.noaa.gov/thredds/dodsC/ncei/woa/temperature/decav/1.00/woa18_decav_t01_01.nc"

library( ncdf4 )
library( raster )
library(maptools)

#read nc-file
ncData <- nc_open( nc_file )
#get longitude, latitude and temperature
lon  <- ncvar_get( ncData, "lon" )
lat  <- ncvar_get( ncData, "lat" )
temp <- ncvar_get( ncData, "t_an")
#check
dim( temp )
#[1] 360 180  57    lon, lat, depth
#depth[1] = surface, so we take that slice
surface_slice <- temp[, , 1]
#close connections
nc_close( ncData )

#create raster
r <- raster( t( surface_slice ), 
             xmn = min(lon), 
             xmx = max(lon), 
             ymn = min(lat), 
             ymx = max(lat), 
             crs = CRS( "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs+ towgs84=0,0,0" ) )
r <- flip(r, direction='y')
plot(r)
#add countries
data(wrld_simpl)
plot(wrld_simpl, add = TRUE)

nc\u文件我在
raster
中遇到问题,无法识别netcdf文件中存储的空间参考信息。
crs(光栅(数据文件))
返回什么?我在crs(光栅(数据文件))中得到这个错误。>crs(光栅(数据文件))crs参数:+proj=longlat+lon_0=0+a=6378137+rf=298.257232666016警告消息:1:In.varName(nc,varName,warn=warn):使用的varName是:n_an如果这不正确,可以将其设置为:n_an,n_mn,n_dd,n_sd,n_se,n_oa,n_gp 2:In.rasterObjectFromCDF(x,type=objecttype,band=band),“level”设置为1(共有102个级别)3:In.getCRSfromGridMap4(atts):无法处理CRS的这些部分:epsg_code=epsg:4326我实际上不明白它的意思。谢谢!是否可以更改轴切断?i、 y轴上的e.0,45,90,我可以对x轴做同样的事情吗?使用这段代码,我可以从另一个十年中减去一个十年并绘出差值,谢谢!像这样:
plot(r,xaxt=“n”,yaxt=“n”);轴(1,at=seq(-180,180,by=45),las=2);axis(2,at=seq(-90,90,by=45),las=1)
我过去也做过类似的事情。不过,有一点要警告:至少在我的例子中,netcdf文件中存储的lon和lat值是用于光栅单元的中心,因此,使用这些值的最小值/最大值作为边界框,您将离开半个单元,这可能会有问题,也可能不会有问题,这取决于您计划如何处理数据。谢谢!我不要求你明白你说的“Where'smytowel”是什么意思。你的意思是说数据将减少半格?我该怎么纠正呢?如果你只想画一张全球地图,那就别管它了。但是如果精度是一个问题:看一下坐标(
head(lat)
head(lon)
):它们以1°的间隔等距排列,但它们都是x.5度,因为它们代表单元的中心。除非我弄错了,否则graster()命令中的xmn、xmx等指的是最左边单元格的左边缘,最右边单元格的右边缘等。您可以通过将最大值/最小值加/减半度来纠正这一点:
xmn=min(lon)-0.5
xmx=max(lon)+0.5
ymn=min(lat-0.5
ymx=max(lat)+0.5