28

私は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ヘルプから: "ズーム:マップズーム、 0(全世界)から21 (建物)までの整数、デフォルト値10(都市)。openstreetmapsはズームを18に制限し、stamenマップの制限はマップタイプによって異なります。 「auto」は、バウンディングボックス仕様のズームを自動的に決定し、中央/ズーム仕様ではデフォルトで10になります。」

ズームを1に変更しても、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 
4

4 に答える 4

16

編集: ggplot2 v 0.9.3 に更新

私は最近似たようなことを試みましたが、ほとんど成功しませんでした。mapただし、パッケージから世界地図を中央に配置する方法はいくつかあります。こちらこちら、およびこちらを参照してください。後者のコードを使用して、世界地図の中心を経度 160 度に設定し、ggplot2 を使用してプロットされgeocode()た世界地図に CRAN ミラーの場所 (ggmap パッケージの関数を使用して取得した座標) をプロットし、ニュージーランドを ( を使用して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")

ここに画像の説明を入力

于 2012-06-26T10:53:01.947 に答える
9

私は最近同じエラーを受け取り、それは $\pm$ 80° 以外の緯度を好まない ggmap に要約されました。

ただし、(OSM を使用して) ダウンロードするにはサイズが大きすぎるため、イメージを個別にダウンロードする必要がありました。これはあなたの問題ではありませんが、将来の読者のために記録します。

これが私がそれを解決した方法です:

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

結果:
ggplot 世界地図

編集:Googleマップで少し遊んでみましたが、緯度が正しくありませんでした. :-(

于 2012-11-04T20:20:58.583 に答える