Symfoware

Symfowareについての考察blog

R言語 ggmapでGoogleMapに座標を上書きし、画像として保存する

R言語でGoogleMapの画像を取得し、任意の座標にマーカーをつけてみます。


ggmapのインストール



参考にさせていただいたサイト
RgoogleMapsを使った放射線地図

最初、RgoogleMapsを使おうと思ったのですが、最後に

RgoogleMapsより新しいものにggmapパッケージがあります。

とのことなので、ggmapを使うことにしました。

使い方はこちらを参考にさせて頂いています。
地図を描きたい俺はgoogleVisパッケージかggmapパッケージかどちらを使おうか迷うが、静的な地図を描きたい場合はggmapで良いみたい


Rコンソールを起動して、ggmapのインストールを行いました。
適当にCRANミラーを指定し、update.packages()を実行。
ここで、最新版のインストール確認が出たら、全て「y」でインストールしました。


# R

> options(repos="http://cran.ism.ac.jp")
> update.packages()
> install.packages("ggmap")







単純に地図を取得



日本の中心辺り
東経(East longitude:lon) 139度
北緯(North latitude:lat) 35度
付近の地図を取得し、image.pngという画像で保存してみます。


  1. library(ggmap)
  2. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  3. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=4)
  4. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  5. # image.pngとして保存
  6. ggmap(map)
  7. graphics.off()




実行すると、ディレクトリに「ggmapTemp.png」という中間ファイルと共に
「image.png」が出力されました。

576_01.png




get_googlemapのオプション



pdfですが、このマニュアルを見ながら使い方を調べてみます。
ggmap.pdf


get_googlemapの引数の抜粋です。

引数内容
center中心の座標
zoom倍率を3(大陸レベル)から21(建物レベル)までの範囲で指定。デフォルトは10(市町村レベル)
size画像サイズ
scale1,2,4から指定。size(640,640)でscale=2の指定なら、1280x1280の画像を取得
formatpngかjpegを選択
maptype地図のタイプを指定( 'terrain', 'satellite', 'roadmap', and 'hybrid')
language言語を指定('ja-JP'や'ja'を指定して見たのですが変化が見られず...)
markersGoogleMapデフォルトのマーカーを設定
path指定した座標をつなげた線を表示



ちょっと地図を拡大。
3つマーカーを置いて、つないでみます。


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(lon <- c(139, 139, 140), lat <- c(35, 37, 35))
  4. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  5. map <- get_googlemap(
  6.     center=c(139,35), scale=2, size=c(500, 500), zoom=6, markers=p, path=p)
  7. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  8. # image.pngとして保存
  9. ggmap(map)
  10. graphics.off()



576_02.png





Rでポイントをプロット



R側でポイントをプロットしてみます。

描画には、「ggplot2」というライブラリを使用しており、
geom_pointで配置する点をしています。

ggplot2
geom_point


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(lon <- c(139, 139, 140), lat <- c(35, 37, 35))
  4. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  5. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=6)
  6. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  7. # ポイントを描画
  8. ggmap(map) + geom_point(aes(x=lon, y=lat), data=p, size=6, colour='red')
  9. graphics.off()




できました。

576_03.png




プロットする形状の変更



プロットの形状はこちらを参考にしました。
ggplot2 Quick Reference: shape

適当に形状を変更してみます。


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(
  4.     lon <- c(139, 139, 140),
  5.     lat <- c(35, 37, 35),
  6.     s <- c(21, 22, 23)
  7. )
  8. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  9. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=6)
  10. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  11. # ポイントを描画
  12. ggmap(map) + geom_point(aes(x=lon, y=lat), data=p, size=6, shape=p$s, colour='black', fill='red')
  13. graphics.off()



576_04.png




mappingを指定してプロットする場合。


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(
  4.     lon <- c(139, 139, 140),
  5.     lat <- c(35, 37, 35),
  6.     s <- c('a', 'd', 'f')
  7. )
  8. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  9. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=6)
  10. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  11. # ポイントを描画
  12. ggmap(map) + geom_point(data=p, mapping=aes(x=lon, y=lat, shape=s), size=6, colour='red', fill='red')
  13. graphics.off()



mappingでshapeを指定する場合は、記号ではなく分類になるようです。

576_05.png



最初、マーカーの番号を渡すんだと思い、数値を指定していたら


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(
  4.     lon <- c(139, 139, 140),
  5.     lat <- c(35, 37, 35),
  6.     s <- c(1, 2, 3)
  7. )
  8. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  9. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=6)
  10. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  11. # ポイントを描画
  12. ggmap(map) + geom_point(data=p, mapping=aes(x=lon, y=lat, shape=s), size=6, colour='red', fill='red')
  13. graphics.off()



エラーになりました。


エラー: A continuous variable can not be mapped to shape
実行が停止されました







プロットの色指定



各プロット毎に色を変更したい場合は、mappingのcolourを指定します。


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(
  4.     lon <- c(139, 139, 140),
  5.     lat <- c(35, 37, 35),
  6.     cs <- c('red', 'blue', 'green')
  7. )
  8. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  9. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=6)
  10. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  11. # ポイントを描画
  12. ggmap(map) + geom_point(data=p, mapping=aes(x=lon, y=lat, colour=cs), size=6, fill='red')
  13. graphics.off()



576_06.png


形状と同時に指定した場合


  1. library(ggmap)
  2. # マーカーを準備
  3. p = data.frame(
  4.     lon <- c(139, 139, 140),
  5.     lat <- c(35, 37, 35),
  6.     s <- c('a', 'd', 'f'),
  7.     cs <- c('red', 'blue', 'green')
  8. )
  9. # 東経139、北緯35(日本周辺)を中心に、地図を取得
  10. map <- get_googlemap(center=c(139,35), scale=2, size=c(500, 500), zoom=6)
  11. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  12. # ポイントを描画
  13. ggmap(map) + geom_point(data=p, mapping=aes(x=lon, y=lat, shape=s, colour=cs), size=6, fill='red')
  14. graphics.off()



576_07.png




geocode



地名から座標を取得するにはgeocodeを使用すれば良さそうです。
中心座標を札幌にしてみます。


  1. library(ggmap)
  2. # 札幌(sapporo)の座標を取得
  3. sapporo <- geocode('sapporo')
  4. print(sapporo)
  5. # 札幌を中心に、地図を取得
  6. map <- get_googlemap(center=c(sapporo$lon, sapporo$lat), scale=2, size=c(500, 500), zoom=6)
  7. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  8. ggmap(map)
  9. graphics.off()



576_08.png


こちらで取得した座標をマークしてみます。
Pythonで郵便番号から緯度と経度を取得する(HeartRails Geo API使用)


  1. library(ggmap)
  2. # マーカー準備
  3. p = data.frame(
  4.     lon <- c(141.352625, 141.351328, 141.349677, 141.348077),
  5.     lat <- c(43.073528, 43.073307, 43.073127, 43.07288)
  6. )
  7. # 札幌(sapporo)の座標を取得
  8. sapporo <- geocode('sapporo')
  9. print(sapporo)
  10. # 札幌を中心に、地図を取得
  11. map <- get_googlemap(center=c(sapporo$lon, sapporo$lat), scale=2, size=c(500, 500), zoom=13, markers=p)
  12. png("image.png", width = 500, height = 500, pointsize = 12, bg = "white")
  13. ggmap(map)
  14. graphics.off()



576_09.png



R言語 掲載記事のまとめ
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/03/03(火) 23:33:45|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python パスワード付きzipファイルの作成、解凍(pyminizip) | ホーム | Pythonで郵便番号から緯度と経度を取得する(HeartRails Geo API使用)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1666-f0027741
この記事にトラックバックする(FC2ブログユーザー)