我有一张地图,上面画着8个点:
library(ggplot2) library(ggmap) data = data.frame( ID = as.numeric(c(1:8)), longitude = as.numeric(c(-63.27462, -63.26499, -63.25658, -63.2519, -63.2311, -63.2175, -63.23623, -63.25958)), latitude = as.numeric(c(17.6328, 17.64614, 17.64755, 17.64632, 17.64888, 17.63113, 17.61252, 17.62463)) ) island = get_map(location = c(lon = -63.247593, lat = 17.631598), zoom = 13, maptype = "satellite") islandMap = ggmap(island, extent = "panel", legend = "bottomright") RL = geom_point(aes(x = longitude, y = latitude), data = data, color = "#ff0000") islandMap + RL + scale_x_continuous(limits = c(-63.280, -63.21), expand = c(0, 0)) + scale_y_continuous(limits = c(17.605, 17.66), expand = c(0, 0))
现在我想围绕8个绘制位置绘制一个圆圈.圆的半径必须为450米.
这就是我的意思,但随后使用ggplot:https://gis.stackexchange.com/questions/119736/ggmap-create-circle-symbol-where-radius-represents-distance-miles-or-km
我怎样才能做到这一点?
如果你只在地球的一个小区域工作,这里是近似值.每个纬度都代表40075/360公里.每个经度表示(40075/360)*cos(纬度)千米.有了这个,我们可以计算大约一个数据框,包括圆上的所有点,知道圆心和半径.
library(ggplot2) library(ggmap) data = data.frame( ID = as.numeric(c(1:8)), longitude = as.numeric(c(-63.27462, -63.26499, -63.25658, -63.2519, -63.2311, -63.2175, -63.23623, -63.25958)), latitude = as.numeric(c(17.6328, 17.64614, 17.64755, 17.64632, 17.64888, 17.63113, 17.61252, 17.62463)) ) ################################################################################# # create circles data frame from the centers data frame make_circles <- function(centers, radius, nPoints = 100){ # centers: the data frame of centers with ID # radius: radius measured in kilometer # meanLat <- mean(centers$latitude) # length per longitude changes with lattitude, so need correction radiusLon <- radius /111 / cos(meanLat/57.3) radiusLat <- radius / 111 circleDF <- data.frame(ID = rep(centers$ID, each = nPoints)) angle <- seq(0,2*pi,length.out = nPoints) circleDF$lon <- unlist(lapply(centers$longitude, function(x) x + radiusLon * cos(angle))) circleDF$lat <- unlist(lapply(centers$latitude, function(x) x + radiusLat * sin(angle))) return(circleDF) } # here is the data frame for all circles myCircles <- make_circles(data, 0.45) ################################################################################## island = get_map(location = c(lon = -63.247593, lat = 17.631598), zoom = 13, maptype = "satellite") islandMap = ggmap(island, extent = "panel", legend = "bottomright") RL = geom_point(aes(x = longitude, y = latitude), data = data, color = "#ff0000") islandMap + RL + scale_x_continuous(limits = c(-63.280, -63.21), expand = c(0, 0)) + scale_y_continuous(limits = c(17.605, 17.66), expand = c(0, 0)) + ########### add circles geom_polygon(data = myCircles, aes(lon, lat, group = ID), color = "red", alpha = 0)
好吧,正如推荐的帖子已经暗示的那样 - 切换到以米为单位的投影,然后返回:
library(rgeos) library(sp) d <- SpatialPointsDataFrame(coords = data[, -1], data = data, proj4string = CRS("+init=epsg:4326")) d_mrc <- spTransform(d, CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"))
现在,width
可以用米来指定:
d_mrc_bff_mrc <- gBuffer(d_mrc, byid = TRUE, width = 450)
将其转换回来并使用geom_path
以下方法将其添加到绘图中:
d_mrc_bff <- spTransform(d_mrc_bff_mrc, CRS("+init=epsg:4326")) d_mrc_bff_fort <- fortify(d_mrc_bff) islandMap + RL + geom_path(data=d_mrc_bff_fort, aes(long, lat, group=group), color="red") + scale_x_continuous(limits = c(-63.280, -63.21), expand = c(0, 0)) + scale_y_continuous(limits = c(17.605, 17.66), expand = c(0, 0))