Добавляем круг в 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)))

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

РЕДАКТИРОВАТЬ: я нашел решение (https://gis.stackexchange.com/questions/119736/ggmap-create-circle-symbol-where-radius-represents-distance-miles-or-km), который использует другой пакет, и вывод правильный. Тем не менее, если кто-то знает, как это сделать с помощью ggmap, поделитесь, пожалуйста.


person Michał    schedule 21.05.2015    source источник
comment
Пробовали ли вы добавить + coord_equal() в конец графика карты?   -  person Phil    schedule 21.05.2015
comment
Да, но я думаю, что тогда он не надежен в плане расстояния   -  person Michał    schedule 21.05.2015
comment
Кроме того, вывод отличается, например, от вывода, полученного на этом веб-сайте: freemaptools.com/radius- вокруг точки.htm   -  person Michał    schedule 21.05.2015
comment
самая большая проблема, которую я вижу в вашем коде для создания круга, заключается в том, что ваш центр находится в парах широты, долготы, а не в парах расстояний в заданной паре миль или км... если вы используете этот пост link вы можете сгенерировать набор пар lat long, которые должны генерировать круг заданного размера независимо от увеличения   -  person Travis Gaddie    schedule 25.01.2017


Ответы (2)


Вот решение с использованием пакета 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 (широта/долгота WGS84) и постройте с помощью ggmap

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

print(p)
person sebdalgarno    schedule 27.02.2018

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

> 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 (см. справку).

person mitchus    schedule 25.05.2015
comment
Хотите продемонстрировать, что соответственно означает в этом случае? - person Roman Luštrik; 05.09.2015
comment
Разве «соответственно» не подразумевает просто привязку параметра размера круга к переменной, которая вставляется? Так, например, если широта и долгота вашего местоположения равны 37,8 и 122,4 соответственно, ваши углы для delta.y могут быть 37,9[ur] — 37,7[ll] — но вам придется построить расчет на своих ссылках, чтобы получить круги нужного вам размера для каждой координаты, которую вы ему подаете. - person leerssej; 15.06.2016