eew_parser 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/eew_parser.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  #encoding: utf-8
2
2
 
3
+ require_relative "epicenter_code"
4
+ require_relative "area_code"
5
+
3
6
  # 緊急地震速報パーサ
4
7
  # Author:: Glass_saga
5
8
  # License:: NYSL Version 0.9982
@@ -18,1083 +21,553 @@
18
21
  # eew = EEWParser.new(str)
19
22
  # puts "最大予測震度: #{fc.seismic_intensity}"
20
23
  #
21
- class EEWParser
22
- # 震央地名コードをkey,震央地名称をvalueとするHash
23
- EpicenterCord = {
24
- 0 => "不明",
25
- 11 => "北海道地方",
26
- 12 => "東北地方",
27
- 13 => "北陸地方",
28
- 14 => "関東甲信地方",
29
- 15 => "小笠原地方",
30
- 16 => "東海地方",
31
- 17 => "近畿地方",
32
- 18 => "中国地方",
33
- 19 => "四国地方",
34
- 20 => "九州地方",
35
- 21 => "沖縄地方",
36
- 100 => "石狩支庁北部",
37
- 101 => "石狩支庁中部",
38
- 102 => "石狩支庁南部",
39
- 105 => "渡島支庁北部",
40
- 106 => "渡島支庁東部",
41
- 107 => "渡島支庁西部",
42
- 110 => "檜山支庁",
43
- 115 => "後志支庁北部",
44
- 116 => "後志支庁東部",
45
- 117 => "後志支庁西部",
46
- 120 => "空知支庁北部",
47
- 121 => "空知支庁中部",
48
- 122 => "空知支庁南部",
49
- 125 => "上川支庁北部",
50
- 126 => "上川支庁中部",
51
- 127 => "上川支庁南部",
52
- 130 => "留萌支庁中北部",
53
- 131 => "留萌支庁南部",
54
- 135 => "宗谷支庁北部",
55
- 136 => "宗谷支庁南部",
56
- 140 => "網走支庁網走地方",
57
- 141 => "網走支庁北見地方",
58
- 142 => "網走支庁紋別地方",
59
- 145 => "胆振支庁西部",
60
- 146 => "胆振支庁中東部",
61
- 150 => "日高支庁西部",
62
- 151 => "日高支庁中部",
63
- 152 => "日高支庁東部",
64
- 155 => "十勝支庁北部",
65
- 156 => "十勝支庁中部",
66
- 157 => "十勝支庁南部",
67
- 160 => "釧路支庁北部",
68
- 161 => "釧路支庁中南部",
69
- 165 => "根室支庁北部",
70
- 166 => "根室支庁中部",
71
- 167 => "根室支庁南部",
72
- 180 => "北海道南西沖",
73
- 181 => "北海道西方沖",
74
- 182 => "石狩湾",
75
- 183 => "北海道北西沖",
76
- 184 => "宗谷海峡",
77
- 185 => "北海道北東沖(廃止)",
78
- 186 => "国後島付近",
79
- 187 => "択捉島付近",
80
- 188 => "北海道東方沖",
81
- 189 => "根室半島南東沖",
82
- 190 => "釧路沖",
83
- 191 => "十勝沖",
84
- 192 => "浦河沖",
85
- 193 => "苫小牧沖",
86
- 194 => "内浦湾",
87
- 195 => "宗谷東方沖",
88
- 196 => "網走沖",
89
- 197 => "択捉島南東沖",
90
- 200 => "青森県津軽北部",
91
- 201 => "青森県津軽南部",
92
- 202 => "青森県三八上北地方",
93
- 203 => "青森県下北地方",
94
- 210 => "岩手県沿岸北部",
95
- 211 => "岩手県沿岸南部",
96
- 212 => "岩手県内陸北部",
97
- 213 => "岩手県内陸南部",
98
- 220 => "宮城県北部",
99
- 221 => "宮城県南部",
100
- 222 => "宮城県中部",
101
- 230 => "秋田県沿岸北部",
102
- 231 => "秋田県沿岸南部",
103
- 232 => "秋田県内陸北部",
104
- 233 => "秋田県内陸南部",
105
- 240 => "山形県庄内地方",
106
- 241 => "山形県最上地方",
107
- 242 => "山形県村山地方",
108
- 243 => "山形県置賜地方",
109
- 250 => "福島県中通り",
110
- 251 => "福島県浜通り",
111
- 252 => "福島県会津",
112
- 280 => "津軽海峡",
113
- 281 => "山形県沖",
114
- 282 => "秋田県沖",
115
- 283 => "青森県西方沖",
116
- 284 => "陸奥湾",
117
- 285 => "青森県東方沖",
118
- 286 => "岩手県沖",
119
- 287 => "宮城県沖",
120
- 288 => "三陸沖",
121
- 289 => "福島県沖",
122
- 290 => "仙台湾(廃止)",
123
- 300 => "茨城県北部",
124
- 301 => "茨城県南部",
125
- 309 => "千葉県南東沖",
126
- 310 => "栃木県北部",
127
- 311 => "栃木県南部",
128
- 320 => "群馬県北部",
129
- 321 => "群馬県南部",
130
- 330 => "埼玉県北部",
131
- 331 => "埼玉県南部",
132
- 332 => "埼玉県秩父地方",
133
- 340 => "千葉県北東部",
134
- 341 => "千葉県北西部",
135
- 342 => "千葉県南部",
136
- 349 => "房総半島南方沖",
137
- 350 => "東京都23区",
138
- 351 => "東京都多摩東部",
139
- 352 => "東京都多摩西部",
140
- 360 => "神奈川県東部",
141
- 361 => "神奈川県西部",
142
- 370 => "新潟県上越地方",
143
- 371 => "新潟県中越地方",
144
- 372 => "新潟県下越地方",
145
- 378 => "新潟県下越沖",
146
- 379 => "新潟県上中越沖",
147
- 380 => "富山県東部",
148
- 381 => "富山県西部",
149
- 390 => "石川県能登地方",
150
- 391 => "石川県加賀地方",
151
- 400 => "福井県嶺北",
152
- 401 => "福井県嶺南",
153
- 411 => "山梨県中・西部",
154
- 412 => "山梨県東部・富士五湖",
155
- 420 => "長野県北部",
156
- 421 => "長野県中部",
157
- 422 => "長野県南部",
158
- 430 => "岐阜県飛騨地方",
159
- 431 => "岐阜県美濃東部",
160
- 432 => "岐阜県美濃中西部",
161
- 440 => "静岡県伊豆地方",
162
- 441 => "静岡県東部",
163
- 442 => "静岡県中部",
164
- 443 => "静岡県西部",
165
- 450 => "愛知県東部",
166
- 451 => "愛知県西部",
167
- 460 => "三重県北部",
168
- 461 => "三重県中部",
169
- 462 => "三重県南部",
170
- 469 => "三重県南東沖",
171
- 470 => "鹿島灘(廃止)",
172
- 471 => "茨城県沖",
173
- 472 => "関東東方沖",
174
- 473 => "千葉県東方沖",
175
- 474 => "房総半島南東沖(廃止)",
176
- 475 => "八丈島東方沖",
177
- 476 => "八丈島近海",
178
- 477 => "東京湾",
179
- 478 => "相模湾",
180
- 479 => "千葉県南方沖(廃止)",
181
- 480 => "伊豆大島近海",
182
- 481 => "伊豆半島東方沖",
183
- 482 => "三宅島近海",
184
- 483 => "新島・神津島近海",
185
- 484 => "伊豆半島南方沖(廃止)",
186
- 485 => "駿河湾",
187
- 486 => "駿河湾南方沖",
188
- 487 => "遠州灘",
189
- 488 => "東海道沖(廃止)",
190
- 489 => "三河湾",
191
- 490 => "伊勢湾",
192
- 491 => "熊野灘(廃止)",
193
- 492 => "若狭湾",
194
- 493 => "福井県沖",
195
- 494 => "石川県西方沖",
196
- 495 => "能登半島沖",
197
- 496 => "新潟県沖(廃止)",
198
- 497 => "富山湾",
199
- 498 => "佐渡付近",
200
- 499 => "東海道南方沖",
201
- 500 => "滋賀県北部",
202
- 501 => "滋賀県南部",
203
- 510 => "京都府北部",
204
- 511 => "京都府南部",
205
- 520 => "大阪府北部",
206
- 521 => "大阪府南部",
207
- 530 => "兵庫県北部",
208
- 531 => "兵庫県南東部",
209
- 532 => "兵庫県南西部",
210
- 540 => "奈良県",
211
- 550 => "和歌山県北部",
212
- 551 => "和歌山県南部",
213
- 560 => "鳥取県東部",
214
- 562 => "鳥取県中部",
215
- 563 => "鳥取県西部",
216
- 570 => "島根県東部",
217
- 571 => "島根県西部",
218
- 580 => "岡山県北部",
219
- 581 => "岡山県南部",
220
- 590 => "広島県北部",
221
- 591 => "広島県南東部",
222
- 592 => "広島県南西部",
223
- 600 => "徳島県北部",
224
- 601 => "徳島県南部",
225
- 610 => "香川県東部",
226
- 611 => "香川県西部",
227
- 620 => "愛媛県東予",
228
- 621 => "愛媛県中予",
229
- 622 => "愛媛県南予",
230
- 630 => "高知県東部",
231
- 631 => "高知県中部",
232
- 632 => "高知県西部",
233
- 670 => "紀伊半島沖(廃止)",
234
- 671 => "室戸岬沖(廃止)",
235
- 672 => "足摺岬沖(廃止)",
236
- 673 => "土佐湾",
237
- 674 => "紀伊水道",
238
- 675 => "大阪湾",
239
- 676 => "播磨灘",
240
- 677 => "瀬戸内海中部",
241
- 678 => "安芸灘",
242
- 679 => "周防灘",
243
- 680 => "伊予灘",
244
- 681 => "豊後水道",
245
- 682 => "山口県北西沖",
246
- 683 => "島根県沖",
247
- 684 => "鳥取県沖",
248
- 685 => "隠岐島近海",
249
- 686 => "兵庫県北方沖",
250
- 687 => "京都府沖",
251
- 688 => "淡路島付近",
252
- 689 => "和歌山県南方沖",
253
- 700 => "山口県北部",
254
- 701 => "山口県東部",
255
- 702 => "山口県西部",
256
- 710 => "福岡県福岡地方",
257
- 711 => "福岡県北九州地方",
258
- 712 => "福岡県筑豊地方",
259
- 713 => "福岡県筑後地方",
260
- 720 => "佐賀県北部",
261
- 721 => "佐賀県南部",
262
- 730 => "長崎県北部",
263
- 731 => "長崎県南西部",
264
- 732 => "長崎県島原半島",
265
- 740 => "熊本県阿蘇地方",
266
- 741 => "熊本県熊本地方",
267
- 742 => "熊本県球磨地方",
268
- 743 => "熊本県天草・芦北地方",
269
- 750 => "大分県北部",
270
- 751 => "大分県中部",
271
- 752 => "大分県南部",
272
- 753 => "大分県西部",
273
- 760 => "宮崎県北部平野部",
274
- 761 => "宮崎県北部山沿い",
275
- 762 => "宮崎県南部平野部",
276
- 763 => "宮崎県南部山沿い",
277
- 770 => "鹿児島県薩摩地方",
278
- 771 => "鹿児島県大隅地方",
279
- 780 => "対馬近海(廃止)",
280
- 781 => "福岡県西方沖(廃止)",
281
- 782 => "長崎県沖(廃止)",
282
- 783 => "五島列島近海",
283
- 784 => "天草灘",
284
- 785 => "有明海",
285
- 786 => "橘湾",
286
- 787 => "鹿児島湾",
287
- 788 => "鹿児島県西方沖(廃止)",
288
- 789 => "鹿児島県南西沖(廃止)",
289
- 790 => "種子島近海",
290
- 791 => "日向灘",
291
- 792 => "種子島東方沖(廃止)",
292
- 793 => "奄美大島近海",
293
- 794 => "奄美大島東方沖(廃止)",
294
- 795 => "壱岐・対馬近海",
295
- 796 => "福岡県北西沖",
296
- 797 => "薩摩半島西方沖",
297
- 798 => "トカラ列島近海",
298
- 799 => "奄美大島北西沖",
299
- 820 => "大隅半島東方沖",
300
- 821 => "九州地方南東沖",
301
- 822 => "種子島南東沖",
302
- 823 => "奄美大島北東沖",
303
- 850 => "沖縄本島近海",
304
- 851 => "南大東島近海",
305
- 852 => "沖縄本島南方沖",
306
- 853 => "宮古島近海",
307
- 854 => "石垣島近海",
308
- 855 => "石垣島南方沖",
309
- 856 => "西表島付近",
310
- 857 => "与那国島近海",
311
- 858 => "沖縄本島北西沖",
312
- 859 => "宮古島北西沖",
313
- 860 => "石垣島北西沖",
314
- 900 => "台湾付近",
315
- 901 => "東シナ海",
316
- 902 => "四国沖",
317
- 903 => "鳥島近海",
318
- 904 => "鳥島東方沖",
319
- 905 => "オホーツク海南部",
320
- 906 => "サハリン西方沖",
321
- 907 => "日本海北部",
322
- 908 => "日本海中部",
323
- 909 => "日本海西部",
324
- 910 => "日本海南西部(廃止)",
325
- 911 => "父島近海",
326
- 912 => "千島列島",
327
- 913 => "千島列島南東沖",
328
- 914 => "北海道南東沖",
329
- 915 => "東北地方東方沖",
330
- 916 => "小笠原諸島西方沖",
331
- 917 => "硫黄島近海",
332
- 918 => "小笠原諸島東方沖",
333
- 919 => "南海道南方沖",
334
- 920 => "薩南諸島東方沖",
335
- 921 => "本州南方沖",
336
- 922 => "サハリン南部付近",
337
- 930 => "北西太平洋",
338
- 931 => "フィリピン海北部(廃止)",
339
- 932 => "マリアナ諸島",
340
- 933 => "黄海",
341
- 934 => "朝鮮半島南部",
342
- 935 => "朝鮮半島北部",
343
- 936 => "中国東北部",
344
- 937 => "ウラジオストク付近",
345
- 938 => "シベリア南部",
346
- 939 => "サハリン近海",
347
- 940 => "アリューシャン列島",
348
- 941 => "カムチャツカ半島付近",
349
- 942 => "北米西部",
350
- 943 => "北米中部",
351
- 944 => "北米東部",
352
- 945 => "中米",
353
- 946 => "南米西部",
354
- 947 => "南米中部",
355
- 948 => "南米東部",
356
- 949 => "北東太平洋",
357
- 950 => "南太平洋",
358
- 951 => "インドシナ半島付近",
359
- 952 => "フィリピン付近",
360
- 953 => "インドネシア付近",
361
- 954 => "グアム付近",
362
- 955 => "ニューギニア付近",
363
- 956 => "ニュージーランド付近",
364
- 957 => "オーストラリア付近",
365
- 958 => "シベリア付近",
366
- 959 => "ロシア西部",
367
- 960 => "ロシア中部",
368
- 961 => "ロシア東部",
369
- 962 => "中央アジア",
370
- 963 => "中国西部",
371
- 964 => "中国中部",
372
- 965 => "中国東部",
373
- 966 => "インド付近",
374
- 967 => "インド洋",
375
- 968 => "中東",
376
- 969 => "ヨーロッパ西部",
377
- 970 => "ヨーロッパ中部",
378
- 971 => "ヨーロッパ東部",
379
- 972 => "地中海",
380
- 973 => "アフリカ西部",
381
- 974 => "アフリカ中部",
382
- 975 => "アフリカ東部",
383
- 976 => "北大西洋",
384
- 977 => "南大西洋",
385
- 978 => "北極付近",
386
- 979 => "南極付近"}
387
-
388
- # 地域コードをkey,地域名称をvalueとするHash
389
- AreaCord = {
390
- 0 => "不明",
391
- 135 => "宗谷支庁北部",
392
- 136 => "宗谷支庁南部",
393
- 125 => "上川支庁北部",
394
- 126 => "上川支庁中部",
395
- 127 => "上川支庁南部",
396
- 130 => "留萌支庁中北部",
397
- 131 => "留萌支庁南部",
398
- 139 => "北海道利尻礼文",
399
- 150 => "日高支庁西部",
400
- 151 => "日高支庁中部",
401
- 152 => "日高支庁東部",
402
- 145 => "胆振支庁西部",
403
- 146 => "胆振支庁中東部",
404
- 110 => "檜山支庁",
405
- 105 => "渡島支庁北部",
406
- 106 => "渡島支庁東部",
407
- 107 => "渡島支庁西部",
408
- 140 => "網走支庁網走",
409
- 141 => "網走支庁北見",
410
- 142 => "網走支庁紋別",
411
- 165 => "根室支庁北部",
412
- 166 => "根室支庁中部",
413
- 167 => "根室支庁南部",
414
- 160 => "釧路支庁北部",
415
- 161 => "釧路支庁中南部",
416
- 155 => "十勝支庁北部",
417
- 156 => "十勝支庁中部",
418
- 157 => "十勝支庁南部",
419
- 119 => "北海道奥尻島",
420
- 120 => "空知支庁北部",
421
- 121 => "空知支庁中部",
422
- 122 => "空知支庁南部",
423
- 100 => "石狩支庁北部",
424
- 101 => "石狩支庁中部",
425
- 102 => "石狩支庁南部",
426
- 115 => "後志支庁北部",
427
- 116 => "後志支庁東部",
428
- 117 => "後志支庁西部",
429
- 200 => "青森県津軽北部",
430
- 201 => "青森県津軽南部",
431
- 202 => "青森県三八上北",
432
- 203 => "青森県下北",
433
- 230 => "秋田県沿岸北部",
434
- 231 => "秋田県沿岸南部",
435
- 232 => "秋田県内陸北部",
436
- 233 => "秋田県内陸南部",
437
- 210 => "岩手県沿岸北部",
438
- 211 => "岩手県沿岸南部",
439
- 212 => "岩手県内陸北部",
440
- 213 => "岩手県内陸南部",
441
- 220 => "宮城県北部",
442
- 221 => "宮城県南部",
443
- 222 => "宮城県中部",
444
- 240 => "山形県庄内",
445
- 241 => "山形県最上",
446
- 242 => "山形県村山",
447
- 243 => "山形県置賜",
448
- 250 => "福島県中通り",
449
- 251 => "福島県浜通り",
450
- 252 => "福島県会津",
451
- 300 => "茨城県北部",
452
- 301 => "茨城県南部",
453
- 310 => "栃木県北部",
454
- 311 => "栃木県南部",
455
- 320 => "群馬県北部",
456
- 321 => "群馬県南部",
457
- 330 => "埼玉県北部",
458
- 331 => "埼玉県南部",
459
- 332 => "埼玉県秩父",
460
- 350 => "東京都23区",
461
- 351 => "東京都多摩東部",
462
- 352 => "東京都多摩西部",
463
- 354 => "神津島",
464
- 355 => "伊豆大島",
465
- 356 => "新島",
466
- 357 => "三宅島",
467
- 358 => "八丈島",
468
- 359 => "小笠原",
469
- 340 => "千葉県北東部",
470
- 341 => "千葉県北西部",
471
- 342 => "千葉県南部",
472
- 360 => "神奈川県東部",
473
- 361 => "神奈川県西部",
474
- 420 => "長野県北部",
475
- 421 => "長野県中部",
476
- 422 => "長野県南部",
477
- 410 => "山梨県東部",
478
- 411 => "山梨県中・西部",
479
- 412 => "山梨県東部・富士五湖",
480
- 440 => "静岡県伊豆",
481
- 441 => "静岡県東部",
482
- 442 => "静岡県中部",
483
- 443 => "静岡県西部",
484
- 450 => "愛知県東部",
485
- 451 => "愛知県西部",
486
- 430 => "岐阜県飛騨",
487
- 431 => "岐阜県美濃東部",
488
- 432 => "岐阜県美濃中西部",
489
- 460 => "三重県北部",
490
- 461 => "三重県中部",
491
- 462 => "三重県南部",
492
- 370 => "新潟県上越",
493
- 371 => "新潟県中越",
494
- 372 => "新潟県下越",
495
- 375 => "新潟県佐渡",
496
- 380 => "富山県東部",
497
- 381 => "富山県西部",
498
- 390 => "石川県能登",
499
- 391 => "石川県加賀",
500
- 400 => "福井県嶺北",
501
- 401 => "福井県嶺南",
502
- 500 => "滋賀県北部",
503
- 501 => "滋賀県南部",
504
- 510 => "京都府北部",
505
- 511 => "京都府南部",
506
- 520 => "大阪府北部",
507
- 521 => "大阪府南部",
508
- 530 => "兵庫県北部",
509
- 531 => "兵庫県南東部",
510
- 532 => "兵庫県南西部",
511
- 535 => "兵庫県淡路島",
512
- 540 => "奈良県",
513
- 550 => "和歌山県北部",
514
- 551 => "和歌山県南部",
515
- 580 => "岡山県北部",
516
- 581 => "岡山県南部",
517
- 590 => "広島県北部",
518
- 591 => "広島県南東部",
519
- 592 => "広島県南西部",
520
- 570 => "島根県東部",
521
- 571 => "島根県西部",
522
- 575 => "島根県隠岐",
523
- 560 => "鳥取県東部",
524
- 562 => "鳥取県中部",
525
- 563 => "鳥取県西部",
526
- 600 => "徳島県北部",
527
- 601 => "徳島県南部",
528
- 610 => "香川県東部",
529
- 611 => "香川県西部",
530
- 620 => "愛媛県東予",
531
- 621 => "愛媛県中予",
532
- 622 => "愛媛県南予",
533
- 630 => "高知県東部",
534
- 631 => "高知県中部",
535
- 632 => "高知県西部",
536
- 700 => "山口県北部",
537
- 701 => "山口県東部",
538
- 702 => "山口県西部",
539
- 710 => "福岡県福岡",
540
- 711 => "福岡県北九州",
541
- 712 => "福岡県筑豊",
542
- 713 => "福岡県筑後",
543
- 750 => "大分県北部",
544
- 751 => "大分県中部",
545
- 752 => "大分県南部",
546
- 753 => "大分県西部",
547
- 730 => "長崎県北部",
548
- 731 => "長崎県南西部",
549
- 732 => "長崎県島原半島",
550
- 735 => "長崎県対馬",
551
- 736 => "長崎県壱岐",
552
- 737 => "長崎県五島",
553
- 720 => "佐賀県北部",
554
- 721 => "佐賀県南部",
555
- 740 => "熊本県阿蘇",
556
- 741 => "熊本県熊本",
557
- 742 => "熊本県球磨",
558
- 743 => "熊本県天草・芦北",
559
- 760 => "宮崎県北部平野部",
560
- 761 => "宮崎県北部山沿い",
561
- 762 => "宮崎県南部平野部",
562
- 763 => "宮崎県南部山沿い",
563
- 770 => "鹿児島県薩摩",
564
- 771 => "鹿児島県大隅",
565
- 774 => "鹿児島県十島村",
566
- 775 => "鹿児島県甑島",
567
- 776 => "鹿児島県種子島",
568
- 777 => "鹿児島県屋久島",
569
- 778 => "鹿児島県奄美北部",
570
- 779 => "鹿児島県奄美南部",
571
- 800 => "沖縄県本島北部",
572
- 801 => "沖縄県本島中南部",
573
- 802 => "沖縄県久米島",
574
- 803 => "沖縄県大東島",
575
- 804 => "沖縄県宮古島",
576
- 805 => "沖縄県石垣島",
577
- 806 => "沖縄県与那国島",
578
- 807 => "沖縄県西表島"}
24
+ module EEW
25
+ class Parser
26
+ class Error < StandardError; end
27
+
28
+ # 引数には緊急地震速報の電文を与えます。
29
+ def initialize(str)
30
+ raise ArgumentError unless str.is_a?(String)
31
+ @fastcast = str.dup
32
+ @fastcast.freeze
33
+ raise Error, "電文の形式が不正です" if @fastcast.size < 135
34
+ end
579
35
 
580
- class Error < StandardError; end
581
-
582
- # 引数には緊急地震速報の電文を与えます。
583
- def initialize(str)
584
- @fastcast = str
585
- @fastcast.freeze
586
- raise Error, "電文の形式が不正です" if @fastcast.size < 134
587
- end
36
+ attr_reader :fastcast
588
37
 
589
- attr_reader :fastcast
38
+ # initializeに与えられた電文を返します。
39
+ def to_s
40
+ @fastcast
41
+ end
590
42
 
591
- # initializeに与えられた電文を返します。
592
- def to_s
593
- @fastcast
594
- end
43
+ # 緊急地震速報の内容をテキストで出力します。
44
+ def print
45
+ str = <<-EOS
46
+ 電文種別: #{self.type}
47
+ 発信官署: #{self.from}
48
+ 訓練等の識別符: #{self.drill_type}
49
+ 電文の発表時刻: #{self.report_time}
50
+ 電文がこの電文を含め何通あるか: #{self.number_of_telegram}
51
+ コードが続くかどうか: #{self.continue?}
52
+ 地震発生時刻もしくは地震検知時刻: #{self.earthquake_time}
53
+ 地震識別番号: #{self.id}
54
+ 発表状況(訂正等)の指示: #{self.status}
55
+ 発表する高度利用者向け緊急地震速報の番号(地震単位での通番): #{self.number}
56
+ 震央地名: #{self.epicenter}
57
+ 震央の位置: #{self.position}
58
+ 震源の深さ(単位 km)(不明・未設定時,キャンセル時:///): #{self.depth}
59
+ マグニチュード(不明・未設定時、キャンセル時:///): #{self.magnitude}
60
+ 最大予測震度(不明・未設定時、キャンセル時://): #{self.seismic_intensity}
61
+ 震央の確からしさ: #{self.probability_of_position}
62
+ 震源の深さの確からしさ: #{self.probability_of_depth}
63
+ マグニチュードの確からしさ: #{self.probability_of_magnitude}
64
+ 震央の確からしさ(気象庁の部内システムでの利用): #{self.probability_of_position_jma}
65
+ 震源の深さの確からしさ(気象庁の部内システムでの利用): #{self.probability_of_depth_jma}
66
+ 震央位置の海陸判定: #{self.land_or_sea}
67
+ 警報を含む内容かどうか: #{self.warning?}
68
+ 最大予測震度の変化: #{self.change}
69
+ 最大予測震度の変化の理由: #{self.reason_of_change}
70
+ EOS
71
+
72
+ unless self.ebi.empty?
73
+ str << "\n地域毎の警報の判別、最大予測震度及び主要動到達予測時刻(EBI):"
74
+ self.ebi.each do |local|
75
+ str << "地域名: #{local[:area_name]} 最大予測震度: #{local[:intensity]} 予想到達時刻: #{local[:arrival_time]} 警報を含むかどうか: #{local[:warning]} 既に到達しているかどうか: #{local[:arrival]}\n"
76
+ end
77
+ end
595
78
 
596
- # 電文を解析した結果をHashで返します。
597
- def to_hash
598
- hash = {}
599
- hash[:type] = self.type
600
- hash[:from] = self.from
601
- hash[:drill_type] = self.drill_type
602
- hash[:report_time] = self.report_time
603
- hash[:number_of_telegram] = self.number_of_telegram
604
- hash[:continue?] = self.continue?
605
- hash[:earthquake_time] = self.earthquake_time
606
- hash[:id] = self.id
607
- hash[:status] = self.status
608
- hash[:final?] = self.final?
609
- hash[:number] = self.number
610
- hash[:epicenter] = self.epicenter
611
- hash[:position] = self.position
612
- hash[:depth] = self.depth
613
- hash[:magnitude] = self.magnitude
614
- hash[:seismic_intensity] = self.seismic_intensity
615
- hash[:probability_of_position] = self.probability_of_position
616
- hash[:probability_of_depth] = self.probability_of_depth
617
- hash[:probability_of_magnitude] = self.probability_of_magnitude
618
- hash[:probability_of_position_jma] = self.probability_of_position_jma
619
- hash[:probability_of_depth_jma] = self.probability_of_depth_jma
620
- hash[:land_or_sea] = self.land_or_sea
621
- hash[:warning?] = self.warning?
622
- hash[:change] = self.change
623
- hash[:reason_of_change] = self.reason_of_change
624
- hash[:ebi] = self.ebi
625
- hash
626
- end
79
+ return str
80
+ end
627
81
 
628
- def inspect
629
- "#<EEWParser:#{self.id}>"
630
- end
82
+ Attributes = [
83
+ :type, :from, :drill_type, :report_time, :number_of_telegram, :continue?, :earthquake_time, :id, :status, :final?, :number, :epicenter, :position, :depth,
84
+ :magnitude, :seismic_intensity, :probability_of_position_jma, :probability_of_depth, :probability_of_magnitude, :probability_of_position, :probability_of_depth_jma,
85
+ :land_or_sea, :warning?, :change, :reason_of_change, :ebi
86
+ ].freeze
87
+
88
+ # 電文を解析した結果をHashで返します。
89
+ def to_hash
90
+ hash = {}
91
+ Attributes.each do |attribute|
92
+ hash[attribute] = __send__(attribute)
93
+ end
94
+ return hash
95
+ end
631
96
 
632
- def ==(other)
633
- self.fastcast == other.fastcast
634
- end
97
+ def inspect
98
+ "#<EEWParser:#{id}>"
99
+ end
635
100
 
636
- def <=>(other)
637
- self.id.to_i <=> other.id.to_i
638
- end
101
+ def ==(other)
102
+ fastcast == other.fastcast
103
+ end
639
104
 
640
- # 電文種別コード
641
- def type
642
- case @fastcast[0, 2]
643
- when "35"
644
- "最大予測震度のみの高度利用者向け緊急地震速報"
645
- when "36"
646
- "マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(B-Δ法、テリトリ法)"
647
- when "37"
648
- "マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(グリッドサーチ法、EPOS自動処理手法)"
649
- when "39"
650
- "キャンセル報"
651
- else
652
- raise Error, "電文の形式が不正です(電文種別コード)"
105
+ def <=>(other)
106
+ Integer(id) <=> Integer(id)
653
107
  end
654
- end
655
108
 
656
- # 発信官署
657
- def from
658
- case @fastcast[3, 2]
659
- when "01"
660
- "札幌"
661
- when "02"
662
- "仙台"
663
- when "03"
664
- "東京"
665
- when "04"
666
- "大阪"
667
- when "05"
668
- "福岡"
669
- when "06"
670
- "沖縄"
671
- else
672
- raise Error, "電文の形式が不正です(発信官署)"
109
+ # 電文種別コード
110
+ def type
111
+ case @fastcast[0, 2]
112
+ when "35"
113
+ "最大予測震度のみの高度利用者向け緊急地震速報"
114
+ when "36"
115
+ "マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(B-Δ法、テリトリ法)"
116
+ when "37"
117
+ "マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(グリッドサーチ法、EPOS自動処理手法)"
118
+ when "39"
119
+ "キャンセル報"
120
+ else
121
+ raise Error, "電文の形式が不正です(電文種別コード)"
122
+ end
673
123
  end
674
- end
675
124
 
676
- # 訓練等の識別符
677
- def drill_type
678
- case @fastcast[6, 2]
679
- when "00"
680
- "通常"
681
- when "01"
682
- "訓練"
683
- when "10"
684
- "取り消し"
685
- when "11"
686
- "訓練取り消し"
687
- when "20"
688
- "参考情報またはテキスト"
689
- when "30"
690
- "コード部のみの配信試験"
691
- else
692
- raise Error, "電文の形式が不正です(識別符)"
125
+ # 発信官署
126
+ def from
127
+ case @fastcast[3, 2]
128
+ when "01"
129
+ "札幌"
130
+ when "02"
131
+ "仙台"
132
+ when "03"
133
+ "東京"
134
+ when "04"
135
+ "大阪"
136
+ when "05"
137
+ "福岡"
138
+ when "06"
139
+ "沖縄"
140
+ else
141
+ raise Error, "電文の形式が不正です(発信官署)"
142
+ end
693
143
  end
694
- end
695
144
 
696
- # 電文の発表時刻のTimeオブジェクトを返します。
697
- def report_time
698
- Time.local("20" + @fastcast[9, 2], @fastcast[11, 2], @fastcast[13, 2], @fastcast[15, 2], @fastcast[17, 2], @fastcast[19, 2])
699
- end
145
+ # 訓練等の識別符
146
+ def drill_type
147
+ case @fastcast[6, 2]
148
+ when "00"
149
+ "通常"
150
+ when "01"
151
+ "訓練"
152
+ when "10"
153
+ "取り消し"
154
+ when "11"
155
+ "訓練取り消し"
156
+ when "20"
157
+ "参考情報またはテキスト"
158
+ when "30"
159
+ "コード部のみの配信試験"
160
+ else
161
+ raise Error, "電文の形式が不正です(識別符)"
162
+ end
163
+ end
700
164
 
701
- # 電文がこの電文を含め何通あるか(Integer)
702
- def number_of_telegram
703
- number_of_telegram = @fastcast[23]
704
- raise Error, "電文の形式が不正です" if number_of_telegram =~ /[^\d]/
705
- number_of_telegram.to_i
706
- end
165
+ # 電文の発表時刻のTimeオブジェクトを返します。
166
+ def report_time
167
+ Time.local("20" + @fastcast[9, 2], @fastcast[11, 2], @fastcast[13, 2], @fastcast[15, 2], @fastcast[17, 2], @fastcast[19, 2])
168
+ end
707
169
 
708
- # コードが続くかどうか
709
- def continue?
710
- case @fastcast[24]
711
- when "1"
712
- true
713
- when "0"
714
- false
715
- else
716
- raise Error, "電文の形式が不正です"
170
+ # 電文がこの電文を含め何通あるか(Integer)
171
+ def number_of_telegram
172
+ number_of_telegram = @fastcast[23]
173
+ raise Error, "電文の形式が不正です" if number_of_telegram =~ /[^\d]/
174
+ number_of_telegram.to_i
717
175
  end
718
- end
719
176
 
720
- # 地震発生時刻もしくは地震検知時刻のTimeオブジェクトを返します。
721
- def earthquake_time
722
- Time.local("20" + @fastcast[26, 2], @fastcast[28, 2], @fastcast[30, 2], @fastcast[32, 2], @fastcast[34, 2], @fastcast[36, 2])
723
- end
724
-
725
- # 地震識別番号(String)
726
- def id
727
- id = @fastcast[41, 14]
728
- raise Error, "電文の形式が不正です(地震識別番号)" if id =~ /[^\d]/
729
- id
730
- end
177
+ # コードが続くかどうか
178
+ def continue?
179
+ case @fastcast[24]
180
+ when "1"
181
+ true
182
+ when "0"
183
+ false
184
+ else
185
+ raise Error, "電文の形式が不正です"
186
+ end
187
+ end
731
188
 
732
- # 発表状況(訂正等)の指示
733
- def status
734
- case @fastcast[59]
735
- when "0"
736
- "通常発表"
737
- when "6"
738
- "情報内容の訂正"
739
- when "7"
740
- "キャンセルを誤って発表した場合の訂正"
741
- when "8"
742
- "訂正事項を盛り込んだ最終の高度利用者向け緊急地震速報"
743
- when "9"
744
- "最終の高度利用者向け緊急地震速報"
745
- when "/"
746
- "未設定"
747
- else
748
- raise Error, "電文の形式が不正です"
189
+ # 地震発生時刻もしくは地震検知時刻のTimeオブジェクトを返します。
190
+ def earthquake_time
191
+ Time.local("20" + @fastcast[26, 2], @fastcast[28, 2], @fastcast[30, 2], @fastcast[32, 2], @fastcast[34, 2], @fastcast[36, 2])
192
+ end
193
+
194
+ # 地震識別番号(String)
195
+ def id
196
+ id = @fastcast[41, 14]
197
+ raise Error, "電文の形式が不正です(地震識別番号)" if id =~ /[^\d]/
198
+ id
749
199
  end
750
- end
751
200
 
752
- # 最終報であればtrueを、そうでなければfalseを返します。
753
- def final?
754
- case @fastcast[59]
755
- when "9"
756
- true
757
- when "0", "6", "7", "8", "/"
758
- false
759
- else
760
- raise Error, "電文の形式が不正です"
201
+ # 発表状況(訂正等)の指示
202
+ def status
203
+ case @fastcast[59]
204
+ when "0"
205
+ "通常発表"
206
+ when "6"
207
+ "情報内容の訂正"
208
+ when "7"
209
+ "キャンセルを誤って発表した場合の訂正"
210
+ when "8"
211
+ "訂正事項を盛り込んだ最終の高度利用者向け緊急地震速報"
212
+ when "9"
213
+ "最終の高度利用者向け緊急地震速報"
214
+ when "/"
215
+ "未設定"
216
+ else
217
+ raise Error, "電文の形式が不正です"
218
+ end
761
219
  end
762
- end
763
220
 
764
- # 発表する高度利用者向け緊急地震速報の番号(地震単位での通番)(Integer)
765
- def number
766
- number = @fastcast[60, 2]
767
- raise Error, "電文の形式が不正です(高度利用者向け緊急地震速報の番号)" if number =~ /[^\d]/
768
- number.to_i
769
- end
221
+ # 最終報であればtrueを、そうでなければfalseを返します。
222
+ def final?
223
+ case @fastcast[59]
224
+ when "9"
225
+ true
226
+ when "0", "6", "7", "8", "/"
227
+ false
228
+ else
229
+ raise Error, "電文の形式が不正です"
230
+ end
231
+ end
770
232
 
771
- alias :revision :number
233
+ # 発表する高度利用者向け緊急地震速報の番号(地震単位での通番)(Integer)
234
+ def number
235
+ number = @fastcast[60, 2]
236
+ raise Error, "電文の形式が不正です(高度利用者向け緊急地震速報の番号)" if number =~ /[^\d]/
237
+ number.to_i
238
+ end
772
239
 
773
- # 震央の名称
774
- def epicenter
775
- key = @fastcast[86, 3]
776
- raise Error, "電文の形式が不正です(震央の名称)" if key =~ /[^\d]/
777
- EpicenterCord[key.to_i]
778
- end
240
+ alias :revision :number
779
241
 
780
- # 震央の位置
781
- def position
782
- position = @fastcast[90, 10]
783
- if position == "//// /////"
784
- "不明又は未設定"
785
- else
786
- raise Error, "電文の形式が不正です(震央の位置)" if position =~ /[^\d|\s|N|E]/
787
- position.insert(3, ".").insert(10, ".")
242
+ # 震央の名称
243
+ def epicenter
244
+ key = @fastcast[86, 3]
245
+ raise Error, "電文の形式が不正です(震央の名称)" if key =~ /[^\d]/
246
+ EpicenterCode[key.to_i]
788
247
  end
789
- end
790
248
 
791
- # 震源の深さ(単位 km)
792
- def depth
793
- depth = @fastcast[101, 3]
794
- if depth == "///"
795
- "不明又は未設定"
796
- else
797
- raise Error, "電文の形式が不正です(震源の深さ)" if depth =~ /[^\d]/
798
- depth.to_i
249
+ # 震央の位置
250
+ def position
251
+ position = @fastcast[90, 10]
252
+ if position == "//// /////"
253
+ "不明又は未設定"
254
+ else
255
+ raise Error, "電文の形式が不正です(震央の位置)" if position =~ /[^\d|\s|N|E]/
256
+ position.insert(3, ".").insert(10, ".")
257
+ end
799
258
  end
800
- end
801
259
 
802
- # マグニチュード
803
- # マグニチュードが不明又は未設定である場合は"不明又は未設定"を返します。
804
- # そうでなければ、マグニチュードをFloatで返します。
805
- def magnitude
806
- magnitude = @fastcast[105, 2]
807
- if magnitude == "//"
808
- "不明又は未設定"
809
- else
810
- raise Error, "電文の形式が不正です(マグニチュード)" if magnitude =~ /[^\d]/
811
- (magnitude[0] + "." + magnitude[1]).to_f
260
+ # 震源の深さ(単位 km)
261
+ def depth
262
+ depth = @fastcast[101, 3]
263
+ if depth == "///"
264
+ "不明又は未設定"
265
+ else
266
+ raise Error, "電文の形式が不正です(震源の深さ)" if depth =~ /[^\d]/
267
+ depth.to_i
268
+ end
812
269
  end
813
- end
814
270
 
815
- # 電文フォーマットの震度を文字列に変換
816
- def to_seismic_intensity(str)
817
- case str
818
- when "//"
819
- "不明又は未設定"
820
- when "01"
821
- "1"
822
- when "02"
823
- "2"
824
- when "03"
825
- "3"
826
- when "04"
827
- "4"
828
- when "5-"
829
- "5弱"
830
- when "5+"
831
- "5強"
832
- when "6-"
833
- "6弱"
834
- when "6+"
835
- "6強"
836
- when "07"
837
- "7"
838
- else
839
- raise Error, "電文の形式が不正です(震度)"
271
+ # マグニチュード
272
+ # マグニチュードが不明又は未設定である場合は"不明又は未設定"を返します。
273
+ # そうでなければ、マグニチュードをFloatで返します。
274
+ def magnitude
275
+ magnitude = @fastcast[105, 2]
276
+ if magnitude == "//"
277
+ "不明又は未設定"
278
+ else
279
+ raise Error, "電文の形式が不正です(マグニチュード)" if magnitude =~ /[^\d]/
280
+ (magnitude[0] + "." + magnitude[1]).to_f
281
+ end
840
282
  end
841
- end
842
-
843
- # 最大予測震度
844
- def seismic_intensity
845
- to_seismic_intensity(@fastcast[108, 2])
846
- rescue Error
847
- raise Error, "電文の形式が不正です(最大予測震度)"
848
- end
849
-
850
- # 震央の確からしさ
851
- def probability_of_position
852
- case @fastcast[113]
853
- when "1"
854
- "P波/S波レベル越え、またはテリトリー法(1点)[気象庁データ]"
855
- when "2"
856
- "テリトリー法(2点)[気象庁データ]"
857
- when "3"
858
- "グリッドサーチ法(3点/4点)[気象庁データ]"
859
- when "4"
860
- "グリッドサーチ法(5点)[気象庁データ]"
861
- when "5"
862
- "防災科研システム(4点以下、または精度情報なし)[防災科学技術研究所データ]"
863
- when "6"
864
- "防災科研システム(5点以上)[防災科学技術研究所データ]"
865
- when "7"
866
- "EPOS(海域[観測網外])[気象庁データ]"
867
- when "8"
868
- "EPOS(内陸[観測網内])[気象庁データ]"
869
- when "9"
870
- "予備"
871
- when "/"
872
- "不明又は未設定"
873
- else
874
- raise Error, "電文の形式が不正です(震央の確からしさ)"
875
- end
876
- end
877
283
 
878
- # 震源の深さの確からしさ
879
- def probability_of_depth
880
- case @fastcast[114]
881
- when "1"
882
- "P波/S波レベル越え、またはテリトリー法(1点)[気象庁データ]"
883
- when "2"
884
- "テリトリー法(2点)[気象庁データ]"
885
- when "3"
886
- "グリッドサーチ法(3点/4点)[気象庁データ]"
887
- when "4"
888
- "グリッドサーチ法(5点)[気象庁データ]"
889
- when "5"
890
- "防災科研システム(4点以下、または精度情報なし)[防災科学技術研究所データ]"
891
- when "6"
892
- "防災科研システム(5点以上)[防災科学技術研究所データ]"
893
- when "7"
894
- "EPOS(海域[観測網外])[気象庁データ]"
895
- when "8"
896
- "EPOS(内陸[観測網内])[気象庁データ]"
897
- when "9"
898
- "予備"
899
- when "/"
900
- "不明又は未設定"
901
- else
902
- raise Error, "電文の形式が不正です(震源の深さの確からしさ)"
903
- end
904
- end
905
-
906
- # マグニチュードの確からしさ
907
- def probability_of_magnitude
908
- case @fastcast[115]
909
- when "1"
910
- "未定義"
911
- when "2"
912
- "防災科研システム[防災科学技術研究所データ]"
913
- when "3"
914
- "全点P相(最大5点)[気象庁データ]"
915
- when "4"
916
- "P相/全相混在[気象庁データ]"
917
- when "5"
918
- "全点全相(最大5点)[気象庁データ]"
919
- when "6"
920
- "EPOS[気象庁データ]"
921
- when "7"
922
- "未定義"
923
- when "8"
924
- "P波/S波レベル越え[気象庁データ]"
925
- when "9"
926
- "予備"
927
- when "/"
928
- "不明又は未設定"
929
- else
930
- raise Error, "電文の形式が不正です(マグニチュードの確からしさ)"
284
+ # 電文フォーマットの震度を文字列に変換
285
+ def to_seismic_intensity(str)
286
+ case str
287
+ when "//"
288
+ "不明又は未設定"
289
+ when "01"
290
+ "1"
291
+ when "02"
292
+ "2"
293
+ when "03"
294
+ "3"
295
+ when "04"
296
+ "4"
297
+ when "5-"
298
+ "5"
299
+ when "5+"
300
+ "5強"
301
+ when "6-"
302
+ "6弱"
303
+ when "6+"
304
+ "6強"
305
+ when "07"
306
+ "7"
307
+ else
308
+ raise Error, "電文の形式が不正です(震度)"
309
+ end
931
310
  end
932
- end
933
311
 
934
- # 震央の確からしさ(※気象庁の部内システムでの利用)
935
- def probability_of_position_jma
936
- case @fastcast[116]
937
- when "1"
938
- "P波/S波レベル越え又はテリトリー法(1点)[気象庁データ]"
939
- when "2"
940
- "テリトリー法(2点)[気象庁データ]"
941
- when "3"
942
- "グリッドサーチ法(3点/4点)[気象庁データ]"
943
- when "4"
944
- "グリッドサーチ法(5点)[気象庁データ]"
945
- when "/"
946
- "不明又は未設定"
947
- when "5".."9"
948
- "未定義"
949
- else
950
- raise Error, "電文の形式が不正です(震央の確からしさ[気象庁の部内システムでの利用])"
312
+ # 最大予測震度
313
+ def seismic_intensity
314
+ to_seismic_intensity(@fastcast[108, 2])
315
+ rescue Error
316
+ raise Error, "電文の形式が不正です(最大予測震度)"
951
317
  end
952
- end
953
318
 
954
- # 震源の深さの確からしさ(※気象庁の部内システムでの利用)
955
- def probability_of_depth_jma
956
- case @fastcast[117]
957
- when "1"
958
- "P波/S波レベル越え又はテリトリー法(1点)[気象庁データ]"
959
- when "2"
960
- "テリトリー法(2点)[気象庁データ]"
961
- when "3"
962
- "グリッドサーチ法(3点/4点)[気象庁データ]"
963
- when "4"
964
- "グリッドサーチ法(5点)[気象庁データ]"
965
- when "/"
966
- "不明又は未設定"
967
- when "5".."9"
968
- "未定義"
969
- else
970
- raise Error, "電文の形式が不正です(震源の深さの確からしさ[気象庁の部内システムでの利用])"
319
+ # 震央の確からしさ
320
+ def probability_of_position
321
+ case @fastcast[113]
322
+ when "1"
323
+ "P波/S波レベル越え、またはテリトリー法(1点)[気象庁データ]"
324
+ when "2"
325
+ "テリトリー法(2点)[気象庁データ]"
326
+ when "3"
327
+ "グリッドサーチ法(3点/4点)[気象庁データ]"
328
+ when "4"
329
+ "グリッドサーチ法(5点)[気象庁データ]"
330
+ when "5"
331
+ "防災科研システム(4点以下、または精度情報なし)[防災科学技術研究所データ]"
332
+ when "6"
333
+ "防災科研システム(5点以上)[防災科学技術研究所データ]"
334
+ when "7"
335
+ "EPOS(海域[観測網外])[気象庁データ]"
336
+ when "8"
337
+ "EPOS(内陸[観測網内])[気象庁データ]"
338
+ when "9"
339
+ "予備"
340
+ when "/"
341
+ "不明又は未設定"
342
+ else
343
+ raise Error, "電文の形式が不正です(震央の確からしさ)"
344
+ end
971
345
  end
972
- end
973
346
 
974
- # 震央位置の海陸判定
975
- def land_or_sea
976
- case @fastcast[121]
977
- when "0"
978
- "陸域"
979
- when "1"
980
- "海域"
981
- when "/"
982
- "不明又は未設定"
983
- when "2".."9"
984
- "未定義"
985
- else
986
- raise Error, "電文の形式が不正です(震央位置の海陸判定)"
347
+ # 震源の深さの確からしさ
348
+ def probability_of_depth
349
+ case @fastcast[114]
350
+ when "1"
351
+ "P波/S波レベル越え、またはテリトリー法(1点)[気象庁データ]"
352
+ when "2"
353
+ "テリトリー法(2点)[気象庁データ]"
354
+ when "3"
355
+ "グリッドサーチ法(3点/4点)[気象庁データ]"
356
+ when "4"
357
+ "グリッドサーチ法(5点)[気象庁データ]"
358
+ when "5"
359
+ "防災科研システム(4点以下、または精度情報なし)[防災科学技術研究所データ]"
360
+ when "6"
361
+ "防災科研システム(5点以上)[防災科学技術研究所データ]"
362
+ when "7"
363
+ "EPOS(海域[観測網外])[気象庁データ]"
364
+ when "8"
365
+ "EPOS(内陸[観測網内])[気象庁データ]"
366
+ when "9"
367
+ "予備"
368
+ when "/", "0"
369
+ "不明又は未設定"
370
+ else
371
+ raise Error, "電文の形式が不正です(震源の深さの確からしさ)"
372
+ end
987
373
  end
988
- end
989
374
 
990
- # 警報を含む内容であればtrue、そうでなければfalse
991
- def warning?
992
- case @fastcast[122]
993
- when "0", "/", "2".."9"
994
- false
995
- when "1"
996
- true
997
- else
998
- raise Error, "電文の形式が不正です(警報の判別)"
375
+ # マグニチュードの確からしさ
376
+ def probability_of_magnitude
377
+ case @fastcast[115]
378
+ when "1"
379
+ "未定義"
380
+ when "2"
381
+ "防災科研システム[防災科学技術研究所データ]"
382
+ when "3"
383
+ "全点P相(最大5点)[気象庁データ]"
384
+ when "4"
385
+ "P相/全相混在[気象庁データ]"
386
+ when "5"
387
+ "全点全相(最大5点)[気象庁データ]"
388
+ when "6"
389
+ "EPOS[気象庁データ]"
390
+ when "7"
391
+ "未定義"
392
+ when "8"
393
+ "P波/S波レベル越え[気象庁データ]"
394
+ when "9"
395
+ "予備"
396
+ when "/", "0"
397
+ "不明又は未設定"
398
+ else
399
+ raise Error, "電文の形式が不正です(マグニチュードの確からしさ)"
400
+ end
999
401
  end
1000
- end
1001
402
 
1002
- # 最大予測震度の変化
1003
- def change
1004
- case @fastcast[129]
1005
- when "0"
1006
- "ほとんど変化無し"
1007
- when "1"
1008
- "最大予測震度が1.0以上大きくなった"
1009
- when "2"
1010
- "最大予測震度が1.0以上小さくなった"
1011
- when "3".."9"
1012
- "未定義"
1013
- when "/"
1014
- "不明又は未設定"
1015
- else
1016
- raise Error, "電文の形式が不正です(最大予測震度の変化)"
403
+ # 震央の確からしさ(※気象庁の部内システムでの利用)
404
+ def probability_of_position_jma
405
+ case @fastcast[116]
406
+ when "1"
407
+ "P波/S波レベル越え又はテリトリー法(1点)[気象庁データ]"
408
+ when "2"
409
+ "テリトリー法(2点)[気象庁データ]"
410
+ when "3"
411
+ "グリッドサーチ法(3点/4点)[気象庁データ]"
412
+ when "4"
413
+ "グリッドサーチ法(5点)[気象庁データ]"
414
+ when "/"
415
+ "不明又は未設定"
416
+ when "5".."9", "0"
417
+ "未定義"
418
+ else
419
+ raise Error, "電文の形式が不正です(震央の確からしさ[気象庁の部内システムでの利用])"
420
+ end
1017
421
  end
1018
- end
1019
422
 
1020
- # 最大予測震度の変化の理由
1021
- def reason_of_change
1022
- case @fastcast[130]
1023
- when "0"
1024
- "変化無し"
1025
- when "1"
1026
- "主としてMが変化したため(1.0以上)"
1027
- when "2"
1028
- "主として震源位置が変化したため(10.0km以上)"
1029
- when "3"
1030
- "M及び震源位置が変化したため"
1031
- when "4"
1032
- "震源の深さが変化したため"
1033
- when "/"
1034
- "不明又は未設定"
1035
- when "5".."9"
1036
- "未定義"
1037
- else
1038
- raise Error, "電文の形式が不正です(最大予測震度の変化の理由)"
423
+ # 震源の深さの確からしさ(※気象庁の部内システムでの利用)
424
+ def probability_of_depth_jma
425
+ case @fastcast[117]
426
+ when "1"
427
+ "P波/S波レベル越え又はテリトリー法(1点)[気象庁データ]"
428
+ when "2"
429
+ "テリトリー法(2点)[気象庁データ]"
430
+ when "3"
431
+ "グリッドサーチ法(3点/4点)[気象庁データ]"
432
+ when "4"
433
+ "グリッドサーチ法(5点)[気象庁データ]"
434
+ when "/"
435
+ "不明又は未設定"
436
+ when "5".."9", "0"
437
+ "未定義"
438
+ else
439
+ raise Error, "電文の形式が不正です(震源の深さの確からしさ[気象庁の部内システムでの利用])"
440
+ end
1039
441
  end
1040
- end
1041
442
 
1042
- # 地域毎の警報の判別、最大予測震度及び主要動到達予測時刻
1043
- # EBIがあればHashを格納したArrayを、なければ空のArrayを返します。Hashに格納されるkeyとvalueはそれぞれ次のようになっています。
1044
- # :area_name 地域名称
1045
- # :intensity 最大予測震度
1046
- # :arrival_time 予想到達時刻のTimeオブジェクト。既に到達している場合はnil
1047
- # :warning 警報を含んでいればtrue、含んでいなければfalse、電文にこの項目が設定されていなければnil
1048
- # :arrival 既に到達していればtrue、そうでなければfalse、電文にこの項目が設定されていなければnil
1049
- def ebi
1050
- data = []
1051
- return data unless @fastcast[135, 3] == "EBI"
1052
- i = 139
1053
- while i + 20 < @fastcast.size
1054
- local = {}
1055
- local[:area_name] = AreaCord[@fastcast[i, 3].to_i] # 地域名称
1056
- raise Error, "電文の形式が不正でです(地域名称[EBI])" unless local[:area_name]
1057
- if @fastcast[i+7, 2] == "//"
1058
- local[:intensity] = "#{to_seismic_intensity(@fastcast[i+5, 2])}以上" # 最大予測震度
1059
- elsif @fastcast[i+5, 2] == @fastcast[i+7, 2]
1060
- local[:intensity] = "#{to_seismic_intensity(@fastcast[i+5, 2])}"
443
+ # 震央位置の海陸判定
444
+ def land_or_sea
445
+ case @fastcast[121]
446
+ when "0"
447
+ "陸域"
448
+ when "1"
449
+ "海域"
450
+ when "/"
451
+ "不明又は未設定"
452
+ when "2".."9"
453
+ "未定義"
1061
454
  else
1062
- local[:intensity] = "#{to_seismic_intensity(@fastcast[i+7, 2])}から#{to_seismic_intensity(@fastcast[i+5, 2])}"
455
+ raise Error, "電文の形式が不正です(震央位置の海陸判定)"
1063
456
  end
1064
- if @fastcast[i+10, 6] == "//////"
1065
- local[:arrival_time] = nil # 予想到達時刻
457
+ end
458
+
459
+ # 警報を含む内容であればtrue、そうでなければfalse
460
+ def warning?
461
+ case @fastcast[122]
462
+ when "0", "/", "2".."9"
463
+ false
464
+ when "1"
465
+ true
1066
466
  else
1067
- local[:arrival_time] = Time.local("20" + @fastcast[26, 2], @fastcast[28, 2], @fastcast[30, 2], @fastcast[i+10, 2], @fastcast[i+12, 2], @fastcast[i+14, 2])
467
+ raise Error, "電文の形式が不正です(警報の判別)"
1068
468
  end
1069
- case @fastcast[i+17]
469
+ end
470
+
471
+ # 最大予測震度の変化
472
+ def change
473
+ case @fastcast[129]
1070
474
  when "0"
1071
- local[:warning] = false # 警報を含むかどうか
475
+ "ほとんど変化無し"
1072
476
  when "1"
1073
- local[:warning] = true
1074
- when "/", "2".."9"
1075
- local[:warning] = nil
477
+ "最大予測震度が1.0以上大きくなった"
478
+ when "2"
479
+ "最大予測震度が1.0以上小さくなった"
480
+ when "3".."9"
481
+ "未定義"
482
+ when "/"
483
+ "不明又は未設定"
1076
484
  else
1077
- raise Error, "電文の形式が不正でです(警報の判別[EBI])"
485
+ raise Error, "電文の形式が不正です(最大予測震度の変化)"
1078
486
  end
1079
- case @fastcast[i+18]
487
+ end
488
+
489
+ # 最大予測震度の変化の理由
490
+ def reason_of_change
491
+ case @fastcast[130]
1080
492
  when "0"
1081
- local[:arrival] = false # 既に到達しているかどうか
493
+ "変化無し"
1082
494
  when "1"
1083
- local[:arrival] = true
1084
- when "/", "2".."9"
1085
- local[:arrival] = nil
495
+ "主としてMが変化したため(1.0以上)"
496
+ when "2"
497
+ "主として震源位置が変化したため(10.0km以上)"
498
+ when "3"
499
+ "M及び震源位置が変化したため"
500
+ when "4"
501
+ "震源の深さが変化したため"
502
+ when "/"
503
+ "不明又は未設定"
504
+ when "5".."9"
505
+ "未定義"
1086
506
  else
1087
- raise Error, "電文の形式が不正でです(主要動の到達予測状況[EBI])"
507
+ raise Error, "電文の形式が不正です(最大予測震度の変化の理由)"
508
+ end
509
+ end
510
+
511
+ # 地域毎の警報の判別、最大予測震度及び主要動到達予測時刻
512
+ # EBIがあればHashを格納したArrayを、なければ空のArrayを返します。Hashに格納されるkeyとvalueはそれぞれ次のようになっています。
513
+ # :area_name 地域名称
514
+ # :intensity 最大予測震度
515
+ # :arrival_time 予想到達時刻のTimeオブジェクト。既に到達している場合はnil
516
+ # :warning 警報を含んでいればtrue、含んでいなければfalse、電文にこの項目が設定されていなければnil
517
+ # :arrival 既に到達していればtrue、そうでなければfalse、電文にこの項目が設定されていなければnil
518
+ def ebi
519
+ data = []
520
+ return data unless @fastcast[135, 3] == "EBI"
521
+ i = 139
522
+ while i + 20 < @fastcast.size
523
+ local = {}
524
+ local[:area_code] = @fastcast[i, 3].to_i
525
+ local[:area_name] = AreaCode[local[:area_code]] # 地域名称
526
+ raise Error, "電文の形式が不正でです(地域名称[EBI])" unless local[:area_name]
527
+ if @fastcast[i+7, 2] == "//"
528
+ local[:intensity] = "#{to_seismic_intensity(@fastcast[i+5, 2])}以上" # 最大予測震度
529
+ elsif @fastcast[i+5, 2] == @fastcast[i+7, 2]
530
+ local[:intensity] = "#{to_seismic_intensity(@fastcast[i+5, 2])}"
531
+ else
532
+ local[:intensity] = "#{to_seismic_intensity(@fastcast[i+7, 2])}から#{to_seismic_intensity(@fastcast[i+5, 2])}"
533
+ end
534
+ if @fastcast[i+10, 6] == "//////"
535
+ local[:arrival_time] = nil # 予想到達時刻
536
+ else
537
+ local[:arrival_time] = Time.local("20" + @fastcast[26, 2], @fastcast[28, 2], @fastcast[30, 2], @fastcast[i+10, 2], @fastcast[i+12, 2], @fastcast[i+14, 2])
538
+ end
539
+ case @fastcast[i+17]
540
+ when "0"
541
+ local[:warning] = false # 警報を含むかどうか
542
+ when "1"
543
+ local[:warning] = true
544
+ when "/", "2".."9"
545
+ local[:warning] = nil
546
+ else
547
+ raise Error, "電文の形式が不正でです(警報の判別[EBI])"
548
+ end
549
+ case @fastcast[i+18]
550
+ when "0"
551
+ local[:arrival] = false # 既に到達しているかどうか
552
+ when "1"
553
+ local[:arrival] = true
554
+ when "/", "2".."9"
555
+ local[:arrival] = nil
556
+ else
557
+ raise Error, "電文の形式が不正でです(主要動の到達予測状況[EBI])"
558
+ end
559
+ data << local
560
+ i += 20
1088
561
  end
1089
- data << local
1090
- i += 20
562
+ data
1091
563
  end
1092
- data
1093
564
  end
1094
565
  end
1095
566
 
567
+ EEWParser = EEW::Parser
568
+
1096
569
  if __FILE__ == $PROGRAM_NAME # テスト
1097
- str = <<EOS #テスト用の電文
570
+ str = <<EOS #テスト用の電文(EBIを含む)
1098
571
  37 03 00 110415233453 C11
1099
572
  110415233416
1100
573
  ND20110415233435 NCN005 JD////////////// JN///
@@ -1108,7 +581,7 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
1108
581
  9999=
1109
582
  EOS
1110
583
 
1111
- fc = EEWParser.new(str)
584
+ fc = EEW::Parser.new(str)
1112
585
  p fc
1113
586
  p fc.fastcast
1114
587
  p fc.to_hash
@@ -1140,7 +613,7 @@ EOS
1140
613
  最大予測震度の変化の理由: #{fc.reason_of_change}
1141
614
  FC
1142
615
  fc.ebi.each do |local|
1143
- puts "地域コード: #{local[:area_cord]} 最大予測震度: #{local[:intensity]} 予想到達時刻: #{local[:arrival_time]}"
616
+ puts "地域コード: #{local[:area_code]} 地域名: #{local[:area_name]} 最大予測震度: #{local[:intensity]} 予想到達時刻: #{local[:arrival_time]}"
1144
617
  puts "警報を含むかどうか: #{local[:warning]} 既に到達しているかどうか: #{local[:arrival]}"
1145
618
  end
1146
619
  end