新登場「海上分布予報」はタイル工法です

# ご案内
気象庁では、日本近海を対象に地方海上分布予報を発表しておりますが、6月4日より、海上分布予報として小笠原諸島周辺海域の風や波の分布図形式の予報も開始しました。
以下のページからご覧いただけます。
(日本語ページ) https://www.data.jma.go.jp/fcd/yoho/umimesh/jp/
(英語ページ) https://www.data.jma.go.jp/fcd/yoho/umimesh/en/

（[報道発表資料](http://www.jma.go.jp/jma/press/1906/04b/20190604_umimesh.html)より）

# 何が見られるか

上記公式発表にもあるように、サービスエリアが 小笠原諸島周辺海域を除く各地方近海 から 日本近海 に拡大されはしましたが、まあそこまでは従来の「地方海上分布予報」と変わりません。

でも、右下に「地図出典：地理院タイル（加工して利用）」とありますね。ベースマップが地理院タイルなのです。北海道も（アスペクト比の狂っていない）普通の形をしていますね。そうです。タイル工法でウェブメルカトル地図になったのです。

## おことわり

**以下、たまたま今日こうだったという情報です**。気象庁ホームページは [政府標準規約準拠](https://www.jma.go.jp/jma/kishou/info/coment.html) で提供されており、スクレイピングを含め利用は原則ご自由にしていただけますが、同じ仕様での継続的提供はお約束されておりません。あと僕も直接の中の人じゃないんで、このページを保守しきれません。**予告なき変更があったらご容赦ください**。

手堅く仕事で使いたい方、あらかじめ仕様がすべて告知・コミットされるような組織的提供をご希望の方は、以下全部すっとばして、ページ末尾の「[伝統的形態でのデータ提供](https://qiita.com/e_toyoda/items/b57f03ed93e0e9221c1f#%E4%BC%9D%E7%B5%B1%E7%9A%84%E5%BD%A2%E6%85%8B%E3%81%A7%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E6%8F%90%E4%BE%9B)」をご覧ください。

## ウェブアプリ参照用のURLパターン

ズーム・スクロール・画種選択をすると、URL欄が変わっていきます。たとえば関東近海にズームインして風の予報をみると次のようになります：

https://www.data.jma.go.jp/fcd/yoho/umimesh/jp/#zoom:7/lat:35.003003/lon:139.998779/colordepth:normal/elements:wind

より一般には次のパターンで参照できます

`https://www.data.jma.go.jp/fcd/yoho/umimesh/jp/#zoom:{z}/lat:{lat}/lon:{lon}/colordepth:{color}/elements:{element}`

|変数|型|意味|
|:---|:--|:--|
|{z}|4～8|ズームレベル（[国土地理院資料](https://maps.gsi.go.jp/development/siyou.html#siyou-zm)参照）|
|{lat}|十進小数|画面中心の緯度（小数点下6桁を認識）|
|{lon}|十進小数|画面中心の経度（小数点下6桁を認識）|
|{color}|以下のどれか|`thin`:薄い、`normal`:普通、`deep`:濃い|
|{element}|以下のどれか|`wind`:風、`wave`:波、`vis`:視程（霧）、`icing`:着氷、`weather`:天気|

これをブックマークしたり、ツイートで伝えることにより、時間抜きの「どこの何の予報」という参照を作ることができます。

## タイル

さてご自分でタイル地図アプリ（ウェブ上にせよQGISのようなデスクトップにせよ）を作る・使うならばタイル画像のURLが知りたいものです。僕も組織的に教えてもらったわけじゃないですが、パソコン持っていれば、F12 押してしばらくリロードしたり画種変えたりしていればおのずと以下がわかるでしょう。

`https://www.data.jma.go.jp/fcd/yoho/umimesh/jmatile/data/umimesh/{basetime}/none/{validtime}/surf/{elem}/{z}/{x}/{y}.png`

|変数|型|意味|
|:---|:--|:---|
|{basetime}|date +%Y%m%d%H%M%S の出力|参照時刻。数値予報モデルのシミュレーション起点となる日時。GRIB第2版第4節の参照時刻と同じUTCタイムゾーン。同時に発表された予報では同じ値になる。現状では毎日0、6、12、18時。 **今何時のデータがあるのか、は次項ご参照**|
|{validtime}|date +%Y%m%d%H%M%S の出力|対象時刻。同時に発表された予報の中の時間軸。参照時刻にGRIB第2版第4節にある予報時間（6, 12, 18, 24時間）を加算したものと同じ。**今何時のデータがあるのか、は次項ご参照** |
|{elem}|以下のどれか|`ws`: 風速、`waveh`: 波高、`vis`: 視程、`icing`: 着氷の程度、`wm`: 天気|
|{z}|4～8|ズームレベル|
|{x}, {y}|整数|タイル番号。[国土地理院サイト](https://maps.gsi.go.jp/development/tileCoordCheck.html)で調べられます|

ふつうの地理情報と違い、データセット内に時間軸があるどころか、2つ時間軸があるので、混乱しないように願います。予報の世界では、いつも時間軸は2つです（3つ以上ある場合もありますが本質的でないので略）。

各画像のカラーコードの前に、時間の話をしましょう。

## 今何時のデータがあるのか

さて、時間によりファイル名が異なると、今何時のデータがあるのか知らないとアクセスできませんね。

* リストがある場所： https://www.data.jma.go.jp/fcd/yoho/umimesh/jmatile/data/umimesh/targetTimes.json

```JSON
[
  {"basetime": "20190605000000", "validtime": "20190606000000", "member": "none"},
  {"basetime": "20190605000000", "validtime": "20190605180000", "member": "none"},
  {"basetime": "20190605000000", "validtime": "20190605120000", "member": "none"},
  {"basetime": "20190605000000", "validtime": "20190605060000", "member": "none"}
]
```

* そのなかの basetime, validtime を前項のパターンにあてはめます。
* If-Modified-Since を使って 304 レスポンスが返ったら、前回アクセスからデータは更新されていません。それ以上画像を探るアクセスをしても無駄です。
* コンテンツデリバリの仕組み上、1分に1回以上アクセスしても無駄です。

利用者さん誰でも、一分一秒でも早く最新のデータがほしいのは当然なので、海上分布予報に限らず、気象庁には最新のデータの有無をさぐるアクセスが押し寄せてきます。それは仕方がないのですが、せめてお互いに効率的に運営できるよう、スマートなやりかたでいきましょう。

**大事なことなのでもう一度： If-Modified-Since が何だか理解する前に、毎分 wget コマンドを自動起動するのはやめましょう。あなたのディスク、いっぱいになっていませんか？**

なお、ブラウザ上の JavaScript から読み込むならば If-Modified-Since は自動的に処理され、キャッシュ管理を理解していなくても頻回起動プログラムで最新のデータが扱えますので、よくわからないなら JavaScript で処理するのをおすすめします。他サイトの JavaScript からtargetTimes.json が読み出せるよう、CORSヘッダ指定「Access-Control-Allow-Orign: *」をつけてあります。 

(2019-06-07追記) あと全然どうでもいいんですけど、WMOのGRIBのドキュメントでは参照時刻は reference time といいます。日本製タイル周辺APIでbasetime（基準時刻）というのはNuSDaSに起源を持つ気象庁方言です。

## カラーコード

さて各タイル画像は一部透明のPNGで、今回の場合は数値データを離散的な区間に分割してそれぞれ色で表現しています。配色は、[気象庁ホームページ配色指針](http://www.jma.go.jp/jma/kishou/info/coment.html#coloration)に準拠していますが、[今後の防災政策しだいで、恒久的にこのままとはお約束できない](https://www.jma.go.jp/jma/kishou/tyoukan/2018/dg_20181219.html)ところです。つまり特定の緯度経度のタイル番号・ピクセル位置の色を引っこ抜いて下表に照らしてデータを得ようとするプログラムを書くのはご自由ですが、動作は保証できませんのであしからずご容赦ください。

### 風速のカラーコード

風速のカラーコードは、おおむね[海上警報](https://www.jma.go.jp/jma/kishou/know/kurashi/umiyoho.html)と整合するように決められています。なお、海上警報は向こう24時間の期間の予測なので、海上分布予報と即連動はしなくてもおかしくはありません。

|風速/kt|RGB|参考|
|:---|---:|:---|
|0-25|`rgb(217,217,255)`|配色指針 表2-3 UV Index 1 と同色|
|25-30|`rgb(160,210,255)`|配色指針 表2-1 時系列予報の風速3-5m/sと同色|
|30-35|`rgb(255,200,0)`|配色指針 表2-3 UV Index 6 と同色|
|35-45|`rgb(255,170,0)`|配色指針 表1の海上強風警報（34-48kt）と同色|
|45-50|`rgb(255,120,0)`||
|50-65|`rgb(255,40,0)`|配色指針 表1の海上暴風警報（48kt-）と同色|
|65-|`rgb(200,0,255)`|配色指針 表1の海上台風警報（台風かつ64kt-）と同色|

### 波高のカラーコード

「注意報の黄色」「警報の赤」がそれぞれ波高2.5m以上と6m以上ですが、多くの外海に面した地方の波浪注意報・波浪警報の基準がそのくらいです。

|波高/m|RGB||
|:---|---:|:---|
|0-1.25|`rgb(217,217,255)`|配色指針 表2-3 UV Index 1 と同色|
|1.25-2.5|`rgb(160,210,255)`|配色指針 表2-1 時系列予報の風速3-5m/sと同色|
|2.5-4|`rgb(250,245,0)`|配色指針 表1の海上風警報（34-48kt）や気象注意報と同色|
|4-6|`rgb(255,170,0)`|配色指針 表1の海上強風警報と同色|
|6-9|`rgb(255,40,0)`|配色指針 表1の海上暴風警報や気象警報と同色|
|9-|`rgb(200,0,255)`|配色指針 表1の海上台風警報と同色|

### 視程（霧）のカラーコード

橙色（瀬戸内海については黄色）が海上濃霧警報の基準に相当します。陸上の濃霧注意報の基準とは比較が難しいところです。

|視程/海里|視程/km|RGB||
|:---|:---|---:|:---|
|0.5-∞|1-∞|`rgb(217,217,255)`|配色指針 表2-3 UV Index 1 と同色|
|0.3-0.5|0.5-1|`rgb(250,245,0)`|配色指針 表1の海上風警報（34-48kt）や気象注意報と同色|
|0-0.3|0-0.5|`rgb(255,170,0)`|配色指針 表1の海上強風警報と同色|

### 着氷の程度のカラーコード

|着氷の程度|RGB||
|:---|---:|:---|
|なし|`rgb(217,217,255)`|配色指針 表2-3 UV Index 1 と同色|
|弱|`rgb(250,245,0)`|配色指針 表1の海上風警報（34-48kt）や気象注意報と同色|
|並|`rgb(255,170,0)`|配色指針 表1の海上強風警報と同色|
|強|`rgb(255,40,0)`|配色指針 表1の海上暴風警報や気象警報と同色|

### 天気のカラーコード

|天気|RGB||
|:---|---:|:---|
|晴れ|`rgb(255,170,0)`|配色指針通り|
|くもり|`rgb(170,170,170)`|配色指針通り|
|雨|`rgb(0,65,255)`|配色指針通り|
|雪|`rgb(242,242,255)`|配色指針通り|

## 風向はタイルじゃない一枚JSON

風向もデータ構造は同じなんですが、矢印がいっぱい描いてある画像で配信するんじゃなくて、ブラウザ上で矢印画像を並べています。

`https://www.data.jma.go.jp/fcd/yoho/umimesh/jmatile/data/umimesh/{reftime}/none/{validtime}/surf/wd/data.geojson?id=wd`

上記は Point が大量に入った FeatureCollection 型 GeoJSON で、各点の `windDir` 属性が N, NE, E, ..., NW という文字列です。同じ矢印画像を何回も描画するほうが通信を削減できるのでしょう。

まあ、本件をはなれて一般論をいうと、「日本近海」限定だから一枚JSONが使えるのですね。現状でも340KBもありますから、全球に拡大したらレスポンスが悪くなりすぎです。GeoJSONではないコンパクトな形式（たとえば南北東西を行列であらわすCSV）に変えるか、ベクトルタイルにすべきでしょう。国土地理院さんのご尽力でベクトルタイルもそのうち当たり前になるものと期待しています。

# 伝統的形態でのデータ提供

ここで示されているのと同じ情報が、[気象業務支援センター](http://www.jmbsc.or.jp/jp/online/file/f-online24100.html#gpv)から配信されています。信頼性のある情報システムにより、確実に送達いたします。カラーコードした画像だけでなく風速や波高などの数値もあって、形式はWMO（世界気象機関）の定めるGRIB第2版です。現代風の Web ready format じゃないですが、伝統的な形式・配信形態が使い続けられていることと、技術仕様については明文で事前にコミットし、利用者に影響する変更を無暗にしないことは表裏一体です。

- [配信資料に関する技術情報 第503号「海上分布予報の提供開始について」](http://www.data.jma.go.jp/add/suishin/jyouhou/pdf/503.pdf)
- GRIB第2版については、[国際気象通報式 別冊](https://www.jma.go.jp/jma/kishou/books/tsuhoshiki/tsuhoshiki.html "リンク先からPDFを選んでください。PDFのURLは都度変わります")をご参照ください。