将栅格堆栈范围从米转换为 lat/lon 坐标
Converting raster stack extent from meters to lat/lon coordinates
我有一个格式如下的栅格堆栈,我 . This works but the latitude and longitude variables are in 'meters' which is the extent of the raster file, and I need them to be in decimal degrees. The R Grid file is here 格式如下:
class : RasterBrick
dimensions : 205, 170, 34850, 12 (nrow, ncol, ncell, nlayers)
resolution : 1, 1 (x, y)
extent : 160.5, 330.5, 145.5, 350.5 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : \TavgM_1981.grd
names : Jan.1981, Feb.1981, Mar.1981, Apr.1981, May.1981, Jun.1981, Jul.1981, Aug.1981, Sep.1981, Oct.1981, Nov.1981, Dec.1981
min values : 1.9912137, 0.8120775, 4.0446638, 4.4135274, 6.5349769, 8.6149150, 9.9991916, 11.8400562, 9.6407796, 3.5005649, 4.1205872, -0.6106244
max values : 9.850221, 9.121176, 10.238524, 9.858942, 11.669445, 14.260988, 15.722292, 17.235090, 15.708690, 11.598482, 11.552235, 8.981533
time : Jan 1981, Feb 1981, Mar 1981, Apr 1981, May 1981, Jun 1981, Jul 1981, Aug 1981, Sep 1981, Oct 1981, Nov 1981, Dec 1981
理想情况下,我想将其转换为具有以下格式以供模型读取的 NetCDF 文件:
Dimensions: (lat: 408, lon: 881, nb2: 2, time: 660)
Coordinates:
* lon (lon) float64 -44.81 -44.69 -44.56 -44.44 -44.31 -44.19 ...
* lat (lat) float64 21.81 21.94 22.06 22.19 22.31 22.44 22.56 22.69 ...
* time (time) datetime64[ns] 1951-01-16T12:00:00 1951-02-16T12:00:00 ...
Dimensions without coordinates: nb2
Data variables:
time_bnds (time, nb2) datetime64[ns] 1951-01-16T12:00:00 ...
tas (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ...
我尝试使用此方法将 Raster Brick 范围转换为 lat/lon:
sputm <- SpatialPoints(test@extent@xmin, proj4string=CRS("+proj=utm +zone=29N +datum=WGS84"))
但这给出了这个错误:
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘coordinates’ for signature ‘"numeric"’
编辑:
也尝试过
crs(test) <- '+proj=merc +datum=WGS84'
x <- projectRaster(test, crs='+proj=longlat +datum=WGS84')
writeRaster(x, "rstack2.nc", overwrite=TRUE, format="CDF", varname="Temperature", varunit="degC",
longname="Temperature -- raster stack to netCDF", xname="Longitude", yname="Latitude", zname="Time (Month)")
但是当我在 panoply 中检查它时,纬度和经度坐标都是 0.0。
我不确定从这里到哪里去。
就我对爱尔兰的认识而言,我查看了爱尔兰的预测。我认为这是 TM75 / Irish Grid。我修改了你的光栅分辨率,使其为 2500m。
library(raster)
r <- stack("~/Bureau/TavgM_1981")
xmax(r) <- xmin(r) + 2500 * ncol(r)
ymax(r) <- ymin(r) + 2500 * nrow(r)
crs(r) <- "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m +no_defs"
# Convert to degrees
x_wgs84 <- projectRaster(r, crs='+proj=longlat +datum=WGS84')
writeRaster(x, "~/Bureau/TavgM_wgs84.tif", overwrite = TRUE)
您将在下方看到此分辨率+投影修改后与目标相比的结果。
我们离现实并不远,但您的原始光栅中有一些不好的地方。如果这是(不幸的)通常在有人给你一层时没有 crs,那么错过正确的分辨率是不常见的。
由于您提供的栅格被保存为“.gri/.grd”文件,这意味着它是用 R 生成的。您应该尝试获取生成文件的原始 R 代码,而不是最终修改的图层。
我有一个格式如下的栅格堆栈,我
class : RasterBrick
dimensions : 205, 170, 34850, 12 (nrow, ncol, ncell, nlayers)
resolution : 1, 1 (x, y)
extent : 160.5, 330.5, 145.5, 350.5 (xmin, xmax, ymin, ymax)
coord. ref. : NA
data source : \TavgM_1981.grd
names : Jan.1981, Feb.1981, Mar.1981, Apr.1981, May.1981, Jun.1981, Jul.1981, Aug.1981, Sep.1981, Oct.1981, Nov.1981, Dec.1981
min values : 1.9912137, 0.8120775, 4.0446638, 4.4135274, 6.5349769, 8.6149150, 9.9991916, 11.8400562, 9.6407796, 3.5005649, 4.1205872, -0.6106244
max values : 9.850221, 9.121176, 10.238524, 9.858942, 11.669445, 14.260988, 15.722292, 17.235090, 15.708690, 11.598482, 11.552235, 8.981533
time : Jan 1981, Feb 1981, Mar 1981, Apr 1981, May 1981, Jun 1981, Jul 1981, Aug 1981, Sep 1981, Oct 1981, Nov 1981, Dec 1981
理想情况下,我想将其转换为具有以下格式以供模型读取的 NetCDF 文件:
Dimensions: (lat: 408, lon: 881, nb2: 2, time: 660)
Coordinates:
* lon (lon) float64 -44.81 -44.69 -44.56 -44.44 -44.31 -44.19 ...
* lat (lat) float64 21.81 21.94 22.06 22.19 22.31 22.44 22.56 22.69 ...
* time (time) datetime64[ns] 1951-01-16T12:00:00 1951-02-16T12:00:00 ...
Dimensions without coordinates: nb2
Data variables:
time_bnds (time, nb2) datetime64[ns] 1951-01-16T12:00:00 ...
tas (time, lat, lon) float64 nan nan nan nan nan nan nan nan nan ...
我尝试使用此方法将 Raster Brick 范围转换为 lat/lon:
sputm <- SpatialPoints(test@extent@xmin, proj4string=CRS("+proj=utm +zone=29N +datum=WGS84"))
但这给出了这个错误:
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘coordinates’ for signature ‘"numeric"’
编辑: 也尝试过
crs(test) <- '+proj=merc +datum=WGS84'
x <- projectRaster(test, crs='+proj=longlat +datum=WGS84')
writeRaster(x, "rstack2.nc", overwrite=TRUE, format="CDF", varname="Temperature", varunit="degC",
longname="Temperature -- raster stack to netCDF", xname="Longitude", yname="Latitude", zname="Time (Month)")
但是当我在 panoply 中检查它时,纬度和经度坐标都是 0.0。
我不确定从这里到哪里去。
就我对爱尔兰的认识而言,我查看了爱尔兰的预测。我认为这是 TM75 / Irish Grid。我修改了你的光栅分辨率,使其为 2500m。
library(raster)
r <- stack("~/Bureau/TavgM_1981")
xmax(r) <- xmin(r) + 2500 * ncol(r)
ymax(r) <- ymin(r) + 2500 * nrow(r)
crs(r) <- "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +ellps=mod_airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m +no_defs"
# Convert to degrees
x_wgs84 <- projectRaster(r, crs='+proj=longlat +datum=WGS84')
writeRaster(x, "~/Bureau/TavgM_wgs84.tif", overwrite = TRUE)
您将在下方看到此分辨率+投影修改后与目标相比的结果。
我们离现实并不远,但您的原始光栅中有一些不好的地方。如果这是(不幸的)通常在有人给你一层时没有 crs,那么错过正确的分辨率是不常见的。
由于您提供的栅格被保存为“.gri/.grd”文件,这意味着它是用 R 生成的。您应该尝试获取生成文件的原始 R 代码,而不是最终修改的图层。