如何使用R在地图上显示经纬线?

如何使用R在地图上显示经纬线?,r,plot,ggplot2,R,Plot,Ggplot2,我试图将这个二进制文件unsigned字符,pixel=720,lines=360看作一个映射,我尝试了下面给出的一段代码。首先,我下载并保存为landcover.bin 我得到了一张看起来很奇怪的地图,然后我把ncol和nrow交换为 y<-matrix((data=sd), ncol=720, nrow=360) image(y) 我有一张合理的地图,但是颠倒了 我的问题是,有人能告诉我如何显示我的文件,它不应该是相同的,以及如何显示此地图上显示的经度和纬度:也许R地图包中的地图更适

我试图将这个二进制文件unsigned字符,pixel=720,lines=360看作一个映射,我尝试了下面给出的一段代码。首先,我下载并保存为landcover.bin

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

y<-matrix((data=sd), ncol=720, nrow=360)
image(y)
我有一张合理的地图,但是颠倒了


我的问题是,有人能告诉我如何显示我的文件,它不应该是相同的,以及如何显示此地图上显示的经度和纬度:

也许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 )
结果:


也许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 )
结果:


必须镜像矩阵上的列才能得到正确的结果。使用一条线来绘制你的纵横线

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提到的,有许多包处理地图。您应该使用其中之一。

您必须镜像矩阵上的列才能获得正确的结果。使用一条线来绘制你的纵横线

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提到的,有许多包处理地图。您应该使用其中之一。

要获得基于ggplot2的解决方案,您可以使用geom_光栅。请参见我的答案以获取示例。ggplot2显示横向线,要调整此参数,请参见我的答案,特别是scale_{x,y}*的breaks参数

ggplot2需要data.frame,而不是矩阵或数组,请使用melt执行此转换示例。要获得正确的lat lon值,请确保阵列具有正确的dimnames,有关更多信息,请参阅?dimnames

要获得基于ggplot2的解决方案,可以使用geom_光栅。请参见我的答案以获取示例。ggplot2显示横向线,要调整此参数,请参见我的答案,特别是scale_{x,y}*的breaks参数

ggplot2需要data.frame,而不是矩阵或数组,请使用melt执行此转换示例。要获得正确的lat lon值,请确保阵列具有正确的dimnames,有关更多信息,请参阅?dimnames

对基于地理位置的网格数据使用光栅包

您可以通过一些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)
看起来好多了。现在,让我们修复范围:

> 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)
请注意,这仍然使用连续的颜色方案,即使您有离散的数据,我猜这是一个分类方案。您可以使用光栅将数字映射到颜色,但这是另一个问题……

使用光栅包处理基于地理位置的网格数据

您可以通过一些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)
看起来好多了。现在,让我们修复范围:

> 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)

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

谢谢,但为什么轴上的值是0.0 0.2 0.3而不是30 0 30。因为这是图像的默认值,因为您尚未指定比例。若要更改此设置,请抑制x轴记号,并计算LAT和longs,然后将其用于标签。但是,同样,您应该为此使用适当的软件包。这是错误的做法。事实上,这是在R中做事情的常用方法。谷歌在R中抑制x轴。我设法抑制x轴和y轴。但不明白你的意思是计算lat和long,然后将其用于标签。你能告诉我怎么做吗?在你抑制轴之后,使用“轴”命令将其放回。查找?轴,您可以看到如何修改点的标签。谢谢,但为什么轴上的值是0.0 0.2 0.3而不是30 0 30。因为这是图像的默认值,因为您尚未指定比例。若要更改此设置,请抑制x轴记号,并计算LAT和longs,然后将其用于标签。但是,同样,您应该为此使用适当的软件包。这是错误的做法。事实上,这是在R中做事情的常用方法。谷歌在R中抑制x轴。我设法抑制x轴和y轴。但不明白你的意思是计算lat和long,然后将其用于标签。你能告诉我怎么做吗?在你抑制轴之后,使用“轴”命令将其放回。向上看?轴,您可以看到如何修改点的标签。