2016-02-13

e-Stat 統計表情報ウェブページの自動作成 (FME Server)

政府統計の総合窓口 (e-Stat) では統計表情報や統計データなどを取得するための API が公開されており、これを利用することによって、政府統計を活用したアプリケーションを開発することができます。
e-Stat API は、HTTP プロトコル (GET メソッド) によって XML または JSON 形式のテキストデータを配信するものなので、FME の HTTPCaller トランスフォーマーによってそれを取得し、目的に応じて必要な内容を抽出したり加工したりすることができます。

ここでは、平成22年国勢調査結果として公開されている統計表の情報を e-Stat API によって取得し、HTML テーブル (table要素) に変換するワークスペース例を掲げます。このワークスペースを FME Server にアップロードし、それを実行するためのスクリプト (JavaScript) を記述した html ファイルをウェブ上で公開すれば、ユーザーがそのページにアクセスしたときにワークスペースを自動的に実行し、その結果をユーザーのウェブブラウザ画面上に表示させることができます。

注: e-Stat API を利用したアプリケーションを開発するには、利用登録をするとともに、アプリケーションIDを取得する必要があります。e-Stat API の仕様や利用登録については次のサイトを参照してください。
政府統計の総合窓口(e-Stat) - API機能

FME 2016.0.1.0 build 16174

FME ワークスペース例













Creator: 処理の開始
HTTPCaller: e-Stat API によって平成22年国勢調査の統計表情報 (XML) を取得

1. 統計表リスト HTML テーブル作成 (上のブックマーク)
XMLFragmenter: XML の TABLE_INF 要素 (統計表の情報) ごとに次の属性を抽出
・STATISTICS_NAME: 統計表の提供統計名及び提供分類名 (以下「分類名」)
・TABLE_INF.id: 統計表ID (TABLE_INF要素のid属性)
・TITLE.no: 表番号 (TITLE要素のno属性)
・TITLE: 統計表の表題 (以下「統計表名」)
TextEncoder x 2: 分類名と統計表名に含まれる <, >, " などをHTMLエンティティに変換
StringConcatenator: 統計表ごとにHTML形式のテーブル行要素 tr を作成
AttributeKeeper: 必要な属性のみを残す (必須ではないが分かり易くするため)
Aggregator: STATISTICS_NAME (分類名) ごとに集約して行要素 tr をリスト _list{}.tr に格納
XMLTemplater: 分類名表示用の h3 要素、その分類に属する tr 要素を含む table 要素を作成

2. エラーメッセージ作成 (下のブックマーク)
XMLFragmenter: XML の RESULT 要素から処理結果情報を抽出
Tester: 処理結果が 0 (正常終了、かつ、該当データあり) 以外のものを選択
StringConcatenator: メッセージ表示用のHTML要素を作成

注: HTTP リクエストに失敗したときに HTTPCaller <Rejected> ポートから出力されるフィーチャー (エラーに関する情報を属性として持つ) を使ったエラーメッセージも作成するべきですが、煩雑さを避けて上記例では省きました。

Text File ライター: 結果をテキスト形式で出力
デスクトップ環境で実行したときはファイルに出力、FME Server の Data Streaming Service で実行したときはストリーミングされます。


結果: 平成22年国勢調査 統計表リスト (12分類356表) のウェブブラウザによる表示
FME Server は Tomcat をバンドルしており、それをウェブサーバーとして使うことができますが、他のサーバーで稼働するアプリケーションから FME Server に接続して利用することもできます (FME Server 側で、他のドメインからのアクセスを許可するための設定が必要)。この例では Apache 2.4 を使いました。ただし、ローカルネットワーク内でのテスト結果であり、インターネットウェブには公開していません。
























HTTPCaller では、e-Stat API の仕様に基づいてリクエスト先の URL やパラメーターを設定します。特定の年の国勢調査の統計表情報を取得するには、次のパラメーターが必須です。
・appId: アプリケーションID。e-Stat API の利用登録をしてから取得
・statsCode: 政府統計コード。国勢調査は 00200521
・surveyYears: 調査年月。平成22年国勢調査ならば 2010

ワークスペース例では、これらをワークスペースのユーザーパラメーターとして定義し、HTTPCaller の Query String Parameters セクションでそれらにリンクしています。図の "$(APP_ID)" などは、ユーザーパラメーターにリンクしている状態を示しています。

レスポンスとして得られた XML ドキュメントは Response Body Attribute (レスポンス本体の属性) パラメーターで指定した名前 (デフォルトでは "_response_body") の属性に格納され、後続のトランスフォーマーによって必要な変換を行うことができます。



























XMLFragmenter では、Elements to Match パラメーターに TABLE_INF を指定することで、統計表情報 XML ドキュメントから TABLE_INF 要素を抽出し、Flatten (平坦化) Option を有効にすることで、その要素以下のXML要素・属性の値をフィーチャー属性として取得することができます (参考: XMLの読込 - 断片化と平坦化)。e-Stat API で提供される XML ドキュメントのスキーマについては、前掲の e-Stat API サイトを参照してください。

StringConcatenator でHTML tr 要素 (テーブルの行) を作成するための文字列式は次のとおりです。4番目の列 (td 要素) の内容は、[ダウンロード] ボタンを表示し、それがクリックされたときに統計表IDを引数として download 関数を実行するためのもので、アプリケーション側でその関数が実装されることを想定しています。
コメント <!-- ... --> は説明用に書き加えたもので、実際にはこのHTMLが人の目に触れることはないので不要です。
<tr>
<td>@Value(TABLE_INF.id)</td> <!-- 統計表ID -->
<td>@Value(TITLE.no)</td> <!-- 表番号 -->
<td>@Value(TITLE)</td> <!-- 統計表の表題 -->
<td><input type="button" onclick="download('@Value(TABLE_INF.id)');" value="ダウンロード" /></td>
</tr>

XMLTemplater で分類名ごとの HTML 要素を作成するためのテンプレートは次のとおりです。HTML は、基本的には XML のサブセットなので、このように XML 関係のトランスフォーマーが活用できる場合があります。
<div>
<h3>{fme:get-attribute("STATISTICS_NAME")}</h3>
<table>
<tr><th>統計表ID</th><th>番号</th><th>統計表名</th><th></th></tr>
{fme:get-xml-list-attribute("_list{}.tr")}
</table>
</div>


このワークスペースを FME Server にアップロードすれば、JavaScript Library for FME Server を使ってワークスペースを実行するための JavaScript スクリプトを記述したウェブページから実行し、結果 (HTML要素) を取得してページに追加することができます。各行の右端にみえる [ダウンロード] ボタンの onclick イベントには download 関数 (引数=統計表ID) を割り当てているので、JavaScript ともうひとつの FME ワークスペースで処理を実装することにより、実際に統計表をダウンロードするように拡張することも可能です。

実際のところ、国勢調査の各統計表は API を使わなくても e-Stat サイトからダウンロードできるので、統計表リストのウェブページを作成すること自体には大きな意味はありません。分かり易い例として取り上げたまでです。

この例は、FME Server がウェブアプリケーションのバックエンド (ユーザーから見えないところでデータ処理を行う要素) としても利用できるということを示しています。Google Maps などの API も併用すれば、地理情報を扱うウェブアプリケーションの開発も可能です。

本格的なウェブアプリケーションを開発するには、ユーザーインターフェースをはじめとするフロントエンドの部分のプログラミングやデザインに手間がかかることは避けられませんが、データ処理を中心とするバックエンドの部分は FME にまかせることによって、システム全体の開発・運用にかかるコストを削減できるケースもあると思われます。

0 件のコメント:

コメントを投稿