Posted at

RMarkdownでLeafletを使った地図描画と配布

More than 1 year has passed since last update.

R言語のR MarkdownでLeafletを使った地図描画をして、出力されたHtmlファイルを人に配布したい時、というとんでもなくニッチな時に役立つTipsです。


地図の描画ができない時の対処法

サクッと行きましょう。

Leafletは地図の描画が簡単にできるライブラリです。詳しい使い方は下部の参考リンクの解説がとてもわかりやすいです。

以下のようにシンプルに書くと、R Studio上で実行した場合は地図が描画されますが、出力されたhtmlファイルをブラウザで開くと地図が描画されないという現象がおきます。


シンプルな実装

library(magrittr)

library(leaflet)

# data.leaflet がデータの入ったデータフレームとします
# 列としてlongitude, latitude, name, radius があるというようなイメージでご覧ください

# width, heightで出力される地図部分の大きさを調整できます
m <- leaflet(data.leaflet, width = 900, height = 700)

m %>%
addTiles() %>%
addMarkers(lng=~longitude, lat=~latitude, popup=~name, group = "マーカー") %>%
addCircleMarkers(lng=~longitude,lat=~latitude,radius=~radius, color = "#0f3") %>%
addPolylines(lng=~longitude,lat=~latitude,color="#03f",weight="5") %>%
addLayersControl(overlayGroups=c("マーカー")) %>%
setView(lng=139.7,lat=35.7,zoom=11)


こんな感じに地図のみ表示されない。

ちなみに、addMarkersがマーカーの描画、addCircleMarkersが円の描画、addPolylinesが点を結ぶ線の描画、addLayersControlがレイヤの設定です。上のようにかくとマーカーの表示非表示が切り替えられる状態になります。

とりあえずこれだけあればそれっぽい地図描画ができて素晴らしいです。


回避方法

本題です。

結論としてaddTitles()の引数に以下を設定します。


url設定

m %>% 

addTiles(urlTemplate = "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png") %>%
(略)


原因

もともとLeafletではOpenStreetMapを利用しており、そこにアクセスしているわけですが、ライブラリ内でアクセス先として//{s}.tile.openstreetmap.org/{z}/{x}/{y}.pngという指定がなされています。

httpの部分を省略しているのですが、これはhttp/https両方に対応できるためであり、ミスではないです。(最近ではGoogleでは非推奨ということになっているようではある。)

このため、htmlをローカルで開いた場合は、file://{s}.tile.openstreetmap.ort/... にアクセスしに行こうとし、表示されないのが原因です。


おまけTips

R Markdownを実行するときにパラメータを渡して実行することができます。

R Markdownの設定に以下のようにパラメータを定義することができます。

Knit実行する際に、Knit with Parametersを指定すると、入力フォームが現れ、設定することができます。

レポート作りの際にとても便利ですね。




参考リンク

Leaflet for R

leafletではじめるRによる地図プロット

参考issues