1

我正在尝试将此二进制文件(无符号字符,像素 = 720 和行 = 360)作为地图查看,我尝试了下面给出的代码。首先,我下载并保存为landcover.bin.

conne <- file("C:\\landcover.bin", "rb")
sd<- readBin(conne, integer(), size=1,  n=360*720, signed=F)
y<-matrix((data=sd), ncol=360, nrow=720)
image(y)

我得到了一张看起来很奇怪的地图,然后我将 ncol 和 nrow 交换为

y<-matrix((data=sd), ncol=720, nrow=360)
image(y)

我有一张合理的地图,但颠倒了

我的问题谁能告诉我如何将我的文件显示为(不应该相同)以及如何显示此地图上显示的经度和纬度:

4

4 回答 4

4

您必须镜像矩阵上的列才能获得正确的结果。abline用来画出你的经纬度。

conne <- file("Landcover.bin", "rb")
sd<- readBin(conne, integer(), size=1,  n=360*720, signed=F)
y<-matrix(sd,ncol=360,nrow=720)
image(y[,360:1])

lats=seq(-90,90,by=30)
longs=seq(-180,180,by=30) 

trans.lats=(lats+90) / 180
trans.longs=(longs+180) / 360

abline(h=trans.lats,v=trans.longs)

在此处输入图像描述

但是,正如@January 提到的,有许多处理地图的包。您应该使用其中之一。

于 2012-10-15T14:34:39.520 回答
4

raster包用于基于地理的网格数据。

您可能可以使用一些 rgdal 技巧直接从二进制文件中读取它,但让我们通过矩阵来完成。

> require(raster)
> conne <- file("landcover.bin","rb")
> sd<- readBin(conne, integer(), size=1,  n=360*720, signed=F)
> y<-t(matrix((data=sd), ncol=360, nrow=720))
> r = raster(y)

现在你有了一个光栅对象。但是如果你绘制它,你会注意到三件事——很多绿色,比例上升到 250,轴从 0 到 1。

该地图似乎使用 255 表示大海。如果我们将其重新编码为 NA,我们将获得更好的地图:

> r[r==255]=NA
> plot(r)

看起来好多了。现在让我们修复范围:

> extent(r) = extent(c(xmn=-180,xmx=180,ymn=-90,ymx=90))
> plot(r)

最后我们应该告诉 R,这是在经纬坐标系中 - 很可能是 epsg:4326:

> projection(r)=CRS("+init=epsg:4326")
> plot(r)

分类世界地图

请注意,即使您有离散数据(我猜这是分类方案),这仍然使用连续配色方案。您可以使用光栅将数字映射到颜色,但这是另一个问题......

于 2012-10-15T16:39:53.563 回答
3

要获得ggplot2基于解决方案,您可以使用geom_raster. 例如,请参阅我对您之前的这个问题的回答。ggplot2显示 lat lon 行,要对此进行调整,请参阅我对您的另一个问题的回答,特别breaksscale_{x,y}_*.

ggplot2需要一个 data.frame,而不是matrixor array,用于melt执行此转换(此处为示例)。要获得正确的 lat lon 值,请注意array具有正确的dimnames,请参阅?dimnames以获取更多信息。

于 2012-10-15T15:04:12.567 回答
2

也许 R 地图包中的地图更适合您?

library( maps )
map( "world" )
points(  -0.11832, 51.50939, pch= 19, col= "red" )
text(  -0.11832, 51.50939, "London", pos=3, col= "red" )
abline( h= 0 )
text( -150, 0, "Equator", pos= 3 )
abline( v= 0 )

结果:

在此处输入图像描述

于 2012-10-15T14:32:09.353 回答