【问题标题】:RGoogleMaps axesRGoogleMaps 坐标轴
【发布时间】:2011-06-06 21:46:50
【问题描述】:

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

感谢您的宝贵时间。

【问题讨论】:

  • 这似乎是代码中的一个错误。如果忽略度数符号,您会注意到该图在两个轴上都标记为 -320 到 +320。这与绘图大小相同(即 640 x 640)。我没有跟踪所有代码,但我怀疑经度和纬度没有传递给轴标签。您不妨联系包维护者。

标签: r axes rgooglemaps


【解决方案1】:
  1. 是的

  2. 正如@Andrie 所建议的,这似乎是一个错误。当axes = TRUE 时,PlotOnStaticMap() 调用的degAxis() 函数提取axTicks() 找到的漂亮刻度的x 和y 绘图坐标。 degAxis() 期望这些坐标位于地图的坐标系中,但 rGoogleMaps 将它们作为像素坐标返回,从中心原点计算得出。绘图大小为 640 x 640,漂亮的刻度线在 E-W 和 N-S 方向上分配给 -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)
    

【讨论】:

  • 我早就不需要这个了,但这似乎是一个可行的解决方法!我认为它甚至可以在某种程度上通过弄乱绘图边距来改进,这样轴标签实际上就在地图本身之外,但我没有动力再从事这个项目了。无论如何,干得好,希望其他人会发现这很有用!
  • 实际上,恐怕我的解决方案不正确......无论指定的mar如何,用作刻度标签的坐标都是恒定的。对不起。
猜你喜欢
  • 2011-09-01
  • 2014-06-18
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多