2017-02-07 30 views
1

我有一套tiff文件,可以在Iowa State University的像素位置显示整个美国大陆的对流天气(NAD83投影)。我的目标是将像素位置转换为纬度/经度数据。我在TIFF文件中读取数据的SpatialGridDataFrame与...rDGAL,Tiff文件和WorldFile

imageData = readGDAL(fileNameDir, silent = TRUE) 

我读的地方,readGDAL将寻求如果TIFF文件不存在的投影数据world文件,所以我创造了这样一个文件(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 

我寻求有关pixel-to-lat/lon投影的建议和指导。在上面的超文本链接中提供了readGDAL fileNameDir示例的数据文件和世界文件格式的文档。我必须将文件扩展名从* .png更改为* .tiff。

回答

1

通常情况下,如果你知道你的数据预测,但这一预测是不是你的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中。

EDITS以下从OP评论:

使用光栅包:

library(raster) 

加载TIF:

rr <- raster("C:\\temp\\n0r_201601011100.tif") 

为您节省像素坐标方程函数。注意到我改变了纬度功能(除去负号,但没有使用它,你必须验证)

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([email protected]), xmx=Lon([email protected]), ymn=Lat([email protected]), ymx=Lat([email protected])) 

填补了这一新的栅格与修改后的值(你在COMM给了以下公式已废除):

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) 

注意,经纬度长的投影是自动拾取通过光栅功能。希望这是你在找什么。

+0

这很有帮助。我的数据是在像素坐标中:'Lat = -0.01 * I + 50.0','Lon = 0.01 * J + 162.',其中I和J是网格中每个单元格的直线坐标。所以,我需要在执行任何投影更改之前先执行此操作。另外,什么是最好的方法来变换每个单元格中的整数值:'y =(intX - 7)* 5'? –

+0

我已经更新了我的回答下面的评论 – Bastien

+0

我谦卑的尊重鞠躬。谢谢。 –