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サイトを作った

0 件のコメント:

コメントを投稿

記事へのコメントはいつも確認している訳ではないので、お返事が遅れる場合があります。
ご質問やご意見は twitter@9SQ へお送り頂けると早くお返事できると思います。