Istnieje kilka rzeczy, które trzeba zrobić, aby tak się stało.
Pierwszy jest umieścić swoje dane w 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"))
Teraz możemy dostać mapę tego regionu, korzystając z pakietu gg_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"
Będziemy potrzebować stopnie tego image:
bb <- attr(map.base,"bb")
Teraz zaczynamy obliczać skalę. Po pierwsze, potrzebujemy funkcji, która daje nam odległość między dwoma punktami, na podstawie lat/długo. W tym celu używamy formuły Haversine, opisanej przez Floris w 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
}
Następnym krokiem jest wypracowanie punktów, które definiują nasz pasek skali. W tym przykładzie, umieścić coś w lewym dolnym rogu wykresu, za pomocą obwiedni, że mamy już zorientowali się:
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))
Wreszcie możemy narysować mapę z skali.
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))
Potem go uratować ...
# 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"))
co daje mniej więcej tak:
Dobrą rzeczą jest to, że cały spisek używa ggplot2()
, więc możesz skorzystać z dokumentacji pod numerem http://ggplot2.org, aby wyglądała tak, jak potrzebujesz.
Witam, spójrz na '? OSM_scale_lookup' i powiązane linki FAQ –