#r #ggmap #r-raster
#r #ggmap #r-растр
Вопрос:
Резюме: как мне использовать объект SpatRaster в качестве базовой карты для ggmap?
Привет, я делаю карты в R, используя ggplot. Мне нужна базовая карта из OpenStreetMaps, а затем я хочу построить полигоны и т. Д. Сверху.
Пакет ggmap раньше идеально подходил для этого, но использование Google maps сейчас слишком сложно, а 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()
Ответ №1:
Я не совсем понимаю ваш вопрос, потому что мне кажется, что вы о чем-то просите, а потом пишете, что вам удалось найти обходной путь к тому, что вы просили в начале.
Тем не менее, если вам нужно просто иметь более одной эстетики заливки, вы можете использовать ggnewscale
пакет здесь . Таким образом, вы можете нанести несколько слоев с разной заливкой (или цветом, если необходимо) для каждого слоя.
Комментарии:
1. Ха, я не знал о ggnewscale. Я думаю, что я все же предпочел бы маршрут ggmap, поскольку сообщение readme от ggnewscale «Это очень экспериментально, поэтому используйте на свой страх и риск!» дает мне небольшую паузу. Но если он достаточно стабилен, это может быть отличным вариантом. Спасибо!