ツイートからサクラの満開地図を作る

Rを使って簡易的にサクラの満開状況をマッピングします。
完成品はこんな感じ（4月2日時点）。

![sakura.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/89396fa9-d7d3-eaf4-194a-2482ab6f0115.png)


# 必要パッケージ
以下のパッケージを使用します。

```R
library(tidyverse) # データ操作用
library(rtweet) # ツイート収集用
library(sf) # ベクタの操作用
library(emoGG) # 絵文字の描画用
```

インストールされていない場合はインストールしてください。
なおemoGGは公式リポジトリにはないので、`remotes::install_github`を使ってGit Hubからインストールする必要があります[ dill / emoGG ](https://github.com/dill/emoGG)。

```R
remotes::install_github("dill/emoGG")
```
※公式なパッケージではないので入れるかどうかは自己判断で


# ツイートの収集とデータの加工
## ツイートの収集
ツイートの収集には`rtweet::search_tweets`を使います。
今回は過去一週間以内のツイートを最大18000件取得します。
クエリは「(桜 OR サクラ OR さくら) AND 満開」としました。「満開が終わった」も引っかかってしまいますがご愛嬌ということで。

```R
Sys.time() %>% subtract( 3600 * 24 * 7 ) -> since_t # 起点の日時を取得
since_t %>% format( "%Y-%m-%d_%H:%M:%S_JST" ) -> since # フォーマットを変換

rt <- search_tweets(q = "(桜 OR サクラ OR さくら) AND 満開", n = 18000, since = since, include_rts = FALSE) # リツイートを含めず、ツイートを取得
```

`search_tweets`は開発者登録なしで使用できますが、初回使用時にはブラウザでユーザ認証が求められます。

参考：

- [Package ‘rtweet’](https://cran.r-project.org/web/packages/rtweet/rtweet.pdf)
- [rtweetパッケージでTwitter APIからデータを取るのが超お手軽になってた](https://notchained.hatenablog.com/entry/2018/02/09/143304)

## データの加工
収集したツイートのデータはtibbleに格納されます。そこから位置情報が付属しているツイートのみを抽出します。
今回は「bbox_coords」から座標を得るので、対応している「country_code」を判定基準にしました。

```R
rt %>% filter(country_code == "JP") -> rt.with.coords # country_codeが"JP"の行を選択
```

「bbox_coords」にはグリッドの頂点の座標がリストとして格納されています。
一つのツイートに対して地図上の一点をを対応させたいので、グリッドの中心座標を算出します。

```R
rt.with.coords %>% select(bbox_coords) %>% # bbox_coordsを抜き出し
    map(unlist) %>% unlist %>% matrix(ncol = 8, byrow = TRUE) %>% # リストを解除して行列にまとめなおす
    set_colnames(c("lon1", "lon2", "lon3", "lon4","lat1", "lat2", "lat3", "lat4")) %>%  # 列名を変更する
    as_tibble %>% mutate(lon = (lon1 + lon2) / 2, lat = (lat1 + lat3) / 2) -> coords # グリッドの中心を算出し、新しい列に格納する
```

tidyverseをうまく使えばもっときれいに書けるかも？

これでデータの準備は完了です。


# 地図の準備
今回は[都道府県別日本地図（GeoJSON、TopoJSON形式）](https://github.com/dataofjapan/land)をベースマップとして使用します。国土地理院が公開している地球地図日本を扱いやすいように加工したものだそうです。

リンク先からZIPをダウンロードして解凍し、その中の「japan.geojson」を作業ディレクトリに移動します。
その後`sf::st_read`で読み込みます。

```R
map <- st_read("japan.geojson")
```


# ggplot2で描画
以上のデータをggplot2で描画します。
サクラの絵文字コードは以下のコマンドで検索して確認しました。

```R
> emoji_search("flower")
              emoji             code keyword
1928  wilted_flower            1f940  flower
1940 cherry_blossom            1f338  flower # <- これを使う
2748        rosette            1f3f5  flower
4130              o             2b55  circle
4131              o             2b55   round
5234        eritrea 1f1ea\\U0001f1f7      er

```

以下が描画コードです。

```R
g <- ggplot() + geom_sf(data = map) + # 地図の描画
    geom_emoji(data = coords, aes(x = lon, y = lat), emoji="1f338", size = 0.02) + # 絵文字の描画
    xlab("経度") + ylab("緯度") + # ラベルの変更
    annotate(geom = "text", label = "背景地図：国土地理院・地球地図日本(http://www.gsi.go.jp/kankyochiri/gm_jpn.html)", x = 147, y= 20, size = 2) # 出典を追加

ggsave(g, filename = "sakura.png") # sakura.pngに保存
```
これで完了です。

# 完成図
一番最初にも上げたものが完成図になります。
かなり簡易的なやり方でしたが日本気象協会やウェザーニューズのものと比較してもいい感じです。

|完成図|日本気象協会|ウェザーニューズ|
|---|---|---|
|![sakura.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/20c325ae-9074-dfcb-216c-4788bc34cc60.png)|![nks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/88b9428c-40de-72d8-34ae-2a0e8319973e.png)|![wns.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535720/c2046d73-0e36-f6f6-fce8-79ba1c404fd3.png)|
||https://tenki.jp/sakura/|https://weathernews.jp/s/sakura/|

検索する対象や検索の方法、描画する絵文字を変えればいろいろな地図が作れると思います。ぜひ試してみてください。

来年こそは楽しくお花見しましょう！