Pages

2015年7月5日

OpenLayers 3で気象庁発表の震度をマッピングする

色々忙しくて、前回から丸1ヶ月空きました...
気象庁の防災情報XML電文で発表される震源地と各地の震度情報をOpenLayers3で表示しようプロジェクト、その3です。

その1 : PostgreSQLとPostGISで国土数値情報(行政区域)を扱ってみる
その2 : PostGISで気象庁の細分区域&市町村等に対応する重心を求める

こんな感じになりました。


ココマデ長イ道ノリダッタ...

1. XML電文からGeoJSONを作る

まず、PostGISで気象庁の細分区域&市町村等に対応する重心を求める で生成した jma_area_centroid.csv と jma_city_centroid.csv を使って、気象庁防災情報XML電文の震度速報、震源・震度に関する情報から、区域別の震度(数値)情報と重心(緯度経度)を持つGeoJSONを出力します。

コードはまるっと以下に。
9SQ/jma-eqxml2geojson

#相変わらずのウンコードですが、動けば良いの精神で。

動作は
1. jma_area_centroid.csv と jma_city_centroid.csv をメモリ上のSQLiteデータベースにそれぞれ展開
2. 電文XMLを開いてBeautiful Stone Soupでパース
3. 震源地(epicenter)はそのまま経度緯度を取り出して辞書に入れる
4. 震度毎にリストを作り、各区域の区域コードに対応する重心(経度緯度)をデータベースから探してきてリストに追加
5. 上の3と4を一緒にしてjsonで出力
という感じ。

2. OpenLayers 3でGeoJSONのデータを描画

できたGeoJSONをOpenLayers 3でOpenStreetMap上に描画します。

コードはまるっと以下に。
9SQ/seismic-intensity-map

データが揃えばOpenLayers 3のパワーでサクッと表示できてしまいます。

XML電文の震度情報は、細分区域と市町村等区域でやってくるので、縮尺に応じて表示を切り替えするようにしました。
ズームして、ある一定以上になると市町村等レベルの震度表示に切り替わります。

初期のズームレベルと中央は、細分区域レベルでのポイントから、だいたい全体が入るように自動調整されます。

これが100行(スタイル定義を除けば実質60行)くらいで実現できるので、OpenLayers 3 凄い。

デモを以下に設置しましたので、ご自由にご覧ください。
http://www.quitsq.com/demo/seismic_intensity_map/
(2015年5月30日 20:24分頃に小笠原諸島西方沖で発生した最大震度5強の地震)

以上で終わりです。

もう少し暇になったら、地震発生毎に各地の震度情報を上記デモのように表示できるサービスを作ろうと思います。
(ついでに、Yoとかtwitterへのツイート機能も含めて。)

追記 2015/12:作りました→ 地震とか火山噴火情報を閲覧できるWebサイトを作った

2015年7月4日

RC-S620/SでTargetとして動作させる

SONYのFelicaリーダー・ライターRC-S620/Sで、Targetとして任意のカードのように振る舞う方法。

ArduinoとRC-S620/Sの接続方法は ArduinoにRC-S620/Sを接続する方法 などの記事を参考にしてください。

Targetとして動作させる方法については Arduino+RC-S620/SでPollingに任意のIDmで応答させる など、できたという報告はありますが、肝心のコードが無いので書いてみました。

SONYが公開している RC-S620/Sコマンドリファレンスマニュアル<簡易版> Page 47のTgInitTargetを忠実に実装しただけです。

以下、元のライブラリ(SONYが公開しているもの)からの差分のみを記載します。
おそらくmbedなど向けのライブラリでも同様の追加で動くはず...

一番最後のコードはArduinoでのスケッチです。
IDm、PMm、System Codeの部分を適宜変更してください。

送信の際、37バイトとしているのに、繋げていったデータのトータルが35バイトしか無いのは仕様です。
(最後のNFCID3tは本来10バイト必要なので、お尻の2バイトは0埋め)