【发布时间】:2021-06-26 06:21:19
【问题描述】:
总结:如何使用 SpatRaster 对象作为 ggmap 的底图?
嗨,我正在使用 ggplot 在 R 中绘制地图。我想要一张来自 OpenStreetMaps 的底图,然后我想在上面绘制多边形等。
ggmap 包曾经非常适合这个,但是现在使用谷歌地图太复杂了,OpenStreetMaps 根本不起作用。
我遇到过ggspatial::annotation_map_tile(),但它不允许那么多地图类型,而且速度也非常慢,所以如果可以的话,我想避免它。
我也遇到过maptiles::get_tiles(),它有更多选择,而且看起来速度更快。 ????
问题在于它返回的 SpatRaster 对象(来自 terra 包)不会自动用作 ggmap 的基本地图。 有没有办法转换它?
通过查看 ggmap 的get_stamenmap() 中发生的情况,我已经设法找到了一部分,但地图显示为绿色。我认为这是因为 raster::raster() 和 raster::as.raster() 不能像我希望的那样在这种对象类型上工作,但我对这些类一无所知,所以我不知道下一步该去哪里。
library(dplyr)
library(ggmap)
library(sf)
library(maptiles)
nc <- st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
nc_osm <- get_tiles(nc, crop = TRUE)
# This is what it should look like
plot_tiles(nc_osm)
# I don't know these data types I'm trying to convert to
nc_ggmap <- nc_osm %>%
raster::raster() %>%
raster::as.raster()
# Set attributes manually, like in get_stamenmap()
class(nc_ggmap) <- c("ggmap", "raster")
attr(nc_ggmap, "bb") <- data.frame(ll.lat = 33.8,
ll.lon = -84.3,
ur.lat = 36.5,
ur.lon = -75.4)
attr(nc_ggmap, "source") <- ""
# Try to map it... green ????
nc_ggmap %>%
ggmap()
顺便说一句,我已经设法使用 ggplot 绘制对象,通过计算每个像素的颜色并将它们用于fill 美学,但我需要稍后将这种美学用于我的多边形,这就是为什么我非常热衷于使用 ggmap 方法。
nc_osm %>%
terra::as.data.frame(xy = TRUE) %>%
as_tibble() %>%
mutate(hex = rgb(lyr.1, lyr.2, lyr.3, maxColorValue = 255)) %>%
ggplot(aes(x, y, fill = hex)) +
geom_tile() +
scale_fill_identity() +
coord_fixed() +
theme_void()
【问题讨论】: