Добавьте круг в 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
(см. ссылка).