政府提供オープンデータAPIポータルについて書いたところ、6つ挙げた課題の内、API一覧と元データの明示の2つが解消。 エラーとなるAPIはそのままでしたが、明示されたCSVをダウンロードし、神戸市の三宮歩行者数データをグラフでビジュアライズするアプリを作りました。

三宮歩行者数推移(神戸市オープンデータ使用)」(データ5M、表示まで時間がかかります)
4月の緊急事態宣言後、じわじわと歩行者数が増え、10月以降はほぼ元通り、年末年始でも大きな減少は見られません。


9箇所の設置場所、それぞれを見ることができます。1時間ごとのデータは重いので、前処理して軽くする。特定時間だけで見るなど、プログラムや、ソフトウェアでうまく解析するといいでしょう。 オープンソース on GitHub です。ご自由に活用ください。

登録とAPIキーが必要なオープンデータAPIポータルに代わって、全件CSVで自由にアクセスできるように環境を作ってみます。 3時間置きに全データを取得し、UTF-8のCSVデータとして、GitHubにアップし、公開するようにしました。

オープンデータ一覧」(CSV on GitHub)
オープンデータとして公開されているCSVファイル、文字コード(charset)が、SJISかUTF-8か2種類あるところが注意です。


SJISのCSVを読み込んでしまうと、このように文字化けします。BOM付きのUTF-8のCSVがスマホのブラウザで直接読んでも、Excelで開いても文字化けせずオススメなのですが、なかなか現状の習慣を変えるのは大変そうです。 人が変わらないなら、ソフトウェアで変えましょう。コンパクトな文字コード変換、SJIS.js を作りました。

import { SJIS } from "https://code4sabae.github.io/js/SJIS.js"; const bin = // some Uint8Array const s = SJIS.encode(bin); // or SJIS.encodeAuto(bin) console.log(s);

これだけでOK!
TextEncoderが使えないサーバーでもブラウザ上でも使用可能です。75KBとそこそこコンパクト。

import { CSV } from "https://code4sabae.github.io/js/CSV.js"; const s = await CSV.fetch(url);

ついでに、CSVのfetchで、SJISかどうかを自動判定するようにしました。
もう、CSVなら何でもokです!


あいづ呑んべぇ文化支援プロジェクト - api.opendata.go.jp
前回作成のアプリと見た目は変わりませんが、データソースが違います。


あいづ呑んべぇ文化支援プロジェクト - データセット - DATA for CITIZEN
今回はデータ提供元である、会津若松市のオープンデータのホスティング先、Data for CITIZENから直接取得する形としています。

すべてデータ出典元から取れればいいかというと、実は更に課題が2つあります。

1. CORS対応していないことがある。
オリジン間リソース共有 (CORS)はブラウザからドメインを超えてデータを取得できる仕組みです。 ただ無尽蔵に取得できるようにすると、意図しないアクセスが発生してしまうので、データ所有者による他のドメインから取得できるような設定が必要です。具体的には、こちらのような感じです。

HTTP/1.1 200 OK Date: Mon, 01 Dec 2008 00:23:53 GMT Access-Control-Allow-Origin: *

2. SSLが古く取得できないことがある。
セキュアな通信を実現するいわゆるSSLは、現在TLS1.3です。ただ、セキュリティに課題がある古いTLS1.2を使っている自治体がまだ存在します。 TLS1.2で提供されるデータを取得しようとするとエラーが発生して取得できないことがあります。セキュリティとして意味をなさないので、早急にデータ提供元の対応が必要ですが、しょうがないのでセキュリティを落として取得する形にして対応しています。

もし、上記2点がクリアになれば、現存のオープンデータAPIポータルも、今回の3時間置きアップシステムも必要なく、単純にCSV一覧のみがあればいいだけとなります。
システムは必要なく、普通にwebサーバーにCSVファイルを置くだけでいいので、低コスト!

結論、CSVオープンデータではじめて、5つ星オープンデータにしましょう!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS