Es gibt ein paar Dinge, die Sie tun müssen, damit dies geschieht.
Zunächst ist Ihre Daten in eine data.frame()
setzen: Jetzt
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"))
wir die Karte für diese Region bekommen kann mit dem gg_map
Paket:
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"
Wir werden die Ausmaße, dass brauchen bild:
bb <- attr(map.base,"bb")
Jetzt fangen wir an, die Skala herauszufinden. Zuerst brauchen wir eine Funktion, die uns den Abstand zwischen zwei Punkten angibt, basierend auf lat/long. Dafür verwenden wir die Haversine Formel, beschrieben von Floris bei 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
}
Der nächste Schritt, um die Punkte zu erarbeiten, die unsere Maßstabsleiste definieren. In diesem Beispiel habe ich etwas in der linken unteren Ecke des Grundstücks, mit dem Begrenzungsrahmen, die wir haben bereits herausgefunden:
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))
Schließlich können wir die Karte mit dem Maßstab ziehen.
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))
Dann wir es retten ...
# 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"))
Was Sie so etwas wie dieses gibt:
Das Schöne daran ist, dass alle der Plotten verwendet ggplot2()
, so Sie können die Dokumentation unter http://ggplot2.org verwenden, um dieses Aussehen wie Sie benötigen.
Hallo, schauen Sie sich 'OSM_scale_lookup' und die zugehörigen FAQ-Links –