Карта мира с ggmap
Я использую ggmap и хочу иметь карту мира с центром в Австралии, на которой я могу легко наносить геокодированные точки. Ggmap выглядит намного проще в использовании по сравнению с некоторыми другими пакетами отображения. Тем не менее, когда я несу карту, используя код ниже, это ошибки.
gc <- geocode('australia')
center <- as.numeric(gc)
> map <- get_map(location = center, source="google", maptype="terrain", zoom=0)
Error: zoom must be a whole number between 1 and 21
Из справки get_map: "zoom: масштаб карты, целое число от 0 (весь мир) до 21 (здание), значение по умолчанию 10 (город). Openstreetmaps ограничивает масштаб 18, а ограничение на картах тычинок зависит от типа карты. 'auto' автоматически определяет масштаб для спецификаций ограничивающего прямоугольника и по умолчанию равен 10 со спецификациями центра / масштаба."
Изменение масштаба на один не является ошибкой для get_map, но делает для построения этой карты
map <- get_map(location = center, source="google", maptype="terrain", zoom=1)
ggmap(map)
Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In min(x) : no non-missing arguments to min; returning Inf
4: In max(x) : no non-missing arguments to max; returning -Inf
Похоже, долгота не проходит. Наконец, с увеличением 2 это работает, но не показывает карту всего мира.
Итак, мой вопрос: как я могу использовать get_map, чтобы получить карту мира?
Информация о сессии:
sessionInfo () R версия 2.15.0 (2012-03-30) Платформа: i386-pc-mingw32/i386 (32-разрядная версия)
locale:
[1] LC_COLLATE=English_United Kingdom.1252
[2] LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] mapproj_1.1-8.3 maps_2.2-6 rgdal_0.7-12 sp_0.9-99
[5] ggmap_2.1 ggplot2_0.9.1
loaded via a namespace (and not attached):
[1] colorspace_1.1-1 dichromat_1.2-4 digest_0.5.2 grid_2.15.0
[5] labeling_0.1 lattice_0.20-6 MASS_7.3-17 memoise_0.1
[9] munsell_0.3 plyr_1.7.1 png_0.1-4 proto_0.3-9.2
[13] RColorBrewer_1.0-5 reshape2_1.2.1 RgoogleMaps_1.2.0 rjson_0.2.8
[17] scales_0.2.1 stringr_0.6 tools_2.15.0
3 ответа
РЕДАКТИРОВАТЬ: Обновлено до ggplot2 v 0.9.3
Я пробовал нечто подобное в последнее время, но без особого успеха. Тем не менее, есть несколько способов центрировать карту мира из map
пакет: смотрите здесь, здесь и здесь. Используя код из последнего, вот пример, который центрирует карту мира по долготе 160, наносит на карту местоположения зеркала CRAN (координаты, полученные с использованием geocode()
функция из пакета ggmap) на карте мира, построенной с помощью ggplot2, и цвета Новой Зеландии (используя geom_polygon
). Центрирование карты по долготе 160 держит всю Африку слева от карты, а большую часть Гренландии - справа от карты.
library(maps)
library(plyr)
library(ggplot2)
library(sp)
library(ggmap)
# Get some points to plot - CRAN Mirrors
Mirrors = getCRANmirrors(all = FALSE, local.only = FALSE)
Mirrors$Place = paste(Mirrors$City, ", ", Mirrors$Country, sep = "") # Be patient
tmp = geocode(Mirrors$Place)
Mirrors = cbind(Mirrors, tmp)
###################################################################################################
# Recentre worldmap (and Mirrors coordinates) on longitude 160
### Code by Claudia Engel March 19, 2012, www.stanford.edu/~cengel/blog
### Recenter ####
center <- 160 # positive values only
# shift coordinates to recenter CRAN Mirrors
Mirrors$long.recenter <- ifelse(Mirrors$lon < center - 180 , Mirrors$lon + 360, Mirrors$lon)
# shift coordinates to recenter worldmap
worldmap <- map_data ("world")
worldmap$long.recenter <- ifelse(worldmap$long < center - 180 , worldmap$long + 360, worldmap$long)
### Function to regroup split lines and polygons
# Takes dataframe, column with long and unique group variable, returns df with added column named group.regroup
RegroupElements <- function(df, longcol, idcol){
g <- rep(1, length(df[,longcol]))
if (diff(range(df[,longcol])) > 300) { # check if longitude within group differs more than 300 deg, ie if element was split
d <- df[,longcol] > mean(range(df[,longcol])) # we use the mean to help us separate the extreme values
g[!d] <- 1 # some marker for parts that stay in place (we cheat here a little, as we do not take into account concave polygons)
g[d] <- 2 # parts that are moved
}
g <- paste(df[, idcol], g, sep=".") # attach to id to create unique group variable for the dataset
df$group.regroup <- g
df
}
### Function to close regrouped polygons
# Takes dataframe, checks if 1st and last longitude value are the same, if not, inserts first as last and reassigns order variable
ClosePolygons <- function(df, longcol, ordercol){
if (df[1,longcol] != df[nrow(df),longcol]) {
tmp <- df[1,]
df <- rbind(df,tmp)
}
o <- c(1: nrow(df)) # rassign the order variable
df[,ordercol] <- o
df
}
# now regroup
worldmap.rg <- ddply(worldmap, .(group), RegroupElements, "long.recenter", "group")
# close polys
worldmap.cp <- ddply(worldmap.rg, .(group.regroup), ClosePolygons, "long.recenter", "order") # use the new grouping var
#############################################################################
# Plot worldmap using data from worldmap.cp
windows(9.2, 4)
worldmap = ggplot(aes(x = long.recenter, y = lat), data = worldmap.cp) +
geom_polygon(aes(group = group.regroup), fill="#f9f9f9", colour = "grey65") +
scale_y_continuous(limits = c(-60, 85)) +
coord_equal() + theme_bw() +
theme(legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_blank(),
#axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.border = element_rect(colour = "black"))
# Plot the CRAN Mirrors
worldmap = worldmap + geom_point(data = Mirrors, aes(long.recenter, lat),
colour = "red", pch = 19, size = 3, alpha = .4)
# Colour New Zealand
# Take care of variable names in worldmap.cp
head(worldmap.cp)
worldmap + geom_polygon(data = subset(worldmap.cp, region == "New Zealand", select = c(long.recenter, lat, group.regroup)),
aes(x = long.recenter, y = lat, group = group.regroup), fill = "blue")
Недавно я получил ту же ошибку, и она сводилась к ggmap, который не любил широты за пределами $\pm$ 80°.
Однако мне пришлось загружать свое изображение отдельно, так как оно было слишком большим для загрузки (с OSM); это не ваша проблема, но я записываю ее для будущих читателей.
Вот как я это решил:
- отдельная загрузка проецируемого изображения Mercator через BigMap
- Широта нуждалась в некоторой осторожности: у меня были те же ошибки, которые вы показываете с пределами широты за пределами $ \ pm $ 80 °, когда я ожидал, что все должно быть хорошо до 85° OSM, но я не отследил их, так как в любом случае не нужны очень высокие широты.
- Центр 0°/0° был хорош для моей цели (я в Европе:-)), но вы, безусловно, можете обрезать изображение там, где это полезно для вас, и обернуть его самостоятельно,
cbind
, Просто убедитесь, что вы знаете долготу вашего разреза. - затем установите ограничивающую рамку вашего изображения
- и назначить соответствующие классы
Вот что я делаю:
require ("ggmap")
library ("png")
zoom <- 2
map <- readPNG (sprintf ("mapquest-world-%i.png", zoom))
map <- as.raster(apply(map, 2, rgb))
# cut map to what I really need
pxymin <- LonLat2XY (-180,73,zoom+8)$Y # zoom + 8 gives pixels in the big map
pxymax <- LonLat2XY (180,-60,zoom+8)$Y # this may or may not work with google
# zoom values
map <- map [pxymin : pxymax,]
# set bounding box
attr(map, "bb") <- data.frame (ll.lat = XY2LonLat (0, pxymax + 1, zoom+8)$lat,
ll.lon = -180,
ur.lat = round (XY2LonLat (0, pxymin, zoom+8)$lat),
ur.lon = 180)
class(map) <- c("ggmap", "raster")
ggmap (map) +
geom_point (data = data.frame (lat = runif (10, min = -60 , max = 73),
lon = runif (10, min = -180, max = 180)))
результат:
Изменить: я немного поиграл с вашей картой Google, но я не получил правильные широты.:-(
Мне удалось построить карту мира на основе Google Maps. Это, к сожалению, немного искажено, так как я считаю, что ggmap/Google Maps накладывает ограничения (длина данных = 409600 пикселей, с размером, кратным 792). Тем не менее, следующая комбинация параметров размера, масштаба и масштабирования предоставляет карту мира Google с ggmap.
Естественно, вы можете изменить lon
изменить точку продольного фокуса на Австралию, как вы хотите.
library(tidyverse)
your_gmaps_API_key <- ""
get_googlemap(center = c(lon = 0, lat = 0)
, zoom = 1
, maptype="roadmap"
, size = c(512,396)
, scale = 2
, color = "bw"
, key = your_gmaps_API_key) %>% ggmap(.)
Примечание: точки на карте взяты из моего собственного набора данных и не получены с помощью приведенного выше кода, но карта мира имеет здесь ключевое значение.
Проверьте встроенную карту ggplot. Это может создавать карты, не требуя сторонний набор плиток. Он отлично подходит для простых карт и может использовать всю красоту ggplot.