将空间坐标分配给R中的数组

时间:2014-06-05 09:29:53

标签: r maps geospatial projection

我已从以下链接下载了一个数据文本文件:http://radon.unibas.ch/files/us_rn_50km.zip

解压缩后,我使用以下代码行来绘制数据:     #load libraries     图书馆(领域)

# function to rotate a matrix (and transpose)
rotate <- function(x) t(apply(x, 2, rev))

# read data
data <- as.matrix(read.table("~/Downloads/us_rn_50km.txt", skip=6))
data[data<=0] <- NA

# rotate data
data <- rotate(data)

# plot data
mean.rn <- mean(data, na.rm=T)
image.plot(data, main=paste("Mean Rn emissions =", sprintf("%.3f", mean.rn)) )

这一切看起来还不错,但我希望能够在lat-long网格上绘制数据。我想我需要将此数组转换为sp类对象,但我不知道如何。我知道以下内容(来自网站):“用于投影纬度和经度坐标的投影是用于北美地质十年(DNAG)地图的投影。投影类型是球面横向墨卡托,基本纬度为零使用的比例因子为0.926,没有错误的东向或北向。经度 - 纬度数据为NAD27,xy坐标的单位为米。使用的椭球是Clarke 1866。地图分辨率为50x50km“。但不知道如何处理这些数据。我试过了:

proj4string(data)=CRS("+init=epsg:4267")
data.sp <- SpatialPoints(data, CRS("+proj=longlat+ellps=clrk66+datum=NAD27") )

但有各种问题(使用NA)并且从根本上我认为数据格式不正确..我认为SpatialPoints函数需要位置上的数据(2-D)和第3个值数组与那些位置相关联(x,y,z数据 - 我想我的问题是根据我的数据得出x和y!)

任何帮助都非常感谢!

谢谢, 亚历

1 个答案:

答案 0 :(得分:2)

有问题的文件是ASCII栅格网格。坐标以这种格式隐含;标题描述了(通常)左下角的位置,以及网格尺寸和分辨率。在此标题部分之后,由空格分隔的值描述了变量在网格中的变化方式,其中值以行主顺序给出。如果您有兴趣,请在文本编辑器中打开它。

您可以使用精彩的raster包将此类文件导入R,如下所示:

download.file('http://radon.unibas.ch/files/us_rn_50km.zip', 
          destfile={f <- tempfile()})
unzip(f, exdir=tempdir())
r <- raster(file.path(tempdir(), 'us_rn_50km.txt'))

您可以立即绘制它,而无需指定投影:

no_crs

如果您不想将其转换为另一个CRS,则不一定需要分配当前坐标系。但是,既然你想要将它转换为WGS84(地理),你需要先分配CRS:

proj4string(r) <- '+proj=tmerc +lon_0=-100 +lat_0=0 +k_0=0.926 +datum=NAD27 +ellps=clrk66 +a=6378137 +b=6378137 +units=m +no_defs'

不幸的是,我不完全确定这个proj4string是否正确反映了website that provided the data给出的信息(如果它们实际上以标准格式提供了定义,那就太棒了。)

分配CRS后,您可以使用projectRaster

投影栅格
r.wgs84 <- projectRaster(r, crs='+init=epsg:4326')

如果你愿意,可以把它写成你选择的光栅格式,例如:

writeRaster(r.wgs84, filename='whatever.tif')