rDGAL、Tiff 文件和 WorldFile
rDGAL, Tiff Files, and WorldFile
我有一组 tiff 文件,在 Iowa State University 的像素位置显示整个美国大陆的对流天气(NAD83 投影)。我的目标是将像素位置转换为 lat/lon 数据。我将 tiff 文件数据作为 SpatialGridDataFrame 读入...
imageData = readGDAL( fileNameDir, silent = TRUE )
我在某处读到,如果 tiff 文件中不存在投影数据,readGDAL 将寻找一个世界文件,因此我创建了一个包含必要信息的文件 (nad83WorldFile.wld),see info at ESRI。我将 wld 文件放在与我的 R 脚本相同的目录中。 wld 文件的系数是:
A = 0.01
B = 0.0
C = 0.0
D = -0.01
E = -126.0
F = 50.0
我寻求有关像素到 lat/lon 投影的建议和指导。上面的超文本链接中提供了 fileNameDir 的 readGDAL 示例的数据文件和有关世界文件格式的文档。我不得不将文件扩展名从 *.png 更改为 *.tiff。
通常,如果您知道您的数据是投影的,但该投影不是您的 tif 文件的一部分,您可以在导入后简单地将它添加到您的 R 对象中:
proj4string(imageData) <- CRS("your projection")
我喜欢为此使用 EPSG,例如,如果您的 tif 在 GoogleEarth 投影中,我会这样做:
proj4string(imageData) <- CRS("+init=EPSG:4326")
只要找到你的 NAD83 精确投影是什么(这个网站可以帮助 http://spatialreference.org/)。
然后您可以在您选择的投影中重新投影它:
imageDataProj <- spTransform(imageDataProj, CRS("your new projection"))
附带说明一下,我总是更喜欢使用 raster
包来处理光栅格式。但是,用 R 更改大光栅文件的投影可能很挑剔,所以现在我直接使用 GDAL(通过 gdalwarp
)。您可以使用 gdalUtils
包在 R 中很容易地调用所有 gdal 选项,但您必须事后将结果导入回 R。
根据 OP 的评论进行编辑:
使用光栅包:
library(raster)
正在加载 tif:
rr <- raster("C:\temp\n0r_201601011100.tif")
在函数中保存您的像素坐标方程。注意到我更改了 Lat 函数(删除了负号,它不起作用,你必须验证它)
Lon = function(JJ) 0.01 * JJ + 162
Lat = function(II) 0.01 * II + 50.0
以像素坐标获取原始栅格的范围:
ext.rr <- extent(rr)
准备要投影的新空栅格,具有良好的分辨率和范围:
rr2 <- raster(nrows=nrow(rr), ncols=ncol(rr), xmn=Lon(ext.rr@xmin), xmx=Lon(ext.rr@xmax), ymn=Lat(ext.rr@ymin), ymx=Lat(ext.rr@ymax))
用您修改后的值填充这个新栅格(按照您在评论中给出的等式):
values(rr2) <- (values(rr) - 7) * 5
你得到:
rr2
class : RasterLayer
dimensions : 2600, 6000, 15600000 (nrow, ncol, ncell)
resolution : 0.01, 0.01 (x, y)
extent : 162, 222, 50, 76 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
data source : in memory
names : layer
values : -35, 50 (min, max)
请注意 lat-long 投影由栅格函数自动 pick-up。希望这就是您要找的。
我有一组 tiff 文件,在 Iowa State University 的像素位置显示整个美国大陆的对流天气(NAD83 投影)。我的目标是将像素位置转换为 lat/lon 数据。我将 tiff 文件数据作为 SpatialGridDataFrame 读入...
imageData = readGDAL( fileNameDir, silent = TRUE )
我在某处读到,如果 tiff 文件中不存在投影数据,readGDAL 将寻找一个世界文件,因此我创建了一个包含必要信息的文件 (nad83WorldFile.wld),see info at ESRI。我将 wld 文件放在与我的 R 脚本相同的目录中。 wld 文件的系数是:
A = 0.01
B = 0.0
C = 0.0
D = -0.01
E = -126.0
F = 50.0
我寻求有关像素到 lat/lon 投影的建议和指导。上面的超文本链接中提供了 fileNameDir 的 readGDAL 示例的数据文件和有关世界文件格式的文档。我不得不将文件扩展名从 *.png 更改为 *.tiff。
通常,如果您知道您的数据是投影的,但该投影不是您的 tif 文件的一部分,您可以在导入后简单地将它添加到您的 R 对象中:
proj4string(imageData) <- CRS("your projection")
我喜欢为此使用 EPSG,例如,如果您的 tif 在 GoogleEarth 投影中,我会这样做:
proj4string(imageData) <- CRS("+init=EPSG:4326")
只要找到你的 NAD83 精确投影是什么(这个网站可以帮助 http://spatialreference.org/)。
然后您可以在您选择的投影中重新投影它:
imageDataProj <- spTransform(imageDataProj, CRS("your new projection"))
附带说明一下,我总是更喜欢使用 raster
包来处理光栅格式。但是,用 R 更改大光栅文件的投影可能很挑剔,所以现在我直接使用 GDAL(通过 gdalwarp
)。您可以使用 gdalUtils
包在 R 中很容易地调用所有 gdal 选项,但您必须事后将结果导入回 R。
根据 OP 的评论进行编辑:
使用光栅包:
library(raster)
正在加载 tif:
rr <- raster("C:\temp\n0r_201601011100.tif")
在函数中保存您的像素坐标方程。注意到我更改了 Lat 函数(删除了负号,它不起作用,你必须验证它)
Lon = function(JJ) 0.01 * JJ + 162
Lat = function(II) 0.01 * II + 50.0
以像素坐标获取原始栅格的范围:
ext.rr <- extent(rr)
准备要投影的新空栅格,具有良好的分辨率和范围:
rr2 <- raster(nrows=nrow(rr), ncols=ncol(rr), xmn=Lon(ext.rr@xmin), xmx=Lon(ext.rr@xmax), ymn=Lat(ext.rr@ymin), ymx=Lat(ext.rr@ymax))
用您修改后的值填充这个新栅格(按照您在评论中给出的等式):
values(rr2) <- (values(rr) - 7) * 5
你得到:
rr2
class : RasterLayer
dimensions : 2600, 6000, 15600000 (nrow, ncol, ncell)
resolution : 0.01, 0.01 (x, y)
extent : 162, 222, 50, 76 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0
data source : in memory
names : layer
values : -35, 50 (min, max)
请注意 lat-long 投影由栅格函数自动 pick-up。希望这就是您要找的。