ai didi

r - 有没有办法向ggmap添加比例尺(用于线性距离)?

转载 作者:行者123 更新时间:2023-12-03 14:04:49 24 4
gpt4 key购买 nike

并不是说这对我的问题很重要,但这是我的情节示例,我想在上面添加一个比例尺。

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

NC map

最佳答案

要实现这一点,您需要做一些事情。

首先是将您的数据放入 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"))

现在我们可以使用 gg_map 包获取该区域的 map :
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"

我们需要该图像的范围:
bb <- attr(map.base,"bb")

现在我们开始计算规模。首先,我们需要一个函数给我们两点之间的距离,基于纬度/经度。为此,我们使用 Floris 在 Calculate distance in (x, y) between two GPS-Points 描述的 Haversine 公式:
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
}

下一步是计算出定义比例尺的点。对于这个例子,我在图的左下角放置了一些东西,使用我们已经找到的边界框:
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))

最后,我们可以绘制带有比例尺的 map 。
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))

然后我们保存...
# 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"))

这给了你这样的东西:

Map with scale bar

好消息是所有绘图都使用 ggplot2() ,因此您可以使用 http://ggplot2.org 的文档来使其看起来符合您的需要。

关于r - 有没有办法向ggmap添加比例尺(用于线性距离)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18136468/

24 4 0
文章推荐: intellij-idea - 快速修复所有意图错误
文章推荐: rethinkdb - 如何在RethinkDB中创建唯一项
文章推荐: spring-mvc - 用 RequestMappingHandlerAdapter 问题替换 AnnotationMethodHandlerAdapter
文章推荐: spring-boot - PUT 方法中缺少 Spring Boot MultipartResolver
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
全站热门文章
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com