Использование terra SpatRaster в качестве базовой карты ggmap

#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()
 

нанесен с помощью ggplot, но использует эстетику заливки

Ответ №1:

Я не совсем понимаю ваш вопрос, потому что мне кажется, что вы о чем-то просите, а потом пишете, что вам удалось найти обходной путь к тому, что вы просили в начале.

Тем не менее, если вам нужно просто иметь более одной эстетики заливки, вы можете использовать ggnewscale пакет здесь . Таким образом, вы можете нанести несколько слоев с разной заливкой (или цветом, если необходимо) для каждого слоя.

Комментарии:

1. Ха, я не знал о ggnewscale. Я думаю, что я все же предпочел бы маршрут ggmap, поскольку сообщение readme от ggnewscale «Это очень экспериментально, поэтому используйте на свой страх и риск!» дает мне небольшую паузу. Но если он достаточно стабилен, это может быть отличным вариантом. Спасибо!