在ggmap中添加一个圆圈

时间:2015-05-21 07:53:03

标签: r google-maps ggplot2 data-analysis 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)和半径表示例如以公里计。 我尝试使用类似问题(Draw a circle with 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,请分享它。

2 个答案:

答案 0 :(得分:1)

这是使用sf包和ggplot :: geom_sf的解决方案。首先,从坐标创建一个点并使用EPSG 32630转换到伦敦的UTM区域(30u),以便确定距离:

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

答案 1 :(得分:0)

您可以从地图对象获取经度和纬度范围:

> 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的函数(请参阅reference)。