気象庁の防災情報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サイトを作った