【问题标题】:How to display longitude and latitude lines on a map using R?如何使用 R 在地图上显示经度和纬度线?
【发布时间】:2015-08-03 22:22:51
【问题描述】:

我正在尝试将此二进制文件(无符号字符,像素 = 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)

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

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

【问题讨论】:

    标签: r plot ggplot2


    【解决方案1】:

    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 这是在 lat-long 坐标系中 - 很可能是 epsg:4326:

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

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

    【讨论】:

      【解决方案2】:

      您必须镜像矩阵上的列才能获得正确的结果。使用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 所提到的,有很多包可以处理地图。您应该使用其中之一。

      【讨论】:

      • 谢谢,但为什么轴上的值是 0.0 0.2 0.3 而不是 30 0 30 。
      • 因为这是image 的默认值,因为您尚未指定比例。要更改这一点,请抑制 x 轴刻度,并计算您的纬度和经度,然后将其用于标签。但是,同样,您应该为此使用适当的包。这是错误的做法。
      • 其实是R中常用的做事方式。Google在R中抑制x轴。
      • 我设法抑制了 x 轴和 y。但不明白你的意思是计算你的 lats 和 longs,然后将它们用于标签。你能告诉我我是怎么做的吗?
      • 抑制轴后,使用axis命令将其放回原处。查看?axis可以看到如何修改点的标签。
      【解决方案3】:

      要获得基于ggplot2 的解决方案,您可以使用geom_raster。例如,请参阅我对此earlier question of yours 的回答。 ggplot2 显示纬度线,要对此进行调整,请参见我对 this other question of yours 的回答,特别是 scale_{x,y}_*breaks 参数。

      ggplot2 需要一个data.frame,而不是matrixarray,使用melt 来做这个转换(例如here)。要获得正确的纬度值,请注意arraydimnames 是否正确,请参阅?dimnames 了解更多信息。

      【讨论】:

        【解决方案4】:

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

        结果:

        【讨论】:

          猜你喜欢
          • 2014-04-30
          • 1970-01-01
          • 2012-04-14
          • 1970-01-01
          • 2018-08-18
          • 2013-02-26
          • 1970-01-01
          • 1970-01-01
          • 2012-10-09
          相关资源
          最近更新 更多