有没有办法给ggmap添加比例尺(用于线性距离)? [英] Is there a way to add a scale bar (for linear distances) to ggmap?
问题描述
不是这对我的问题至关重要,但这里是我的情节示例,我想在其中添加一个比例尺。
ggmap(get_map(location =Kinston,NC,zoom = 12,maptype ='hybrid'))+
geom_point(x = -77.61198,y = 35.227792,color =red ,size = 5)+
geom_point(x = -77.57306,y = 35.30288,color =blue,size = 3)+
geom_point(x = -77.543,y = 35.196,color =蓝色,size = 3)+
geom_text(x = -77.575,y = 35.297,label =CRONOS Data)+
geom_text(x = -77.54,y = 35.19,label =NOAA )+
geom_text(x = -77.61,y = 35.22,label =PP Site)
你需要做一些事情来做到这一点。
首先将您的数据放入 data.frame()
:
sites.data = data.frame(lon = c(-77.61198,-77.57306,-77.543),
lat = c(35.227792,35.30288, 35.196),
label = c(PP Site,NOAA,CRONOS Data),
color = c(red,blue,blue))
现在我们可以使用 gg_map
包:
require(gg_map)
map.base< - get_map(location = c(lon = mean (sites.data $ lon),
lat = mean(sites.data $ lat)),
zoom = 10)#也可以使用zoom =auto
我们需要该图片的范围:
bb < - attr(map.base,bb)
现在我们开始计算出规模。首先,我们需要一个函数根据经纬度给我们两点之间的距离。为此,我们使用Floris在
好的是所有的绘图使用
ggplot2()
,因此您可以使用 http://ggplot2.org 让你看起来如何。Not that it's critical to my question, but here is my plot example, on top of which I'd like to add a scale bar.
ggmap(get_map(location = "Kinston, NC", zoom = 12, maptype = 'hybrid')) + geom_point(x = -77.61198, y = 35.227792, colour = "red", size = 5) + geom_point(x = -77.57306, y = 35.30288, colour = "blue", size = 3) + geom_point(x = -77.543, y = 35.196, colour = "blue", size = 3) + geom_text(x = -77.575, y = 35.297, label = "CRONOS Data") + geom_text(x = -77.54, y = 35.19, label = "NOAA") + geom_text(x = -77.61, y = 35.22, label = "PP Site")
解决方案There are a few things you need to do to make this happen.
First is to put your data into a
data.frame()
:sites.data = data.frame(lon = c(-77.61198, -77.57306, -77.543), lat = c(35.227792, 35.30288, 35.196), label = c("PP Site","NOAA", "CRONOS Data"), colour = c("red","blue","blue"))
Now we can get the map for this region using the
gg_map
package:require(gg_map) map.base <- get_map(location = c(lon = mean(sites.data$lon), lat = mean(sites.data$lat)), zoom = 10) # could also use zoom = "auto"
We'll need the extents of that image:
bb <- attr(map.base,"bb")
Now we start figuring out the scale. First, we need a function give us the distance between two points, based on lat/long. For that, we use the Haversine formula, described by Floris at Calculate distance in (x, y) between two GPS-Points:
distHaversine <- function(long, lat){ long <- long*pi/180 lat <- lat*pi/180 dlong = (long[2] - long[1]) dlat = (lat[2] - lat[1]) # Haversine formula: R = 6371; a = sin(dlat/2)*sin(dlat/2) + cos(lat[1])*cos(lat[2])*sin(dlong/2)*sin(dlong/2) c = 2 * atan2( sqrt(a), sqrt(1-a) ) d = R * c return(d) # in km }
The next step is to work out the points that will define our scale bar. For this example, I put something in the lower left of the plot, using the bounding box that we've already figured out:
sbar <- data.frame(lon.start = c(bb$ll.lon + 0.1*(bb$ur.lon - bb$ll.lon)), lon.end = c(bb$ll.lon + 0.25*(bb$ur.lon - bb$ll.lon)), lat.start = c(bb$ll.lat + 0.1*(bb$ur.lat - bb$ll.lat)), lat.end = c(bb$ll.lat + 0.1*(bb$ur.lat - bb$ll.lat))) sbar$distance = distHaversine(long = c(sbar$lon.start,sbar$lon.end), lat = c(sbar$lat.start,sbar$lat.end))
Finally, we can draw the map with the scale.
ptspermm <- 2.83464567 # need this because geom_text uses mm, and themes use pts. Urgh. map.scale <- ggmap(map.base, extent = "normal", maprange = FALSE) %+% sites.data + geom_point(aes(x = lon, y = lat, colour = colour)) + geom_text(aes(x = lon, y = lat, label = label), hjust = 0, vjust = 0.5, size = 8/ptspermm) + geom_segment(data = sbar, aes(x = lon.start, xend = lon.end, y = lat.start, yend = lat.end)) + geom_text(data = sbar, aes(x = (lon.start + lon.end)/2, y = lat.start + 0.025*(bb$ur.lat - bb$ll.lat), label = paste(format(distance, digits = 4, nsmall = 2), 'km')), hjust = 0.5, vjust = 0, size = 8/ptspermm) + coord_map(projection="mercator", xlim=c(bb$ll.lon, bb$ur.lon), ylim=c(bb$ll.lat, bb$ur.lat))
Then we save it...
# Fix presentation ---- map.out <- map.scale + theme_bw(base_size = 8) + theme(legend.justification=c(1,1), legend.position = c(1,1)) ggsave(filename ="map.png", plot = map.out, dpi = 300, width = 4, height = 3, units = c("in"))
Which gives you something like this:
The nice thing is that all of the plotting uses
ggplot2()
, so you can use the documentation at http://ggplot2.org to make this look how you need.这篇关于有没有办法给ggmap添加比例尺(用于线性距离)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!