R 写入netcdf时设置坐标系
我在R中有一个空间点数据帧,我想将其另存为netCDF。我需要一些格式化方面的帮助R 写入netcdf时设置坐标系,r,netcdf,R,Netcdf,我在R中有一个空间点数据帧,我想将其另存为netCDF。我需要一些格式化方面的帮助 > str(swe) Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots ..@ data :'data.frame': 3487 obs. of 5 variables: .. ..$ site : Factor w/ 6 levels "Dry Lake","Joe Wright",..: 1 1
> str(swe)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
..@ data :'data.frame': 3487 obs. of 5 variables:
.. ..$ site : Factor w/ 6 levels "Dry Lake","Joe Wright",..: 1 1 1 1 1 1 1 1 1 1 ...
.. ..$ depth : num [1:3487] 151 157 138 155 145 ...
.. ..$ density: num [1:3487] 0.37 0.37 0.37 0.37 0.37 0.37 0.37 0.37 0.37 0.37 ...
.. ..$ swe.obs: num [1:3487] 0.56 0.582 0.512 0.572 0.535 ...
.. ..$ date : Date[1:3487], format: "2008-04-04" "2008-04-04" ...
..@ coords.nrs : num(0)
..@ coords : num [1:3487, 1:2] -107 -107 -107 -107 -107 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : NULL
.. .. ..$ : chr [1:2] "utm.e" "utm.n"
..@ bbox : num [1:2, 1:2] -107.9 37.8 -104.1 43.8
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:2] "utm.e" "utm.n"
.. .. ..$ : chr [1:2] "min" "max"
..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
.. .. ..@ projargs: chr "+proj=longlat +datum=NAD83 +ellps=GRS80 +towgs84=0,0,0"
我有一个不规则的date
字段,因此我认为不能将其用作维度。这些是对雪的实地测量,因此在两个不同的年份中大约每月进行一次调查。但是,我需要为每次测量提供日期和站点名称。我还需要保存投影信息。以下是我目前的情况:
require(ncdf4)
varlat=ncdim_def(name='latitude',units='deg',vals=coordinates(swe)[,2])
varlong=ncdim_def(name='longitude',units='deg',vals=coordinates(swe)[,1])
varswe=ncvar_def(name='swe.obs',units='meters',dim=list(varlat,varlong),missval=-9999)
varsite=ncvar_def(name='site',units='site',dim=list(varlat,varlong),missval=-9999)
vardate=ncvar_def(name='date',units='day',dim=list(varlat,varlong),missval=-9999)
new.nc=nc_create('snow.survey.nc',vars=list(varswe,varsite,vardate))
但当我尝试用以下内容填充值时:
ncvar_put(new.nc,varid=varswe,vals=swe$swe.obs)
Error in ncvar_put(new.nc, varid = varswe, vals = swe$swe.obs) :
ncvar_put: error: you asked to write 12159169 values, but the passed data array only has 3487 entries!
这里是new.nc:
> new.nc
[1] "File snow.survey.nc (NC_FORMAT_CLASSIC):"
[1] ""
[1] " 3 variables:"
[1] " float swe.obs[latitude,longitude] "
[1] " units: meters"
[1] " _FillValue: -9999"
[1] " float site[latitude,longitude] "
[1] " units: site"
[1] " _FillValue: -9999"
[1] " float date[latitude,longitude] "
[1] " units: day"
[1] " _FillValue: -9999"
[1] ""
[1] " 2 dimensions:"
[1] " latitude Size:3487"
[1] " units: deg"
[1] " long_name: latitude"
[1] " longitude Size:3487"
[1] " units: deg"
[1] " long_name: longitude"
另外,如何在netcdf文件中定义投影字符串?在这种情况下,“+proj=longlat+datum=NAD83”这样其他用户就知道他们在处理什么了?
谢谢
更新1:
我基于@Spacedman尝试了这一点,但仍然出现了一个错误。我是否需要为坐标的范围创建一个规则的网格,然后尝试将其用作标注的范围?我不会在没有数据点的地方填写NA。我也没有等间距的测量
coords=cbind(coordinates(swe)[,1],coordinates(swe)[,2])
nccoords=ncdim_def(name='coords',units='site',vals=coords)
varswe=ncvar_def(name='swe.obs',units='meters',dim=nccoords,missval=-9999,longname='survey points')
创建新的“new.nc”,此时简化为一个变量
new.nc=nc_create('snow.survey.nc',vars=varswe)
ncvar_put(new.nc,varid=varswe,vals=swe$swe.obs)
Error in ncvar_put(new.nc, varid = varswe, vals = swe$swe.obs) :
ncvar_put: error: you asked to write 6974 values, but the passed data array only has 3487 entries!
你已经把你的维度扭曲了。lat long数据应保存在3487x2维度变量中,属性应保存在3487x1变量中。您已经创建了维度为3487x3487的东西(varswe、varsite…)。这不是一个网格
如果您的点位于网格上(如果完成,则必须是317x11网格),则需要获得唯一的lat和long值,并为这些值创建长度为317和11的尺寸。hmmm@Spacedman我认为我理解了,但仍然出现类似错误(请参见问题中的更新1)