Добавьте круг в ggmap

Предположим, что я создаю карту Лондона, используя пакет ggmap:

library(ggmap)
library(mapproj)

map <- get_map(location = "London", zoom = 11, maptype = "satellite")

p <- ggmap(map)+ 
     theme(legend.position = "none") 

print(p)

Теперь я хотел бы добавить к этому графику круг с некоторыми координатами центра (скажем: lon = -0.1, lat = 52.23) и радиус, выраженный, например. в километрах. Я попытался использовать решение из аналогичного вопроса (Рисовать круг с ggplot2), где вы можете просто добавить к функции инструкцию вроде этого:

p <- p + annotate("path",
                  x = xc+r*cos(seq(0,2*pi,length.out=100)),
                  y = yc+r*sin(seq(0,2*pi,length.out=100)))

Это работает, но круг не является кругом из-за разного масштаба. Можно ли правильно это сделать? Любая помощь будет оценена!

EDIT: Я нашел решение (https://gis.stackexchange.com/info/119736/ggmap-create-circle-symbol-where-radius-represents-distance-miles-or-km), в котором используется другой пакет, и вывод правильный. Тем не менее, если кто-нибудь знает, как это сделать, используя ggmap, пожалуйста, поделитесь им.

Ответ 1

Вот решение, использующее пакет sf и ggplot:: geom_sf. Сначала создайте точку из координат и преобразуйте в зону Лондона UTM (30u) с EPSG 32630, чтобы можно было определить расстояние:

# dev version of ggplot2 required
library(sf)
library(ggplot2)

sf_pt <- st_point(c(-0.1, 52.23)) %>% 
  st_sfc(crs = 4326) %>%
  st_transform(32630)

затем добавьте буфер

sf_pt %<>% st_buffer(100)

теперь преобразуем обратно в epsg: 4326 (lat/lon WGS84) и график с ggmap

p <- ggmap(map) +
  geom_sf(data = sf_pt %>% st_transform(4326)) +
  theme(legend.position = "none") 

print(p)

Ответ 2

Вы можете получить длину и широту от объекта карты:

> m = get_map(location="london", zoom=11, maptype="satellite")
> corners = attributes(m)$bb
> delta.x = corners["ur.lon"] - corners["ll.lon"]
> delta.y = corners["ur.lat"] - corners["ll.lat"]

Затем соответствующим образом настройте свой путь. Также обратите внимание, что пакет ggmap имеет функцию под названием LonLat2XY (см. ссылка).