eew_parser 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/eew_parser.gemspec +1 -1
- data/lib/eew_parser.rb +156 -29
- metadata +11 -16
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.3
|
1
|
+
0.1.3
|
data/eew_parser.gemspec
CHANGED
data/lib/eew_parser.rb
CHANGED
@@ -576,10 +576,65 @@ AreaCord = {
|
|
576
576
|
805 => "沖縄県石垣島",
|
577
577
|
806 => "沖縄県与那国島",
|
578
578
|
807 => "沖縄県西表島"}
|
579
|
+
|
580
|
+
class Error < StandardError; end
|
579
581
|
|
580
582
|
# 引数には緊急地震速報の電文を与えます。
|
581
583
|
def initialize(str)
|
582
584
|
@fastcast = str
|
585
|
+
@fastcast.freeze
|
586
|
+
raise Error, "電文の形式が不正です" if @fastcast.size < 134
|
587
|
+
end
|
588
|
+
|
589
|
+
attr_reader :fastcast
|
590
|
+
|
591
|
+
# initializeに与えられた電文を返します。
|
592
|
+
def to_s
|
593
|
+
@fastcast
|
594
|
+
end
|
595
|
+
|
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
|
627
|
+
|
628
|
+
def inspect
|
629
|
+
"#<EEWParser:#{self.id}>"
|
630
|
+
end
|
631
|
+
|
632
|
+
def ==(other)
|
633
|
+
self.fastcast == other.fastcast
|
634
|
+
end
|
635
|
+
|
636
|
+
def <=>(other)
|
637
|
+
self.id.to_i <=> other.id.to_i
|
583
638
|
end
|
584
639
|
|
585
640
|
# 電文種別コード
|
@@ -593,6 +648,8 @@ AreaCord = {
|
|
593
648
|
"マグニチュード、最大予測震度及び主要動到達予測時刻の高度利用者向け緊急地震速報(グリッドサーチ法、EPOS自動処理手法)"
|
594
649
|
when "39"
|
595
650
|
"キャンセル報"
|
651
|
+
else
|
652
|
+
raise Error, "電文の形式が不正です(電文種別コード)"
|
596
653
|
end
|
597
654
|
end
|
598
655
|
|
@@ -611,6 +668,8 @@ AreaCord = {
|
|
611
668
|
"福岡"
|
612
669
|
when "06"
|
613
670
|
"沖縄"
|
671
|
+
else
|
672
|
+
raise Error, "電文の形式が不正です(発信官署)"
|
614
673
|
end
|
615
674
|
end
|
616
675
|
|
@@ -629,6 +688,8 @@ AreaCord = {
|
|
629
688
|
"参考情報またはテキスト"
|
630
689
|
when "30"
|
631
690
|
"コード部のみの配信試験"
|
691
|
+
else
|
692
|
+
raise Error, "電文の形式が不正です(識別符)"
|
632
693
|
end
|
633
694
|
end
|
634
695
|
|
@@ -639,12 +700,21 @@ AreaCord = {
|
|
639
700
|
|
640
701
|
# 電文がこの電文を含め何通あるか(Integer)
|
641
702
|
def number_of_telegram
|
642
|
-
@fastcast[23]
|
703
|
+
number_of_telegram = @fastcast[23]
|
704
|
+
raise Error, "電文の形式が不正です" if number_of_telegram =~ /[^\d]/
|
705
|
+
number_of_telegram.to_i
|
643
706
|
end
|
644
707
|
|
645
708
|
# コードが続くかどうか
|
646
709
|
def continue?
|
647
|
-
@fastcast[24]
|
710
|
+
case @fastcast[24]
|
711
|
+
when "1"
|
712
|
+
true
|
713
|
+
when "0"
|
714
|
+
false
|
715
|
+
else
|
716
|
+
raise Error, "電文の形式が不正です"
|
717
|
+
end
|
648
718
|
end
|
649
719
|
|
650
720
|
# 地震発生時刻もしくは地震検知時刻のTimeオブジェクトを返します。
|
@@ -654,7 +724,9 @@ AreaCord = {
|
|
654
724
|
|
655
725
|
# 地震識別番号(String)
|
656
726
|
def id
|
657
|
-
@fastcast[41, 14]
|
727
|
+
id = @fastcast[41, 14]
|
728
|
+
raise Error, "電文の形式が不正です(地震識別番号)" if id =~ /[^\d]/
|
729
|
+
id
|
658
730
|
end
|
659
731
|
|
660
732
|
# 発表状況(訂正等)の指示
|
@@ -672,24 +744,37 @@ AreaCord = {
|
|
672
744
|
"最終の高度利用者向け緊急地震速報"
|
673
745
|
when "/"
|
674
746
|
"未設定"
|
747
|
+
else
|
748
|
+
raise Error, "電文の形式が不正です"
|
675
749
|
end
|
676
750
|
end
|
677
751
|
|
678
752
|
# 最終報であればtrueを、そうでなければfalseを返します。
|
679
753
|
def final?
|
680
|
-
@fastcast[59]
|
754
|
+
case @fastcast[59]
|
755
|
+
when "9"
|
756
|
+
true
|
757
|
+
when "0", "6", "7", "8", "/"
|
758
|
+
false
|
759
|
+
else
|
760
|
+
raise Error, "電文の形式が不正です"
|
761
|
+
end
|
681
762
|
end
|
682
763
|
|
683
764
|
# 発表する高度利用者向け緊急地震速報の番号(地震単位での通番)(Integer)
|
684
765
|
def number
|
685
|
-
@fastcast[60, 2]
|
766
|
+
number = @fastcast[60, 2]
|
767
|
+
raise Error, "電文の形式が不正です(高度利用者向け緊急地震速報の番号)" if number =~ /[^\d]/
|
768
|
+
number.to_i
|
686
769
|
end
|
687
770
|
|
688
771
|
alias :revision :number
|
689
772
|
|
690
773
|
# 震央の名称
|
691
774
|
def epicenter
|
692
|
-
|
775
|
+
key = @fastcast[86, 3]
|
776
|
+
raise Error, "電文の形式が不正です(震央の名称)" if key =~ /[^\d]/
|
777
|
+
EpicenterCord[key.to_i]
|
693
778
|
end
|
694
779
|
|
695
780
|
# 震央の位置
|
@@ -698,16 +783,19 @@ AreaCord = {
|
|
698
783
|
if position == "//// /////"
|
699
784
|
"不明又は未設定"
|
700
785
|
else
|
786
|
+
raise Error, "電文の形式が不正です(震央の位置)" if position =~ /[^\d|\s|N|E]/
|
701
787
|
position.insert(3, ".").insert(10, ".")
|
702
788
|
end
|
703
789
|
end
|
704
790
|
|
705
791
|
# 震源の深さ(単位 km)
|
706
792
|
def depth
|
707
|
-
|
793
|
+
depth = @fastcast[101, 3]
|
794
|
+
if depth == "///"
|
708
795
|
"不明又は未設定"
|
709
796
|
else
|
710
|
-
|
797
|
+
raise Error, "電文の形式が不正です(震源の深さ)" if depth =~ /[^\d]/
|
798
|
+
depth.to_i
|
711
799
|
end
|
712
800
|
end
|
713
801
|
|
@@ -715,10 +803,12 @@ AreaCord = {
|
|
715
803
|
# マグニチュードが不明又は未設定である場合は"不明又は未設定"を返します。
|
716
804
|
# そうでなければ、マグニチュードをFloatで返します。
|
717
805
|
def magnitude
|
718
|
-
|
806
|
+
magnitude = @fastcast[105, 2]
|
807
|
+
if magnitude == "//"
|
719
808
|
"不明又は未設定"
|
720
809
|
else
|
721
|
-
|
810
|
+
raise Error, "電文の形式が不正です(マグニチュード)" if magnitude =~ /[^\d]/
|
811
|
+
(magnitude[0] + "." + magnitude[1]).to_f
|
722
812
|
end
|
723
813
|
end
|
724
814
|
|
@@ -745,12 +835,16 @@ AreaCord = {
|
|
745
835
|
"6強"
|
746
836
|
when "07"
|
747
837
|
"7"
|
838
|
+
else
|
839
|
+
raise Error, "電文の形式が不正です(震度)"
|
748
840
|
end
|
749
841
|
end
|
750
842
|
|
751
843
|
# 最大予測震度
|
752
844
|
def seismic_intensity
|
753
845
|
to_seismic_intensity(@fastcast[108, 2])
|
846
|
+
rescue Error
|
847
|
+
raise Error, "電文の形式が不正です(最大予測震度)"
|
754
848
|
end
|
755
849
|
|
756
850
|
# 震央の確からしさ
|
@@ -776,6 +870,8 @@ AreaCord = {
|
|
776
870
|
"予備"
|
777
871
|
when "/"
|
778
872
|
"不明又は未設定"
|
873
|
+
else
|
874
|
+
raise Error, "電文の形式が不正です(震央の確からしさ)"
|
779
875
|
end
|
780
876
|
end
|
781
877
|
|
@@ -802,6 +898,8 @@ AreaCord = {
|
|
802
898
|
"予備"
|
803
899
|
when "/"
|
804
900
|
"不明又は未設定"
|
901
|
+
else
|
902
|
+
raise Error, "電文の形式が不正です(震源の深さの確からしさ)"
|
805
903
|
end
|
806
904
|
end
|
807
905
|
|
@@ -828,6 +926,8 @@ AreaCord = {
|
|
828
926
|
"予備"
|
829
927
|
when "/"
|
830
928
|
"不明又は未設定"
|
929
|
+
else
|
930
|
+
raise Error, "電文の形式が不正です(マグニチュードの確からしさ)"
|
831
931
|
end
|
832
932
|
end
|
833
933
|
|
@@ -844,8 +944,10 @@ AreaCord = {
|
|
844
944
|
"グリッドサーチ法(5点)[気象庁データ]"
|
845
945
|
when "/"
|
846
946
|
"不明又は未設定"
|
847
|
-
|
947
|
+
when "5".."9"
|
848
948
|
"未定義"
|
949
|
+
else
|
950
|
+
raise Error, "電文の形式が不正です(震央の確からしさ[気象庁の部内システムでの利用])"
|
849
951
|
end
|
850
952
|
end
|
851
953
|
|
@@ -862,8 +964,10 @@ AreaCord = {
|
|
862
964
|
"グリッドサーチ法(5点)[気象庁データ]"
|
863
965
|
when "/"
|
864
966
|
"不明又は未設定"
|
865
|
-
|
967
|
+
when "5".."9"
|
866
968
|
"未定義"
|
969
|
+
else
|
970
|
+
raise Error, "電文の形式が不正です(震源の深さの確からしさ[気象庁の部内システムでの利用])"
|
867
971
|
end
|
868
972
|
end
|
869
973
|
|
@@ -876,14 +980,23 @@ AreaCord = {
|
|
876
980
|
"海域"
|
877
981
|
when "/"
|
878
982
|
"不明又は未設定"
|
879
|
-
|
983
|
+
when "2".."9"
|
880
984
|
"未定義"
|
985
|
+
else
|
986
|
+
raise Error, "電文の形式が不正です(震央位置の海陸判定)"
|
881
987
|
end
|
882
988
|
end
|
883
989
|
|
884
990
|
# 警報を含む内容であればtrue、そうでなければfalse
|
885
991
|
def warning?
|
886
|
-
@fastcast[122]
|
992
|
+
case @fastcast[122]
|
993
|
+
when "0", "/", "2".."9"
|
994
|
+
false
|
995
|
+
when "1"
|
996
|
+
true
|
997
|
+
else
|
998
|
+
raise Error, "電文の形式が不正です(警報の判別)"
|
999
|
+
end
|
887
1000
|
end
|
888
1001
|
|
889
1002
|
# 最大予測震度の変化
|
@@ -895,8 +1008,12 @@ AreaCord = {
|
|
895
1008
|
"最大予測震度が1.0以上大きくなった"
|
896
1009
|
when "2"
|
897
1010
|
"最大予測震度が1.0以上小さくなった"
|
898
|
-
|
1011
|
+
when "3".."9"
|
899
1012
|
"未定義"
|
1013
|
+
when "/"
|
1014
|
+
"不明又は未設定"
|
1015
|
+
else
|
1016
|
+
raise Error, "電文の形式が不正です(最大予測震度の変化)"
|
900
1017
|
end
|
901
1018
|
end
|
902
1019
|
|
@@ -915,13 +1032,15 @@ AreaCord = {
|
|
915
1032
|
"震源の深さが変化したため"
|
916
1033
|
when "/"
|
917
1034
|
"不明又は未設定"
|
918
|
-
|
1035
|
+
when "5".."9"
|
919
1036
|
"未定義"
|
1037
|
+
else
|
1038
|
+
raise Error, "電文の形式が不正です(最大予測震度の変化の理由)"
|
920
1039
|
end
|
921
1040
|
end
|
922
1041
|
|
923
1042
|
# 地域毎の警報の判別、最大予測震度及び主要動到達予測時刻
|
924
|
-
# EBIがあればHashを格納したArray
|
1043
|
+
# EBIがあればHashを格納したArrayを、なければ空のArrayを返します。Hashに格納されるkeyとvalueはそれぞれ次のようになっています。
|
925
1044
|
# :area_name 地域名称
|
926
1045
|
# :intensity 最大予測震度
|
927
1046
|
# :arrival_time 予想到達時刻のTimeオブジェクト。既に到達している場合はnil
|
@@ -934,6 +1053,7 @@ AreaCord = {
|
|
934
1053
|
while i + 20 < @fastcast.size
|
935
1054
|
local = {}
|
936
1055
|
local[:area_name] = AreaCord[@fastcast[i, 3].to_i] # 地域名称
|
1056
|
+
raise Error, "電文の形式が不正でです(地域名称[EBI])" unless local[:area_name]
|
937
1057
|
if @fastcast[i+7, 2] == "//"
|
938
1058
|
local[:intensity] = "#{to_seismic_intensity(@fastcast[i+5, 2])}以上" # 最大予測震度
|
939
1059
|
elsif @fastcast[i+5, 2] == @fastcast[i+7, 2]
|
@@ -951,16 +1071,20 @@ AreaCord = {
|
|
951
1071
|
local[:warning] = false # 警報を含むかどうか
|
952
1072
|
when "1"
|
953
1073
|
local[:warning] = true
|
954
|
-
|
1074
|
+
when "/", "2".."9"
|
955
1075
|
local[:warning] = nil
|
1076
|
+
else
|
1077
|
+
raise Error, "電文の形式が不正でです(警報の判別[EBI])"
|
956
1078
|
end
|
957
1079
|
case @fastcast[i+18]
|
958
1080
|
when "0"
|
959
1081
|
local[:arrival] = false # 既に到達しているかどうか
|
960
1082
|
when "1"
|
961
1083
|
local[:arrival] = true
|
962
|
-
|
1084
|
+
when "/", "2".."9"
|
963
1085
|
local[:arrival] = nil
|
1086
|
+
else
|
1087
|
+
raise Error, "電文の形式が不正でです(主要動の到達予測状況[EBI])"
|
964
1088
|
end
|
965
1089
|
data << local
|
966
1090
|
i += 20
|
@@ -970,7 +1094,7 @@ AreaCord = {
|
|
970
1094
|
end
|
971
1095
|
|
972
1096
|
if __FILE__ == $PROGRAM_NAME # テスト
|
973
|
-
str = <<EOS #テスト用の電文
|
1097
|
+
str = <<EOS #テスト用の電文
|
974
1098
|
37 03 00 110415233453 C11
|
975
1099
|
110415233416
|
976
1100
|
ND20110415233435 NCN005 JD////////////// JN///
|
@@ -983,10 +1107,13 @@ EBI 251 S6+6- ////// 11 300 S5+5- ////// 11 250 S5+5- ////// 11
|
|
983
1107
|
330 S0403 233454 00 222 S0403 233455 00
|
984
1108
|
9999=
|
985
1109
|
EOS
|
986
|
-
|
987
|
-
fc = EEWParser.new(str)
|
988
|
-
|
989
|
-
|
1110
|
+
|
1111
|
+
fc = EEWParser.new(str)
|
1112
|
+
p fc
|
1113
|
+
p fc.fastcast
|
1114
|
+
p fc.to_hash
|
1115
|
+
|
1116
|
+
puts <<FC
|
990
1117
|
電文種別コード: #{fc.type}
|
991
1118
|
発信官署: #{fc.from}
|
992
1119
|
訓練等の識別符: #{fc.drill_type}
|
@@ -1010,10 +1137,10 @@ puts <<FC
|
|
1010
1137
|
震央位置の海陸判定: #{fc.land_or_sea}
|
1011
1138
|
警報を含む内容かどうか: #{fc.warning?}
|
1012
1139
|
最大予測震度の変化: #{fc.change}
|
1013
|
-
最大予測震度の変化の理由: #{fc.
|
1140
|
+
最大予測震度の変化の理由: #{fc.reason_of_change}
|
1014
1141
|
FC
|
1015
|
-
fc.ebi.each do |local|
|
1016
|
-
|
1017
|
-
|
1018
|
-
end
|
1142
|
+
fc.ebi.each do |local|
|
1143
|
+
puts "地域コード: #{local[:area_cord]} 最大予測震度: #{local[:intensity]} 予想到達時刻: #{local[:arrival_time]}"
|
1144
|
+
puts "警報を含むかどうか: #{local[:warning]} 既に到達しているかどうか: #{local[:arrival]}"
|
1145
|
+
end
|
1019
1146
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eew_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-04-25 00:00:00.
|
13
|
-
default_executable:
|
12
|
+
date: 2011-04-25 00:00:00.000000000Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: shoulda
|
17
|
-
requirement: &
|
16
|
+
requirement: &10071040 !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
20
19
|
- - ! '>='
|
@@ -22,10 +21,10 @@ dependencies:
|
|
22
21
|
version: '0'
|
23
22
|
type: :development
|
24
23
|
prerelease: false
|
25
|
-
version_requirements: *
|
24
|
+
version_requirements: *10071040
|
26
25
|
- !ruby/object:Gem::Dependency
|
27
26
|
name: bundler
|
28
|
-
requirement: &
|
27
|
+
requirement: &10070560 !ruby/object:Gem::Requirement
|
29
28
|
none: false
|
30
29
|
requirements:
|
31
30
|
- - ~>
|
@@ -33,10 +32,10 @@ dependencies:
|
|
33
32
|
version: 1.0.0
|
34
33
|
type: :development
|
35
34
|
prerelease: false
|
36
|
-
version_requirements: *
|
35
|
+
version_requirements: *10070560
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
37
|
name: jeweler
|
39
|
-
requirement: &
|
38
|
+
requirement: &10070080 !ruby/object:Gem::Requirement
|
40
39
|
none: false
|
41
40
|
requirements:
|
42
41
|
- - ~>
|
@@ -44,10 +43,10 @@ dependencies:
|
|
44
43
|
version: 1.5.2
|
45
44
|
type: :development
|
46
45
|
prerelease: false
|
47
|
-
version_requirements: *
|
46
|
+
version_requirements: *10070080
|
48
47
|
- !ruby/object:Gem::Dependency
|
49
48
|
name: rcov
|
50
|
-
requirement: &
|
49
|
+
requirement: &10069600 !ruby/object:Gem::Requirement
|
51
50
|
none: false
|
52
51
|
requirements:
|
53
52
|
- - ! '>='
|
@@ -55,7 +54,7 @@ dependencies:
|
|
55
54
|
version: '0'
|
56
55
|
type: :development
|
57
56
|
prerelease: false
|
58
|
-
version_requirements: *
|
57
|
+
version_requirements: *10069600
|
59
58
|
description: parser for Earthquake Early Warning
|
60
59
|
email: glass.saga@gmail.com
|
61
60
|
executables: []
|
@@ -72,7 +71,6 @@ files:
|
|
72
71
|
- VERSION
|
73
72
|
- eew_parser.gemspec
|
74
73
|
- lib/eew_parser.rb
|
75
|
-
has_rdoc: true
|
76
74
|
homepage: http://github.com/Glasssaga/eew_parser
|
77
75
|
licenses:
|
78
76
|
- NYSL Version 0.9982
|
@@ -86,9 +84,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
86
84
|
- - ! '>='
|
87
85
|
- !ruby/object:Gem::Version
|
88
86
|
version: '0'
|
89
|
-
segments:
|
90
|
-
- 0
|
91
|
-
hash: -4382551266260180307
|
92
87
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
88
|
none: false
|
94
89
|
requirements:
|
@@ -97,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
92
|
version: '0'
|
98
93
|
requirements: []
|
99
94
|
rubyforge_project:
|
100
|
-
rubygems_version: 1.
|
95
|
+
rubygems_version: 1.8.3
|
101
96
|
signing_key:
|
102
97
|
specification_version: 3
|
103
98
|
summary: parser for Earthquake Early Warning
|