如何在ggmap中更改地图类型?

3

我在更改ggmap的背景时遇到了问题。当我尝试更改maptype时,它总是显示为terrain。 我想将其更改为satellite。有任何建议吗?这是我的代码:

 library(ggmap)
 # Long and Lat Coordinates
 Cuba_all <- data.frame("Longitude" = c(-79.79623, -79.42313, -79.01722, -80.29218, -80.50040, -80.51981, -80.36674, -79.87957, -79.66906, -79.76122, -80.26587, -79.91689, -80.10454, -80.22530, -80.12910, -79.98889, -79.84307, -79.81694, -80.22201, -80.48088, -80.44482, -80.29068, -80.36213, -80.50879, -80.29634), "Latitude" = c(22.06622, 22.14845, 22.20900, 22.05258, 22.30107, 22.88154, 22.70679, 22.53541, 22.39237, 22.35697, 21.91868, 22.08949, 21.83760, 22.10561, 22.11061, 22.02766, 22.04936, 22.37516, 22.56684, 22.44313, 22.44416, 22.50470, 22.75872, 22.35473, 22.49178))
 # Create Cuba Dimensions
 sbbox <- make_bbox(lon = Cuba_all$Longitude, lat = Cuba_all$Latitude, f = .1)
 sbbox
 # Grab Map of Cuba
 sq_map <- get_map(location = sbbox, source = "google", maptype = "satellite")
 # Plot Map
 ggmap(sq_map)

1
请查看您结果的“maptype”。我猜您没有向谷歌服务器提供正确的密钥,因此“get_map”函数默认使用“stamen”地图,该地图没有“satellite”选项。 - IRTFM
1个回答

3

@42的评论在某种程度上是正确的(据我所知)。但问题不一定是您的API密钥,而是您的位置规范。Google地图服务器希望将位置指定为中心的经度/纬度,再加上缩放因子。如果您以边界框格式提交位置,则get_map()悄悄地决定获取Stamen地形图;这对我来说似乎是get_map()中的一个错误(或“不足之处”),并且是ggmap问题列表上至少两个 问题的主题。

无论如何,当我指定了正确的经度/纬度向量,并尝试调整缩放因子以使其大致正确时(我不知道如何做到这一点除了反复试错...),它对我有用。

sm <- with(Cuba_all,c(lon=median(Longitude),lat=median(Latitude)))
sq_map1 <- get_map(location = sm, zoom=9,
                   source = "google", maptype = "satellite")
ggmap(sq_map1)+
    geom_point(data=Cuba_all,aes(x=Longitude,y=Latitude),colour="red")
ggsave("cuba.png")

enter image description here


稍微深入研究get_map(),这似乎是开发人员的疏忽。在ggmap的开发版本中已经修复了这个问题,但尚未更新到CRAN版本(请参见此处的评论here)。
这段代码:
if (is.numeric(location) && length(location) == 4) {
    location_type <- "bbox"
    location_stop <- FALSE
    source <- "stamen"
    maptype <- "terrain"
    ## ...

检测到位置已作为边界框给出,并自动将源设置为“stamen”和地图类型设置为“terrain”。稍后有一些代码看起来应该在您传递带有source ==“google”的边界框时发出警告,但是它永远无法到达(因为此时源已更改为“stamen”)...
if (source == "google") {
    if (location_type == "bbox") {
        warning("bounding box given to google - spatial extent only approximate.", 
            call. = FALSE, immediate. = TRUE)
        message("converting bounding box to center/zoom specification. (experimental)")
        user_bbox <- location
        location <- c(lon = mean(location[c("left", "right")]), 
            lat = mean(location[c("bottom", "top")]))
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接