3

我在 RGoogleMaps 中找不到关于轴标签的以下问题的任何文档:

library(RgoogleMaps)
datas <- structure(list(LAT = c(37.875, 37.925, 37.775, 37.875, 37.875), 
                   LON = c(-122.225, -122.225, -122.075, -122.075, -122.025)), 
                   .Names = c("LAT", "LON"), class = "data.frame", 
                   row.names = c(1L, 2L, 3L, 4L, 5L))
# Get bounding box.
boxt <- qbbox(lat = datas$LAT, lon = datas$LON)
MyMap <- GetMap.bbox(boxt$lonR, boxt$latR, destfile = "Arvin12Map.png", 
maptype = "mobile")
PlotOnStaticMap(MyMap, lat = datas$LAT, lon = datas$LON, 
                axes = TRUE, mar = rep(4, 4))

当我在我的计算机上运行它时,水平轴的范围从 300W 到 60E,但它们之间的刻度不是线性间隔的(300W、200W、100W、0、100E、160W、60W)。此外,垂直轴从 300S 线性移动到 300N。似乎无论我为数据提供什么数据,轴总是以这种方式标记。

我的问题是:
1.这个问题在其他机器上使用这个代码会出现吗?
2. 有人对此有解释吗?

3. 任何人都可以提出一种方法来获得正确的轴标签(假设这些是“不正确的”,但也许我在某种程度上误解了情节!)?

感谢您的时间。

4

1 回答 1

1
  1. 是的

  2. 正如@Andrie 建议的那样,这似乎是一个错误。时axes = TRUE,由degAxis()调用的函数PlotOnStaticMap()提取由 找到的漂亮刻度线的 x 和 y 绘图坐标axTicks()degAxis()期望这些坐标位于地图的坐标系中,但 rGoogleMaps 将它们作为像素坐标返回,从中心原点计算得出。绘图大小为 640 x 640,漂亮的刻度线在 EW 和 NS 方向上都分配给 -300、-200、-100、0,100、200、300。你最终得到 300W、200W、100W、0、100E、160W、60W,因为degreeLabelsEW()调用的函数degAxis()假设,给定经度必须在 [-180, 180] 范围内,任何高于 180 的经度实际上都在西半球(例如 200E 向东 20 度进入西半球,即 160W)。不知道为什么它在无意义的 N、S 和 W 坐标中表现不一样。

  3. 一个快速的解决方法,继续你的MyMap对象:

    PlotOnStaticMap(MyMap, lat = datas$LAT, lon = datas$LON, 
                    axes = FALSE, mar = rep(4.5, 4))
    
    # x-axis
    xrange <- MyMap$BBOX$ur[2] - MyMap$BBOX$ll[2]
    xticklength <- xrange / (length(axTicks(1)) - 1)
    xticklabs <- seq(MyMap$BBOX$ll[2], MyMap$BBOX$ur[2], xticklength)
    xticklabs <- parse(text = paste(sprintf('%.2f', abs(xticklabs)), 
        ifelse(xticklabs < 0, '*degree*W', '*degree*E'), sep=''))
    axis(1, at=axTicks(1), xticklabs, cex.axis=0.8)
    
    # y-axis
    yrange <- MyMap$BBOX$ur[1] - MyMap$BBOX$ll[1]
    yticklength <- yrange / (length(axTicks(2)) - 1)
    yticklabs <- seq(MyMap$BBOX$ll[1], MyMap$BBOX$ur[1], yticklength)
    yticklabs <- parse(text = paste(sprintf('%.2f', abs(yticklabs)), 
        ifelse(yticklabs < 0, '*degree*S', '*degree*N'), sep=''))
    axis(2, at=axTicks(2), yticklabs, cex.axis=0.8, las=1)
    
于 2012-02-04T08:40:01.963 回答