内閣官房のHPで公開されている, 主要な駅や観光地などにおける人の流れ(前日比、感染拡大前との差など)のデータをショートカットアプリで表示します.
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
レビュー時のiOSバージョン : iOS14.7.1
スポンサーリンク
ダウンロードと使い方
まず都道府県を選択します(複数選択可).
選択した都道府県に応じてデータエリアを選択(複数ある場合は複数選択可)します.
選択したデータエリアごとに「結果を表示」で人の流れの推移の結果を表示します.
データの提供元が3社あり, 計測データの種類が異なるためデータエリア次第で得られる結果が変わります(「前日との比較」のみ共通).
JSONデータの扱いが厄介
データ元はこちらになります.
データ自体はJSONになっているため一つ一つは難しくありません.
なお今回扱うのは以下の4項目です(括弧内は提供元).
- 全国主要駅・繁華街における人の流れの推移 15時台((株)Agoop)
- 全国主要駅・繁華街における人の流れの推移 21時台((株)Agoop)
- 全国の人口変動分析 15時台(NTTドコモ モバイル空間統計)
- 全国主要観光地における人の流れの推移 15時台(KDDI株式会社)
前者2つについては翌日12時頃に更新されると明記されていますが後者2つについては不明です.
それより問題なのは上でも書いた通り各データの提供元が異なり, キーによっては一部が対応していいことです.
特に厄介なのが都道府県で, あるデータはdataNameとareaという別のキーで分けてあるものもあればdataNameで共通(なぜかbrタグがある)だったり, そもそもなかったり…とめちゃくちゃです.
使われているキーが(存在するならば)同じであるのがせめてもの救いですね.
せっかく同じ「人の流れ」というデータなんですから, まるごと見たいものです.
そのために一度取り込んだ各JSONデータを作り変える必要があります.
例えば(株)Agoopが提供する主要な駅・繁華街における人の流れの推移データの一部を取り出すと下のようになっています.
{
"date": "2021年08月24日",
"dataType": "11",
"dataName": "すすきの駅",
"comparisonPreDay": "-4.8",
"comparisonPreDeclare": "0.8",
"comparisonPreSpread": "-28.0"
}
dateやdataNameは言わずもがな, dataTypeは不明ですがそれ以外の3つともうひとつを含めた4つは以下になります.
- comparisonPreDay:前日との比較
- comparisonPreDeclare:緊急事態宣言以前との比較(?)
- comparisonPreSpread:感染拡大以前との比較
- comparisonPreYear:前年同月比
「前日との比較」は4項目すべてで共通ですが, 2,3つ目の値は「全国主要観光地における人の流れの推移」には対応しておらず, 逆に4つ目の値は「全国主要観光地における人の流れの推移」のみ与えられています.
そのため選択した地域によって不要な項目を表示しない工夫が必要です.
これがなかったらもっと楽なんですけどね.
レシピ
今回はまず, 47都道府県を順番に表示して選択できるよう, 「テキスト」アクションに正しい順で都道府県を書き込み, これを「テキストを分割」を使って改行で分割しておきます.
本来ならこの後で取り込むJSONにあるものを使うところですが, ショートカットアプリの仕様(バグ)で, 辞書のすべてのキーを拾って「リストから選択」を行うと順番がメチャクチャになってしまいます.
このように「テキスト」に書き並べて改行で分割したものを使うと書いた順に並んでくれます.
また2つめのテキストは各都道府県に対応する, 今回扱うJSONデータに含まれる駅名や地名に対応するJSONを直書きしたものです.
都道府県を選択させた後, これを使って各都道府県内の駅や観光地として選択させることになるのですが, 状況によって計測地を変更することがまれにあるようなので, その場合はここを修正する必要があります.
続いて, 最初に与えた分割済みの都道府県の列を使って「リストから選択」で複数選択させます.
これをもとに, 各都道府県に属する駅や観光地を最初の2つ目に作った辞書から取得し変数(今回はlist)に追加していきます.
中身によっては<br>という余計な文字列が入っているため, これを取り除きます.
こうして得た変数listは, 2重の「リストから選択」で得たdataNameの列になっています.
つまりこれを使って必要なdataNameを含むJSONの行を取り出すことが可能となります.
データを選り分ける前に, 元の4つのJSONにも<br>という余計な文字列があるため, これを取り除いた「辞書」を改めて作ります.
まず何も追加していない「辞書」を追加し, 好きな変数でおきます(今回はdatadic).
ショートカットにおける「辞書」は, 既にキーが存在する場合はそのキーで「辞書の値を設定」を行うと値が上書きされ, 存在しないキーの場合は事実上そのキーと値の組が追加されます.
これを利用して空の辞書から, <br>のない辞書として新しく作る…というわけです.
まず元の辞書のすべてのキーに対して「各項目を繰り返す」を追加し, 各項目の値, つまり4つのJSONの各URLを取得して「Webの内容を取得」でJSONをテキストとして取り込み, <br>を取り除いてから先程設定した新しい辞書datadicに上書きしていきます.
こうして得られた新しい辞書を元のJSONの代わりに使います.
またJSONの更新日も今のうちに取得したいです
4つのJSONのどれでもいいので「Webの内容を取得」で取り出し, 改行で分割して最初の項を取り出し, 辞書化した上で"date"の値を取り出します.
これで最後の処理を行うための準備が終わりました.
既に選択した駅や観光地の配列変数(list)に対して「各項目を繰り返す」を実行します.
その直後に今度はdatadicのキーに対して「各項目を繰り返す」を実行します.
ここから"list"の各項目の文字列を含むJSONを"datadic"から探し出すわけですが, その前にまず駅や観光地名である"list"の「各項目を繰り返す」の「繰返し項目」によって与え, 一緒に先程取得した日付も加え, 一旦変数に置きます(value).
ここから, 4つあるJSONに対して"list"の各項目を含む1行(ショートカットの仕様でその1行がちょうど対応するJSON1つ分になってます)を「一致するテキスト」で見つけ出します.
今回も正規表現が必須で, マッチさせるために
.*繰り返し項目.*
とします, つまり「"list"の各駅・観光地名を含む1行」を対象とします.
そしてその結果から辞書を取得します.
そのまま「テキスト」アクションで体裁を…といきたいのですが, はじめに指摘した通り, JSONの種類によってキーの有無が異なる厄介さがここで出てきます.
対象のJSONによってはそのキー自体が存在しないため, キーの有無のある"comparisonPreSpred"を利用してこの値の有無で結果に表示させるかどうかを判定します.
値が存在するなら「テキスト」アクションで体裁を整え, 変数(value)に追加します.
同じことを他の3つのJSONに対しても行います(画像の都合で2つ目は省略).
"datadic"のキーによる「各項目を繰り返す」から抜けます.
この時点で変数valueは各listごとの結果となっているため, これを表示します.
その後変数valueは「ショートカットの入力」を使ってクリアしておきます.
変数datadicやdateは上書きであること, またlistは「追加」処理をしていますが最後の繰り返しの外の話なのでこれらはクリアする必要はありません.
〆
同じ人流データでもデータの種類が異なるせいで, 処理が面倒になってしまいました.
本当は各都道府県ごとのデータエリア選択はデフォルトで全選択にしようと思ったんですが, 東京都のデータエリア数が多すぎなので諦めました.