when_exe 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (144) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.ja.txt +8 -21
  3. data/LICENSE.txt +5 -27
  4. data/README.md +25 -79
  5. data/bin/.pryrc +9 -0
  6. data/bin/make_ttl.rb +3 -2
  7. data/bin/make_ttl.rb.config +3 -3
  8. data/lib/when_exe.rb +101 -5
  9. data/lib/when_exe/basictypes.rb +47 -16
  10. data/lib/when_exe/calendarnote.rb +27 -18
  11. data/lib/when_exe/calendartypes.rb +12 -50
  12. data/lib/when_exe/coordinates.rb +37 -391
  13. data/lib/when_exe/ephemeris.rb +53 -14
  14. data/lib/when_exe/ephemeris/eclipse.rb +8 -8
  15. data/lib/when_exe/ephemeris/moon.rb +333 -333
  16. data/lib/when_exe/ephemeris/notes.rb +29 -17
  17. data/lib/when_exe/ephemeris/phase_table.rb +825 -0
  18. data/lib/when_exe/ephemeris/term_table.rb +603 -0
  19. data/lib/when_exe/events.rb +1888 -0
  20. data/lib/when_exe/google_api.rb +26 -31
  21. data/lib/when_exe/icalendar.rb +129 -12
  22. data/lib/when_exe/inspect.rb +5 -5
  23. data/lib/when_exe/linkeddata.rb +43 -23
  24. data/lib/when_exe/locales/akt.rb +63 -0
  25. data/lib/when_exe/locales/encoding_conversion.rb +134 -134
  26. data/lib/when_exe/locales/iast.rb +90 -90
  27. data/lib/when_exe/locales/locale.rb +88 -18
  28. data/lib/when_exe/locales/transliteration_table.rb +62 -62
  29. data/lib/when_exe/mini_application.rb +14 -8
  30. data/lib/when_exe/namespace.rb +42 -0
  31. data/lib/when_exe/parts/enumerator.rb +16 -5
  32. data/lib/when_exe/parts/geometric_complex.rb +52 -2
  33. data/lib/when_exe/parts/method_cash.rb +229 -224
  34. data/lib/when_exe/parts/resource.rb +65 -35
  35. data/lib/when_exe/parts/timezone.rb +25 -34
  36. data/lib/when_exe/region/balinese.rb +5 -3
  37. data/lib/when_exe/region/chinese.rb +39 -11
  38. data/lib/when_exe/region/chinese/calendars.rb +1016 -1016
  39. data/lib/when_exe/region/chinese/epochs.rb +7 -7
  40. data/lib/when_exe/region/chinese/notes.rb +3 -3
  41. data/lib/when_exe/region/chinese/twins.rb +134 -11
  42. data/lib/when_exe/region/dee.rb +4 -4
  43. data/lib/when_exe/region/discordian.rb +1 -1
  44. data/lib/when_exe/region/geologicalage.rb +139 -128
  45. data/lib/when_exe/region/hanke_henry.rb +4 -4
  46. data/lib/when_exe/region/indian.rb +77 -8
  47. data/lib/when_exe/region/international_fixed.rb +3 -3
  48. data/lib/when_exe/region/islamic.rb +1 -1
  49. data/lib/when_exe/region/japanese.rb +12 -8
  50. data/lib/when_exe/region/japanese/calendars.rb +397 -397
  51. data/lib/when_exe/region/japanese/eclipses.rb +1194 -1194
  52. data/lib/when_exe/region/japanese/epochs.rb +8 -4
  53. data/lib/when_exe/region/japanese/location.rb +93 -0
  54. data/lib/when_exe/region/japanese/nihon_shoki.rb +70 -70
  55. data/lib/when_exe/region/japanese/notes.rb +57 -18
  56. data/lib/when_exe/region/japanese/residues.rb +33 -11
  57. data/lib/when_exe/region/japanese/twins.rb +27 -14
  58. data/lib/when_exe/region/japanese/weeks.rb +7 -7
  59. data/lib/when_exe/region/korean.rb +384 -384
  60. data/lib/when_exe/region/location.rb +40 -0
  61. data/lib/when_exe/region/martian.rb +1 -1
  62. data/lib/when_exe/region/mayan.rb +2 -2
  63. data/lib/when_exe/region/roman.rb +2 -2
  64. data/lib/when_exe/region/ryukyu.rb +101 -101
  65. data/lib/when_exe/region/saudi_arabian.rb +57 -0
  66. data/lib/when_exe/region/shire.rb +1 -1
  67. data/lib/when_exe/region/world.rb +3 -3
  68. data/lib/when_exe/region/zoroastrian.rb +1 -1
  69. data/lib/when_exe/spatial.rb +611 -0
  70. data/lib/when_exe/timestandard.rb +9 -7
  71. data/lib/when_exe/tmobjects.rb +34 -2
  72. data/lib/when_exe/tmposition.rb +225 -1322
  73. data/lib/when_exe/tmptypes.rb +1279 -0
  74. data/lib/when_exe/tmreference.rb +42 -7
  75. data/lib/when_exe/version.rb +3 -3
  76. data/test/events/example-datasets +6 -0
  77. data/test/events/history-dataset.csv +22 -0
  78. data/test/events/japanese-holiday-index.csv +28 -0
  79. data/test/events/japanese-holiday.csv +94 -0
  80. data/test/events/japanese-holiday.ttl +948 -0
  81. data/test/events/make_events_ttl.rb +18 -0
  82. data/test/events/mori_wikichoshi.csv +14 -0
  83. data/test/events/ndl_koyomi.csv +220 -0
  84. data/test/events/ndl_koyomi_index.csv +44 -0
  85. data/test/events/primeminister-dataset.csv +19 -0
  86. data/test/events/shogun-dataset.csv +22 -0
  87. data/test/events/test-history-dataset-edge-sparql.csv +26 -0
  88. data/test/events/test-history-dataset-edge.csv +27 -0
  89. data/test/events/test-history-dataset-sparql.csv +22 -0
  90. data/test/events/test-history-dataset.csv +23 -0
  91. data/test/events/test-history-events-edge.ttl +89 -0
  92. data/test/events/test-history-events.csv +6 -0
  93. data/test/examples/JapanHolidays.ics +2 -2
  94. data/test/examples/JapanHolidaysRFC6350.ics +3 -3
  95. data/test/examples/Residue.m17n +2 -2
  96. data/test/examples/Spatial.m17n +3 -3
  97. data/test/examples/Terms.m17n +3 -3
  98. data/test/scripts/8.ext.rb +6 -6
  99. data/test/scripts/8.rb +6 -6
  100. data/test/scripts/geometric_complex.rb +41 -41
  101. data/test/scripts/korea.rb +59 -59
  102. data/test/scripts/thai.rb +36 -36
  103. data/test/test.rb +6 -0
  104. data/test/test/basictypes.rb +431 -431
  105. data/test/test/calendarnote.rb +86 -86
  106. data/test/test/calendartypes.rb +97 -97
  107. data/test/test/coordinates.rb +399 -397
  108. data/test/test/ephemeris.rb +115 -115
  109. data/test/test/ephemeris/moon.rb +14 -14
  110. data/test/test/ephemeris/planets.rb +14 -14
  111. data/test/test/ephemeris/sun.rb +14 -14
  112. data/test/test/events.rb +32 -0
  113. data/test/test/google_api.rb +45 -32
  114. data/test/test/inspect.rb +153 -153
  115. data/test/test/parts.rb +488 -488
  116. data/test/test/region/armenian.rb +20 -20
  117. data/test/test/region/bahai.rb +58 -58
  118. data/test/test/region/balinese.rb +34 -34
  119. data/test/test/region/chinese.rb +229 -229
  120. data/test/test/region/christian.rb +226 -226
  121. data/test/test/region/coptic.rb +27 -27
  122. data/test/test/region/discordian.rb +20 -20
  123. data/test/test/region/french.rb +33 -33
  124. data/test/test/region/geologicalage.rb +17 -17
  125. data/test/test/region/indian.rb +14 -1
  126. data/test/test/region/iran.rb +54 -54
  127. data/test/test/region/islamic.rb +64 -54
  128. data/test/test/region/japanese.rb +281 -261
  129. data/test/test/region/jewish.rb +63 -63
  130. data/test/test/region/m17n.rb +21 -21
  131. data/test/test/region/mayan.rb +17 -16
  132. data/test/test/region/reforms.rb +2 -2
  133. data/test/test/region/residue.rb +7 -7
  134. data/test/test/region/shire.rb +58 -58
  135. data/test/test/region/swedish.rb +45 -45
  136. data/test/test/region/thai.rb +116 -116
  137. data/test/test/region/tibetan.rb +30 -30
  138. data/test/test/region/vietnamese.rb +102 -102
  139. data/test/test/region/zoroastrian.rb +58 -58
  140. data/test/test/timestandard.rb +81 -81
  141. data/test/test/tmobjects.rb +402 -402
  142. data/test/test/tmposition.rb +66 -4
  143. data/test/test/tmreference.rb +157 -157
  144. metadata +36 -93
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2015 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license
6
+ described in the LICENSE.txt file included in this archive.
7
+ =end
8
+
9
+ module When::Coordinates
10
+
11
+ LocationTable = [
12
+
13
+ # 0 : Resource Pool
14
+ {},
15
+
16
+ # 1 : Fine Area Coordinates
17
+ {},
18
+
19
+ # 2 : Middle Area Coordinates
20
+ Hash.new {|h,k|
21
+ h[k] = {}
22
+ },
23
+
24
+ # 3 : Wide Area Coordinates
25
+ Hash.new {|h1,k1|
26
+ h1[k1] = Hash.new {|h2,k2|
27
+ h2[k2] = {}
28
+ }
29
+ },
30
+
31
+ # 4 : Alias Pool
32
+ Hash.new {|h,k|
33
+ h[k] = []
34
+ }
35
+ ]
36
+
37
+ end
38
+
39
+ require 'when_exe/region/japanese/location'
40
+
@@ -104,7 +104,7 @@ module When
104
104
  # オブジェクトの正規化
105
105
  def _normalize(args=[], options={})
106
106
  @location = When.Resource(@location || '_l:long=0&lat=0&datum=Mars')
107
- @mtc0 = MTC0 + @location.long / (360.0 * When::Coordinates::Spatial::DEGREE)
107
+ @mtc0 = MTC0 + @location.long / (360.0 * @location.degree)
108
108
  super
109
109
  end
110
110
  end
@@ -24,7 +24,7 @@ module When
24
24
 
25
25
  [Residue,
26
26
  "label:[Haab', ハアブ, Haab]", "divisor:365", 'day:#{Haab:300}', "format:[%2$d%1$s/365=]",
27
- "namespace:[glyph=http://en.wikipedia.org/wiki/File:]",
27
+ "namespace:[glyph=https://en.wikipedia.org/wiki/File:]",
28
28
  [Residue, "label:[Pop =glyph:Maya-Pop.jpg, ポプ, Pop ]", "remainder: 0"],
29
29
  [Residue, "label:[Wo' =glyph:Maya-Dresden-wo.jpg, ウオ, Wo ]", "remainder: 20"],
30
30
  [Residue, "label:[Sip =glyph:Maya-Dresden-sip.jpg, シプ, Sip ]", "remainder: 40"],
@@ -54,7 +54,7 @@ module When
54
54
  ],
55
55
 
56
56
  [Residue,
57
- "namespace:[glyph=http://en.wikipedia.org/wiki/File:MAYA-g-log-cal-]",
57
+ "namespace:[glyph=https://en.wikipedia.org/wiki/File:MAYA-g-log-cal-]",
58
58
  "label:[Tzolk'in, ツォルキン, Tzolkin]", "divisor:20", 'day:#{Tzolkin:4}', "format:[%s(%d/20)=]",
59
59
  [Residue, "label:[Imix' =glyph:D01-Imix.png, イミシュ, Imix =glyph:D01-Imix-cdxW.png ]", "remainder: 0"],
60
60
  [Residue, "label:[Ik' =glyph:D02-Ik.png, イック, Ik =glyph:D02-Ik-cdxW.png ]", "remainder: 1"],
@@ -96,7 +96,7 @@ module When
96
96
 
97
97
  class TM::CalendarEra
98
98
 
99
- # From http://en.wikipedia.org/wiki/Julian_calendar#Sacrobosco.27s_theory_on_month_lengths
99
+ # From https://en.wikipedia.org/wiki/Julian_calendar#Sacrobosco.27s_theory_on_month_lengths
100
100
  Julians = [self, [
101
101
  "locale:[=en:, ja=ja:, zh=zh:, alias]",
102
102
  "period:[Roman=en:Roman_calendar, ローマ暦, 羅馬曆]",
@@ -124,7 +124,7 @@ module When
124
124
 
125
125
  module CalendarTypes
126
126
 
127
- # From http://en.wikipedia.org/wiki/Julian_calendar#Sacrobosco.27s_theory_on_month_lengths
127
+ # From https://en.wikipedia.org/wiki/Julian_calendar#Sacrobosco.27s_theory_on_month_lengths
128
128
  _Index0 = When::Coordinates::DefaultDayIndex
129
129
  _IndicesB12 = [When.Index('Roman::MonthB', {:unit=>12}), _Index0]
130
130
  _Indices12 = [When.Index('Roman::Month', {:unit=>12}), _Index0]
@@ -1,101 +1,101 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2013-2014 Takashi SUGA
4
-
5
- You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
- =end
7
-
8
- require 'when_exe/region/japanese/calendars'
9
- require 'when_exe/region/chinese/calendars'
10
-
11
- #
12
- # 琉球王位一覧表
13
- #
14
- # (参考文献)
15
- # 沖縄県の歴史(山川出版社)巻末年表など
16
- # 沖縄の歴史と文化(中公新書)
17
- # コンサイス世界年表(三省堂)
18
- #
19
- module When
20
- class TM::CalendarEra
21
-
22
- #
23
- # 琉球王朝
24
- #
25
- Ryukyu = [{'V'=>{'Japanese'=>{'T'=>'Japanese?note=Chinese'},
26
- 'Chinese' =>{'T'=>'Chinese1645' }}}, self, [
27
- "locale:[=ja:, en=en:, alias]",
28
- 'area:[琉球#{?V=V}=ja:%%<琉球王国>,Ryukyu#{?V=V}=en:Ryukyu_Kingdom]',
29
- [self,
30
- "period:[舜天王統]", # 嗣 ~ 没 or 譲位
31
- ["[<舜天>]1", "@F", "name=[舜天];1187^Chinese0956"], # 文治 3~嘉禎 3(1237) 72歳
32
- ["[<舜馬順熙>=ja:%%<舜馬順煕>]1", "@A", "name=[舜馬順熙=ja:%%<舜馬順煕>];1238"], # 嘉禎 4~宝治 2(1248) 64歳
33
- ["[<義本>]1", "@A", "name=[義本];1249" , "1259"] # 宝治 3~正嘉 3(1259) 英祖に譲位
34
- ],
35
- [self,
36
- "period:[英祖王統]",
37
- ["[<英祖>=ja:%%<英祖_(琉球国王)>]0", "@F", "name=[英祖=ja:%%<英祖_(琉球国王)>];1259^Chinese0939"], # 正元 2~正安 元(1299) 8 5 71歳
38
- ["[<大成>=ja:%%<大成_(琉球国王)>]0", "@A", "name=[大成=ja:%%<大成_(琉球国王)>];1299-08-05"], # 正安 2~延慶 元(1308) 12 8 62歳
39
- ["[<英慈>]0", "@A", "name=[英慈];1308-12-08"], # 延慶 2~正和 2(1313) 9 20 46歳
40
- ["[<玉城>=ja:%%<玉城_(琉球国王)>]0", "@A", "name=[玉城=ja:%%<玉城_(琉球国王)>];1313-09-20"], # 正和 3~延元 元(1336) 3 11 41歳
41
- ["[<西威>]0", "@A", "name=[西威];1336-03-11", "1349-04-13"] # 延元 2~貞和 5(1349) 4 13 22歳
42
- ],
43
- [self,
44
- "period:[中山王国]",
45
- ["[<察度>]0", "@A", "name=[察度];1349-04-13^Chinese0939"], # 貞和 6~応永 2(1395) 10 5 75歳
46
- ["[<武寧>]0", "@A", "name=[武寧];1395-10-05", "1406"] # 応永 3~応永 13(1406) 尚巴志が滅ぼす
47
- ],
48
- [self,
49
- "period:[山北王国]",
50
- ["[<怕尼芝>]1", "@A", "name=[怕尼芝];1322^Chinese0939"], # 1383年初めて明に朝貢
51
- ["[<珉>=ja:%%<ミン_(琉球国王)>]0", "@A", "name=[珉=ja:%%<ミン_(琉球国王)>];1395"],
52
- ["[<攀安知>]0", "@A", "name=[攀安知];1400", "1416="] # 永楽元年(1403)衣冠束帯を乞う 尚巴志が滅ぼす
53
- ],
54
- [self,
55
- "period:[山南王国]",
56
- ["[<承察度>]1", "@A", "name=[承察度];1337^Chinese0939"], # 1380年初めて明に朝貢
57
- ["[<汪英紫>]1", "@A", "name=[汪英紫];1388"],
58
- ["[<汪応祖>]0", "@A", "name=[汪応祖];1402"], # 承察度の従弟 明永楽2年(1404)冊封
59
- ["[<他魯毎>]0", "@A", "name=[他魯毎];1413", "1429="] # 汪応祖の子 永楽14年(1416)冊封 尚巴志が滅ぼす
60
- ],
61
- [self,
62
- "period:[第一尚氏]",
63
- ["[<尚思紹王>]1", "@F", "name=[尚思紹王];1406^Chinese0939"], # 応永 13~応永 28(1421)
64
- ["[<尚巴志王>]0", "@A", "name=[尚巴志王];1421"], # 応永 29~永享 11(1439) 4 20 68歳
65
- ["[<尚忠王>]0", "@A", "name=[尚忠王];1439-04-20"], # 永享 12~文安 元(1444) 10 24 54歳
66
- ["[<尚思達王>]0", "@A", "name=[尚思達王];1444-10-24"], # 文安 2~宝徳 元(1449) 10 13 42歳
67
- ["[<尚金福王>]0", "@A", "name=[尚金福王];1449-10-13"], # 宝徳 2~享徳 2(1453) 4 18 56歳, 『中山世譜』で4月29日から訂正
68
- ["[<尚泰久王>]0", "@A", "name=[尚泰久王];1453-04-29"], # 享徳 3~長禄 4(1460) 6 5 46歳
69
- ["[<尚徳王>]0", "@A", "name=[尚徳王];1460-06-05","1469-04-23"] # 寛正 2~応仁 3(1469) 4 22 29歳 4-23は丙子
70
- ],
71
- [self,
72
- "period:[第二尚氏]",
73
- ["[<尚円王>]0", "@F", "name=[尚円王];1469-04-23^Chinese0939"], # 文明 2~文明 8(1476) 7 28 62歳
74
- ["[<尚宣威王>]0", "@A", "name=[尚宣威王];1476-07-28"], # 文明 9~同年 (1477) 8 4 48歳 戊戌 没
75
- ["[<尚真王>]1", "@A", "name=[尚真王];1477-02"], # 文明 9~大永 6(1526) 12 11 62歳 己未
76
- # 1447-02 は『琉球国中山世鑑』
77
- # http://dl.ndl.go.jp/info:ndljp/pid/1217404/43
78
- ["[<尚清王>]0", "@A", "name=[尚清王];1526-12-11"], # 大永 7~天文 24(1555) 6 25 59歳
79
- ["[<尚元王>]0", "@A", "name=[尚元王];1555-06-25"], # 弘治 2~元亀 3(1572) 4 1 45歳
80
- ["[<尚永王>]0", "@A", "name=[尚永王];1572-04-01"], # 天正 元~天正 16(1588) 11 25 30歳
81
- ["[<尚寧王>]0", "@A", "name=[尚寧王];1588-11-25", # 天正 17~元和 6(1620) 9 19 57歳
82
- '1609-04-05^#{T:Chinese1645}', ""], # 慶長 14(1609) 4 5 尚寧、島津と和議
83
- # (デフォルトは中国暦日)
84
- ["[<尚豊王>]0", "@A", "name=[尚豊王];1620-09-19"], # 元和 7~寛永 17(1640) 5 4 51歳 甲申
85
- ["[<尚賢王>]0", "@A", "name=[尚賢王];1640-05-{甲申}"], # 寛永 18~正保 4(1647) 9 22 23歳
86
- ["[<尚質王>]0", "@A", "name=[尚質王];1647-09-22"], # 慶安 元~寛文 8(1668) 11 17 40歳
87
- ["[<尚貞王>]0", "@A", "name=[尚貞王];1668-11-17"], # 寛文 9~宝永 6(1709) 7 13 65歳
88
- ["[<尚益王>]0", "@A", "name=[尚益王];1709-07-13"], # 宝永 7~正徳 2(1712) 7 15 35歳
89
- ["[<尚敬王>]0", "@A", "name=[尚敬王];1712-07-15"], # 正徳 3~寛延 4(1751) 1 29 52歳
90
- ["[<尚穆王>]0", "@A", "name=[尚穆王];1751-01-29"], # 宝暦 2~寛政 6(1794) 4 8 56歳
91
- ["[<尚温王>]0", "@A", "name=[尚温王];1794-04-08"], # 寛政 7~享和 2(1802) 7 11 19歳
92
- ["[<尚成王>]0", "@A", "name=[尚成王];1802-07-11"], # 享和 3~同年 (1803) 12 26 4歳
93
- ["[<尚灝王>=ja:%%<尚コウ王>]0", "@A", "name=[尚灝王=ja:%%<尚コウ王>];1803-12-26"], # 文化 元~文政 10(1827) 出家
94
- ["[<尚育摂位>=ja:%%<尚育王>]0", "", "name=[尚育王];1827-03-08"], # 文政 11(1828) 摂位, 『沖縄県の歴史』で月日を追記
95
- ["[<尚育王>]7", "@A", "name=[尚育王];1834-05-29"], # 天保 6~弘化 4(1847) 9 17 35歳
96
- ["[<尚泰王>]0", "@A", "name=[尚泰王];1847-09-17", # 弘化 5~明治 12(1879) 3 31 琉球処分
97
- "1873-01-01^Gregorian", "1879-03-31="] # 明治 34(1901) 8 19 59歳 没
98
- ]
99
- ]]
100
- end
101
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2013-2014 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ require 'when_exe/region/japanese/calendars'
9
+ require 'when_exe/region/chinese/calendars'
10
+
11
+ #
12
+ # 琉球王位一覧表
13
+ #
14
+ # (参考文献)
15
+ # 沖縄県の歴史(山川出版社)巻末年表など
16
+ # 沖縄の歴史と文化(中公新書)
17
+ # コンサイス世界年表(三省堂)
18
+ #
19
+ module When
20
+ class TM::CalendarEra
21
+
22
+ #
23
+ # 琉球王朝
24
+ #
25
+ Ryukyu = [{'V'=>{'Japanese'=>{'T'=>'Japanese?note=Chinese'},
26
+ 'Chinese' =>{'T'=>'Chinese1645' }}}, self, [
27
+ "locale:[=ja:, en=en:, alias]",
28
+ 'area:[琉球#{?V=V}=ja:%%<琉球王国>,Ryukyu#{?V=V}=en:Ryukyu_Kingdom]',
29
+ [self,
30
+ "period:[舜天王統]", # 嗣 ~ 没 or 譲位
31
+ ["[<舜天>]1", "@F", "name=[舜天];1187^Chinese0956"], # 文治 3~嘉禎 3(1237) 72歳
32
+ ["[<舜馬順熙>=ja:%%<舜馬順煕>]1", "@A", "name=[舜馬順熙=ja:%%<舜馬順煕>];1238"], # 嘉禎 4~宝治 2(1248) 64歳
33
+ ["[<義本>]1", "@A", "name=[義本];1249" , "1259"] # 宝治 3~正嘉 3(1259) 英祖に譲位
34
+ ],
35
+ [self,
36
+ "period:[英祖王統]",
37
+ ["[<英祖>=ja:%%<英祖_(琉球国王)>]0", "@F", "name=[英祖=ja:%%<英祖_(琉球国王)>];1259^Chinese0939"], # 正元 2~正安 元(1299) 8 5 71歳
38
+ ["[<大成>=ja:%%<大成_(琉球国王)>]0", "@A", "name=[大成=ja:%%<大成_(琉球国王)>];1299-08-05"], # 正安 2~延慶 元(1308) 12 8 62歳
39
+ ["[<英慈>]0", "@A", "name=[英慈];1308-12-08"], # 延慶 2~正和 2(1313) 9 20 46歳
40
+ ["[<玉城>=ja:%%<玉城_(琉球国王)>]0", "@A", "name=[玉城=ja:%%<玉城_(琉球国王)>];1313-09-20"], # 正和 3~延元 元(1336) 3 11 41歳
41
+ ["[<西威>]0", "@A", "name=[西威];1336-03-11", "1349-04-13"] # 延元 2~貞和 5(1349) 4 13 22歳
42
+ ],
43
+ [self,
44
+ "period:[中山王国]",
45
+ ["[<察度>]0", "@A", "name=[察度];1349-04-13^Chinese0939"], # 貞和 6~応永 2(1395) 10 5 75歳
46
+ ["[<武寧>]0", "@A", "name=[武寧];1395-10-05", "1406"] # 応永 3~応永 13(1406) 尚巴志が滅ぼす
47
+ ],
48
+ [self,
49
+ "period:[山北王国]",
50
+ ["[<怕尼芝>]1", "@A", "name=[怕尼芝];1322^Chinese0939"], # 1383年初めて明に朝貢
51
+ ["[<珉>=ja:%%<ミン_(琉球国王)>]0", "@A", "name=[珉=ja:%%<ミン_(琉球国王)>];1395"],
52
+ ["[<攀安知>]0", "@A", "name=[攀安知];1400", "1416="] # 永楽元年(1403)衣冠束帯を乞う 尚巴志が滅ぼす
53
+ ],
54
+ [self,
55
+ "period:[山南王国]",
56
+ ["[<承察度>]1", "@A", "name=[承察度];1337^Chinese0939"], # 1380年初めて明に朝貢
57
+ ["[<汪英紫>]1", "@A", "name=[汪英紫];1388"],
58
+ ["[<汪応祖>]0", "@A", "name=[汪応祖];1402"], # 承察度の従弟 明永楽2年(1404)冊封
59
+ ["[<他魯毎>]0", "@A", "name=[他魯毎];1413", "1429="] # 汪応祖の子 永楽14年(1416)冊封 尚巴志が滅ぼす
60
+ ],
61
+ [self,
62
+ "period:[第一尚氏]",
63
+ ["[<尚思紹王>]1", "@F", "name=[尚思紹王];1406^Chinese0939"], # 応永 13~応永 28(1421)
64
+ ["[<尚巴志王>]0", "@A", "name=[尚巴志王];1421"], # 応永 29~永享 11(1439) 4 20 68歳
65
+ ["[<尚忠王>]0", "@A", "name=[尚忠王];1439-04-20"], # 永享 12~文安 元(1444) 10 24 54歳
66
+ ["[<尚思達王>]0", "@A", "name=[尚思達王];1444-10-24"], # 文安 2~宝徳 元(1449) 10 13 42歳
67
+ ["[<尚金福王>]0", "@A", "name=[尚金福王];1449-10-13"], # 宝徳 2~享徳 2(1453) 4 18 56歳, 『中山世譜』で4月29日から訂正
68
+ ["[<尚泰久王>]0", "@A", "name=[尚泰久王];1453-04-29"], # 享徳 3~長禄 4(1460) 6 5 46歳
69
+ ["[<尚徳王>]0", "@A", "name=[尚徳王];1460-06-05","1469-04-23"] # 寛正 2~応仁 3(1469) 4 22 29歳 4-23は丙子
70
+ ],
71
+ [self,
72
+ "period:[第二尚氏]",
73
+ ["[<尚円王>]0", "@F", "name=[尚円王];1469-04-23^Chinese0939"], # 文明 2~文明 8(1476) 7 28 62歳
74
+ ["[<尚宣威王>]0", "@A", "name=[尚宣威王];1476-07-28"], # 文明 9~同年 (1477) 8 4 48歳 戊戌 没
75
+ ["[<尚真王>]1", "@A", "name=[尚真王];1477-02"], # 文明 9~大永 6(1526) 12 11 62歳 己未
76
+ # 1447-02 は『琉球国中山世鑑』
77
+ # http://dl.ndl.go.jp/info:ndljp/pid/1217404/43
78
+ ["[<尚清王>]0", "@A", "name=[尚清王];1526-12-11"], # 大永 7~天文 24(1555) 6 25 59歳
79
+ ["[<尚元王>]0", "@A", "name=[尚元王];1555-06-25"], # 弘治 2~元亀 3(1572) 4 1 45歳
80
+ ["[<尚永王>]0", "@A", "name=[尚永王];1572-04-01"], # 天正 元~天正 16(1588) 11 25 30歳
81
+ ["[<尚寧王>]0", "@A", "name=[尚寧王];1588-11-25", # 天正 17~元和 6(1620) 9 19 57歳
82
+ '1609-04-05^#{T:Chinese1645}', ""], # 慶長 14(1609) 4 5 尚寧、島津と和議
83
+ # (デフォルトは中国暦日)
84
+ ["[<尚豊王>]0", "@A", "name=[尚豊王];1620-09-19"], # 元和 7~寛永 17(1640) 5 4 51歳 甲申
85
+ ["[<尚賢王>]0", "@A", "name=[尚賢王];1640-05-{1甲申}"], # 寛永 18~正保 4(1647) 9 22 23歳
86
+ ["[<尚質王>]0", "@A", "name=[尚質王];1647-09-22"], # 慶安 元~寛文 8(1668) 11 17 40歳
87
+ ["[<尚貞王>]0", "@A", "name=[尚貞王];1668-11-17"], # 寛文 9~宝永 6(1709) 7 13 65歳
88
+ ["[<尚益王>]0", "@A", "name=[尚益王];1709-07-13"], # 宝永 7~正徳 2(1712) 7 15 35歳
89
+ ["[<尚敬王>]0", "@A", "name=[尚敬王];1712-07-15"], # 正徳 3~寛延 4(1751) 1 29 52歳
90
+ ["[<尚穆王>]0", "@A", "name=[尚穆王];1751-01-29"], # 宝暦 2~寛政 6(1794) 4 8 56歳
91
+ ["[<尚温王>]0", "@A", "name=[尚温王];1794-04-08"], # 寛政 7~享和 2(1802) 7 11 19歳
92
+ ["[<尚成王>]0", "@A", "name=[尚成王];1802-07-11"], # 享和 3~同年 (1803) 12 26 4歳
93
+ ["[<尚灝王>=ja:%%<尚コウ王>]0", "@A", "name=[尚灝王=ja:%%<尚コウ王>];1803-12-26"], # 文化 元~文政 10(1827) 出家
94
+ ["[<尚育摂位>=ja:%%<尚育王>]0", "", "name=[尚育王];1827-03-08"], # 文政 11(1828) 摂位, 『沖縄県の歴史』で月日を追記
95
+ ["[<尚育王>]7", "@A", "name=[尚育王];1834-05-29"], # 天保 6~弘化 4(1847) 9 17 35歳
96
+ ["[<尚泰王>]0", "@A", "name=[尚泰王];1847-09-17", # 弘化 5~明治 12(1879) 3 31 琉球処分
97
+ "1873-01-01^Gregorian", "1879-03-31="] # 明治 34(1901) 8 19 59歳 没
98
+ ]
99
+ ]]
100
+ end
101
+ end
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2017 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ module When
9
+ class BasicTypes::M17n
10
+
11
+ SaudiArabia = [self, [
12
+ "locale:[=en:, ja=ja:, zh=zh:, alias]",
13
+ "names:[SaudiArabia=en:Saudi_Arabia, サウジアラビア, 沙特阿拉伯]",
14
+ "[UmmalquraSolar=http://www.staff.science.uu.nl/~gent0113/islam/ummalqura_solar.htm, サウジアラビア太陽暦=, 沙特阿拉伯太陽曆, era:AH=]",
15
+
16
+ [self,
17
+ "locale:[=en:, ja=ja:, alias=en:]",
18
+ "names:[month name named after the zodiac=, 黄道十二宮にちなむ月名=, zh:對應於黃道十二宮月份名稱=, *alias:SolarMonth=]",
19
+ "[al-Mīzān=, 天秤宮, Libra ]",
20
+ "[al-ʿAqrab=, 天蝎宮, Scorpio ]",
21
+ "[al-Qaws=, 人馬宮, Sagittarius]",
22
+ "[al-Jady=, 磨羯宮, Capricorn ]",
23
+ "[al-Dalw=, 宝瓶宮, Aquarius ]",
24
+ "[al-Ḥūt=, 双魚宮, Pisces ]",
25
+ "[al-Ḥamal=, 白羊宮, Aries ]",
26
+ "[al-Thawr=, 金牛宮, Taurus ]",
27
+ "[al-Jawzāʾ=, 双児宮, Gemini ]",
28
+ "[al-Saraṭān=, 巨蟹宮, Cancer ]",
29
+ "[al-Asad=, 獅子宮, Leo ]",
30
+ "[al-Sunbula=, 処女宮, Virgo ]"
31
+ ],
32
+
33
+ ]]
34
+ end
35
+
36
+ module CalendarTypes
37
+
38
+ #
39
+ # Ummalqura Solar Calendar
40
+ #
41
+ UmmalquraSolar = [SolarYearTableBased, {
42
+ 'label' => 'SaudiArabia::UmmalquraSolar',
43
+ 'origin_of_MSC' => -621,
44
+ 'diff_to_CE' => 0,
45
+ 'engine_month' => 9,
46
+ 'engine_day' => 23,
47
+ 'indices' => [
48
+ When.Index('SaudiArabia::SolarMonth', {:unit=>12}),
49
+ When::Coordinates::DefaultDayIndex
50
+ ],
51
+ 'rule_table' => {
52
+ 365 => {'Length'=> [30]*5 + [29] + [31]*6},
53
+ 366 => {'Length'=> [30]*6 + [31]*6}
54
+ }
55
+ }]
56
+ end
57
+ end
@@ -9,7 +9,7 @@ module When
9
9
  class BasicTypes::M17n
10
10
 
11
11
  Shire = [self, [
12
- "namespace:[cal=http://en.wikipedia.org/wiki/Middle-earth_calendar#]",
12
+ "namespace:[cal=https://en.wikipedia.org/wiki/Middle-earth_calendar#]",
13
13
  "locale:[=en:, ja=ja:, zh=zh:, alias]",
14
14
  "names:[Middle-earth=en:Middle-earth_calendar#Shire_calendar, ホビット庄暦=ja:%%<指輪物語>, 中土曆=zh:%%<魔戒>, *alias:Shire]",
15
15
 
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2011-2015 Takashi SUGA
3
+ Copyright (C) 2011-2021 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -161,8 +161,8 @@ module When
161
161
  World = [SolarYearTableBased, {
162
162
  'label' => 'World',
163
163
  'rule_table' => {
164
- 365 => {'Length'=>[31,30,30]*3 + [31,30,31]},
165
- 366 => {'Length'=>[31,30,30,31,30,31] *2}
164
+ 365 => {'Length'=>[31,30,30] * 3 + [31,30,31]},
165
+ 366 => {'Length'=>[31,30,30,31,30,31] * 2}
166
166
  },
167
167
  'note' => 'WorldWeek'
168
168
  }]
@@ -9,7 +9,7 @@
9
9
 
10
10
  References
11
11
 
12
- (1) http://en.wikipedia.org/wiki/Zoroastrian_calendar
12
+ (1) https://en.wikipedia.org/wiki/Zoroastrian_calendar
13
13
  (2) http://www.moonwise.co.uk/year/1375zoroastrian.htm
14
14
  (3) http://www.zoroastrian.org/articles/nowruz.htm
15
15
 
@@ -0,0 +1,611 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2016 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ #
9
+ # 座標の記述に用いる諸オブジェクト
10
+ #
11
+ module When::Coordinates
12
+
13
+ #
14
+ # 空間位置
15
+ #
16
+ class Spatial < When::BasicTypes::Object
17
+
18
+ LabelProperty = 'label'
19
+
20
+ include When::Ephemeris
21
+
22
+ require 'when_exe/ephemeris/eclipse'
23
+
24
+ class << self
25
+ # When::Coordinates::Spatial のグローバルな設定を行う
26
+ #
27
+ # @param [When::Coordinates::Spatial, String] location デフォルトの空間位置を使用する場合、指定する
28
+ #
29
+ # @return [void]
30
+ #
31
+ # @note
32
+ # 本メソッドでマルチスレッド対応の管理変数の初期化を行っている。
33
+ # このため、本メソッド自体はスレッドセーフでない。
34
+ #
35
+ def _setup_(location=nil)
36
+ @_lock_ = Mutex.new if When.multi_thread
37
+ @_pool = {}
38
+ @default_location = location
39
+ end
40
+
41
+ # デフォルトの空間位置
42
+ #
43
+ # @param [When::Coordinates::Spatial, String] local デフォルトの空間位置
44
+ #
45
+ # @return [When::Coordinates::Spatial, String]
46
+ #
47
+ # @note
48
+ # @default_locationは、原則、ライブラリ立ち上げ時に _setup_ で初期化する。
49
+ # 以降、@default_locationに代入を行っても、すでに生成した When::TM::TemporalPosition 等には反映されない。
50
+ #
51
+ def default_location=(local)
52
+ if @_pool
53
+ @default_location = local
54
+ else
55
+ _setup_(local)
56
+ end
57
+ end
58
+
59
+ # 設定情報を取得する
60
+ #
61
+ # @return [Hash] 設定情報
62
+ #
63
+ def _setup_info
64
+ {:location => @default_location}
65
+ end
66
+
67
+ # デフォルトの空間位置を読みだす
68
+ #
69
+ # @return [When::Coordinates::Spatial]
70
+ #
71
+ def default_location
72
+ _default_location[1]
73
+ end
74
+
75
+ # デフォルトの空間位置が When::TM::Clock のローカルタイムから生成されたか?
76
+ #
77
+ # @return [true, false]
78
+ #
79
+ def is_default_location_derived?
80
+ location = _default_location
81
+ location[0] && location[1]
82
+ end
83
+
84
+ private
85
+
86
+ # 共通処理
87
+ def _default_location
88
+ case @default_location
89
+ when nil ;
90
+ when Array ; return @default_location unless @default_location[0]
91
+ when String ; return (@default_location = [false, When.Resource(@default_location)])
92
+ else ; return (@default_location = [false, @default_location])
93
+ end
94
+ timezone = When::TM::Clock.local_time
95
+ location = timezone.location if timezone.kind_of?(When::Parts::Timezone)
96
+ return [true, location]
97
+ end
98
+ end
99
+
100
+ # @private
101
+ HashProperty = [:label, :longitude, :latitude, [:altitude, 0.0], [:datum, When::Ephemeris::Earth], :ref]
102
+
103
+ # Degree / Internal Location Unit(16")
104
+ #
105
+ # (3600 を 2 の因数で割りつくした値を単位とする)
106
+ DEGREE = 225
107
+
108
+ # 黄道座標 (ecliptic coordinate system)
109
+ ECLIPTIC = 0
110
+
111
+ # 赤道座標 (equatorial coordinate system)
112
+ EQUATORIAL = 1
113
+
114
+ # 赤道座標[時角] (equatorial coordinate system with hour angle)
115
+ EQUATORIAL_HA = 2
116
+
117
+ # 地平座標 (horizontal coordinate system)
118
+ HORIZONTAL = 3
119
+
120
+ # 惑星中心の高度
121
+ CENTER = :center
122
+
123
+ # 角度の単位 (1 => 1度, 225=> 1/225 度)
124
+ #
125
+ # @return [Numeric]
126
+ #
127
+ attr_reader :degree
128
+
129
+ # 北緯を正とする緯度 / 16秒
130
+ #
131
+ # @return [Numeric]
132
+ #
133
+ attr_reader :lat
134
+
135
+ # 東経を正とする経度 / 16秒
136
+ #
137
+ # @return [Numeric]
138
+ #
139
+ attr_reader :long
140
+
141
+ # 高度 / m
142
+ #
143
+ # @return [Numeric]
144
+ # @return [:Center] 天体の中心の場合
145
+ #
146
+ attr_reader :alt
147
+ alias :altitude :alt
148
+
149
+ # 座標系
150
+ #
151
+ # @return [When::Ephemeris::Datum]
152
+ #
153
+ attr_reader :datum
154
+
155
+ # 参照
156
+ #
157
+ # @return [String] URI
158
+ #
159
+ attr_reader :ref
160
+
161
+ # 時間帯(オプショナル)
162
+ #
163
+ # @return [TZInfo::CountryTimezone]
164
+ #
165
+ # TZInfoライブラリから経緯度を取得して使用する
166
+ #
167
+ attr_reader :tz
168
+
169
+ # 緯度文字列
170
+ #
171
+ # @param [Integer] round 秒の小数点以下最大桁数
172
+ #
173
+ # @return [String] 緯度文字列(DD.MMSSsss[NS])
174
+ #
175
+ def lat_s(round=6)
176
+ When::Coordinates.to_dms(lat / @degree, 'NS', round)
177
+ end
178
+ alias :latitude :lat_s
179
+
180
+ # 経度文字列
181
+ #
182
+ # @param [Integer] round 秒の小数点以下最大桁数
183
+ #
184
+ # @return [String] 経度文字列(DDD.MMSSsss[EW])
185
+ #
186
+ def long_s(round=6)
187
+ When::Coordinates.to_dms(long / @degree, 'EW', round)
188
+ end
189
+ alias :longitude :long_s
190
+
191
+ # 高度 / m
192
+ #
193
+ # @return [Numeric]
194
+ # @return [:Center] 天体の中心の場合
195
+ #
196
+ attr_reader :alt
197
+
198
+ # 観測地の地心距離 / kmを返します。
199
+ #
200
+ # @return [Numeric]
201
+ #
202
+ def obserber_distance
203
+ l = PI / (90 * @degree) * @lat
204
+ @datum.surface_radius * (@datum.shape[0]+@datum.shape[1]*cos(l)+@datum.shape[2]*cos(2*l))
205
+ end
206
+
207
+ # 観測地での‘大地’の視半径
208
+ #
209
+ # @return [Numeric]
210
+ #
211
+ def horizon
212
+ # 地面以下なら 90度とみなす
213
+ return 0.25 if @alt == :Center || @alt <= 0
214
+
215
+ # 観測地の地心距離 / m
216
+ r = obserber_distance * 1000.0
217
+
218
+ # 大気効果
219
+ air_effect = @datum.air[1] * @alt / (@datum.air[2] * @alt + r)
220
+
221
+ # ‘大地’の視半径
222
+ asin((1.0+air_effect) * r / (r+@alt)) / CIRCLE
223
+ end
224
+
225
+ # 観測地の地方恒星時 / 時を返します。
226
+ #
227
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
228
+ # @param [When::TM::TemporalPosition] t
229
+ #
230
+ # @return [Numeric]
231
+ #
232
+ def local_sidereal_time(t)
233
+ t = +t
234
+ c = julian_century_from_2000(t)
235
+ result = @datum.sid[0] + c * (@datum.sid[1] + c * @datum.sid[2]) + @long / (15.0 * @degree)
236
+ result += (cosc(obl(c)) * delta_p(c) +
237
+ (t-When::TimeStandard.delta_t_observed(t)/86400+0.5) % 1) * 24 if @datum.kind_of?(Earth)
238
+ result
239
+ end
240
+
241
+ # 観測地の日心三次元座標(黄道座標)
242
+ #
243
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
244
+ # @param [When::TM::TemporalPosition] t
245
+ #
246
+ # @return [Numeric]
247
+ #
248
+ def _coords(t)
249
+ t = +t
250
+ @datum._coords(t) + _coords_diff(t)
251
+ end
252
+
253
+ private
254
+
255
+ # 要素の正規化
256
+ def _normalize(args=[], options={})
257
+
258
+ # 角度の単位は 1/225 度
259
+ @degree ||= DEGREE
260
+
261
+ # 同一視
262
+ @long ||= @longitude
263
+ @lat ||= @latitude
264
+ @alt ||= @altitude
265
+
266
+ # 時間帯による指定
267
+ @tz = When::Parts::Timezone.tz_info[@tz] if @tz.kind_of?(String)
268
+ if @tz
269
+ @label ||= When.m17n(@tz.identifier)
270
+ @long ||= @tz.longitude
271
+ @lat ||= @tz.latitude
272
+ end
273
+
274
+ # データの整形
275
+ @label = When::BasicTypes::M17n.new(@label) if @label.kind_of?(Hash)
276
+ @long = When::Coordinates.to_deg_225(@long, 'EW', @degree) if @long
277
+ @lat = When::Coordinates.to_deg_225(@lat, 'NS', @degree) if @lat
278
+ @datum = When.Resource(@datum || 'Earth', '_ep:')
279
+ @long ||= 0.0
280
+ @lat ||= 0.0
281
+ @alt =
282
+ case @alt
283
+ when String ; @alt.gsub(/@/, '.').to_f
284
+ when Numeric ; @alt.to_f
285
+ when Symbol ; @alt
286
+ else ; 0.0
287
+ end
288
+
289
+ # 日月食用作業変数
290
+ @mean = When.Resource(@mean || '_ep:Formula?formula=1L')
291
+ @ecls = {}
292
+
293
+ end
294
+
295
+ # 観測地の惑星中心を原点とする三次元座標
296
+ #
297
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
298
+ # @param [When::TM::TemporalPosition] t
299
+ # @param [Integer] system : 座標系
300
+ # [ ECLIPTIC = 黄道座標 ]
301
+ # [ EQUATORIAL = 赤道座標 ]
302
+ # [ EQUATORIAL_HA = 赤道座標[時角] ]
303
+ # [ HORIZONTAL = 地平座標 ]
304
+ #
305
+ # @return [When::Coordinates::Spatial]
306
+ #
307
+ def _coords_diff(t, system=ECLIPTIC)
308
+ return Coords.polar(0,0,0) if alt == :Center
309
+ t = +t
310
+ lat = @lat.to_f / @degree
311
+ coords = Coords.polar(
312
+ local_sidereal_time(t) / 24.0,
313
+ (lat + @datum.shape[3] * sind(2*lat)) / 360.0,
314
+ (obserber_distance + @alt/1000.0) / AU)
315
+ case system
316
+ when ECLIPTIC ; coords.r_to_y(t, @datum)
317
+ when EQUATORIAL ; coords
318
+ when EQUATORIAL_HA ; coords.r_to_rh(t, self)
319
+ when HORIZONTAL ; coords.r_to_h(t, self)
320
+ end
321
+ end
322
+
323
+ # その他のメソッド
324
+ # When::Coordinates::Spatial で定義されていないメソッドは
325
+ # 処理を @datum (type: When::Ephemeris::Datum) に委譲する
326
+ #
327
+ def method_missing(name, *args, &block)
328
+ self.class.module_eval %Q{
329
+ def #{name}(*args, &block)
330
+ @datum.send("#{name}", *args, &block)
331
+ end
332
+ } unless When::Parts::MethodCash.escape(name)
333
+ @datum.send(name, *args, &block)
334
+ end
335
+
336
+ # @private
337
+ module Normalize
338
+
339
+ private
340
+
341
+ # 位置情報
342
+ #
343
+ # @return [When::Coordinates::Spatial]
344
+ #
345
+ #attr_reader :location
346
+
347
+ # 日時要素の境界オブジェクト
348
+ #
349
+ # @return [When::Coordinates::Border]
350
+ #
351
+ #attr_reader :border
352
+
353
+ # 境界計算用の計算オブジェクト
354
+ #
355
+ # @return [When::Ephemeris::Formula]
356
+ #
357
+ #attr_reader :formula
358
+
359
+ #
360
+ # Temporal Module の Spatial Parts の初期化
361
+ #
362
+ def _normalize_spatial
363
+
364
+ # Location
365
+ if (@location||@long||@lat||@alt).kind_of?(String)
366
+ @location ||= "_l:long=#{@long||0}&lat=#{@lat||0}&alt=#{@alt||0}"
367
+ @location = When.Resource(@location)
368
+ end
369
+ @location ||= @tz_prop.location if @tz_prop
370
+
371
+ # Border
372
+ @border = When.Border(@border) if @border.kind_of?(String)
373
+
374
+ # Formula
375
+ instance_eval('class << self; attr_reader :formula; end') if @location && @border
376
+ if respond_to?(:formula)
377
+ extend When::Ephemeris::Formula::ForwardedFormula
378
+ unless @formula
379
+ options = {:formula => kind_of?(When::CalendarTypes::SolarYearTableBased) ? '1S' : '1L'}
380
+ options[:location] = @location if @location
381
+ @formula = When::Ephemeris::Formula.new(options)
382
+ end
383
+ @formula = When.Resource(Array(@formula), '_ep:')
384
+ end
385
+ end
386
+ end
387
+
388
+ #
389
+ # イベント管理用範囲オブジェクト
390
+ #
391
+ class Range
392
+
393
+ class << self
394
+
395
+ # 地名を空間座標化する
396
+ #
397
+ # @param [String] name 地名または座標
398
+ #
399
+ # @return [When::Coordinates::Spatial] or [When::Coordinates::Spatial::Range]
400
+ #
401
+ def [](name)
402
+ source = name.strip
403
+ case source
404
+ when /\A(.+)\.\.(.+)\z/ ; return self.new(_instance($1), _instance($2))
405
+ when /\A([\d.]+)([SN])([\d.]+)([WE])([-+\d.]+)?\z/i ; lat, sn, long, we, alt = $~[1..5]
406
+ when /\A([\d.]+)([WE])([\d.]+)([SN])([-+\d.]+)?\z/i,
407
+ /\A([-+\d.]+)(_)([-+\d.]+)(_)?([-+\d.]+)?\z/ ; long, we, lat, sn, alt = $~[1..5]
408
+ end
409
+ locations =
410
+ if long
411
+ [[
412
+ When::Coordinates.to_deg_225("#{long}#{we}", 'EW', 1),
413
+ When::Coordinates.to_deg_225("#{lat }#{sn}", 'NS', 1),
414
+ (alt || 0).to_f
415
+ ]]
416
+ else
417
+ t = When::Coordinates::LocationTable
418
+ keys = [source]
419
+ keys.concat(name.names.values) if name.kind_of?(When::BasicTypes::M17n)
420
+ keys_to_location(keys, t)
421
+ end
422
+ return locations unless locations.kind_of?(Array)
423
+ locations = locations.map {|location|
424
+ When::Coordinates::Spatial.new({'long'=>location[0], 'lat'=>location[1], 'alt'=>location[2], 'degree'=>1})
425
+ }
426
+ locations = locations.size > 1 ? self.new(*locations) : locations.first
427
+ if t
428
+ keys.each do |key|
429
+ t[0][key] = locations
430
+ end
431
+ end
432
+ locations
433
+ end
434
+ alias :_instance :[]
435
+
436
+ # 地名に空間座標を設定する
437
+ #
438
+ # @param [String] name 地名または座標
439
+ # @param [When::Coordinates::Spatial or When::Coordinates::Spatial::Range] locations 空間座標
440
+ #
441
+ def []=(name, locations)
442
+ keys = [source]
443
+ keys.concat(name.names.values) if name.kind_of?(When::BasicTypes::M17n)
444
+ keys.each do |key|
445
+ When::Coordinates::LocationTable[0][key] = locations
446
+ end
447
+ end
448
+
449
+ private
450
+
451
+ Index = {nil=>0, 'N'=>0, 'S'=>-1}
452
+
453
+ def keys_to_location(keys, t)
454
+ keys.each do |key|
455
+ /\A(.+?)([\dNS])?\z/ =~ key
456
+ key = t[4][$1][Index[$2] || ($2.to_i-1)] if t[4].key?($1)
457
+ if t[0].key?(key)
458
+ return t[0][key]
459
+ elsif t[1].key?(key)
460
+ return [t[1][key]]
461
+ elsif t[2].key?(key)
462
+ return [t[2][key][:SWB], t[2][key][:NET]]
463
+ elsif t[3].key?(key)
464
+ return [t[3][key][:SWB], t[3][key][:NET]]
465
+ end
466
+ end
467
+ raise ArgumentError, keys.first + ' not found'
468
+ end
469
+ end
470
+
471
+ # 西南下の境界
472
+ #
473
+ # @return [When::Coordinates::Spatial]
474
+ #
475
+ attr_reader :first
476
+
477
+ # 西の境界
478
+ #
479
+ # @return [Numeric]
480
+ #
481
+ attr_reader :west
482
+
483
+ # 南の境界
484
+ #
485
+ # @return [Numeric]
486
+ #
487
+ attr_reader :south
488
+
489
+ # 下の境界
490
+ #
491
+ # @return [Numeric]
492
+ #
493
+ attr_reader :bottom
494
+
495
+ # 東北上の境界
496
+ #
497
+ # @return [When::Coordinates::Spatial]
498
+ #
499
+ attr_reader :last
500
+
501
+ # 東の境界
502
+ #
503
+ # @return [Numeric]
504
+ #
505
+ attr_reader :east
506
+
507
+ # 北の境界
508
+ #
509
+ # @return [Numeric]
510
+ #
511
+ attr_reader :north
512
+
513
+ # 上の境界
514
+ #
515
+ # @return [Numeric]
516
+ #
517
+ attr_reader :top
518
+
519
+ # 東西の範囲
520
+ #
521
+ # @return [::Range]
522
+ #
523
+ attr_reader :long
524
+
525
+ # 南北の範囲
526
+ #
527
+ # @return [::Range]
528
+ #
529
+ attr_reader :lat
530
+
531
+ # 上下の範囲
532
+ #
533
+ # @return [::Range]
534
+ #
535
+ attr_reader :alt
536
+
537
+ # 範囲の重なりの判断が複雑になるか?(ダミー)
538
+ #
539
+ # @return [Boolean] false - 単純
540
+ #
541
+ def is_complex?
542
+ false
543
+ end
544
+
545
+ # 終端を除外するか?(ダミー)
546
+ #
547
+ # @return [Boolean] false - 除外しない
548
+ #
549
+ def exclude_end?
550
+ false
551
+ end
552
+
553
+ # 指定オブジェクトが範囲内か?
554
+ #
555
+ # @param [Object] target 判定するオブジェクト
556
+ #
557
+ # @return [Boolean] true - 範囲内のオブジェクトあり, false - 範囲内のオブジェクトなし
558
+ #
559
+ def include?(target)
560
+ case target
561
+ when When::Coordinates::Spatial
562
+ @long.include?(target.long) && @lat.include?(target.lat) && @alt.include?(target.alt)
563
+ when Range
564
+ @long.include?(target.west) && @lat.include?(target.south) && @alt.include?(target.bottom) &&
565
+ @long.include?(target.east) && @lat.include?(target.north) && @alt.include?(target.top)
566
+ else
567
+ false
568
+ end
569
+ end
570
+
571
+ #
572
+ # 範囲の重なりの判断
573
+ #
574
+ # @param [Range] range 確認対象の単純範囲オブジェクト
575
+ #
576
+ # @return [Boolean] true - 重なる, false - 重ならない
577
+ #
578
+ def is_overlaped?(range)
579
+ case target
580
+ when When::Coordinates::Spatial
581
+ @long.include?(target.long) && @lat.include?(target.lat) && @alt.include?(target.alt)
582
+ when Range
583
+ @west >= target.east && @north >= target.south && @top >= target.bottom &&
584
+ @east <= target.west && @south <= target.north && @bottom <= target.top
585
+ else
586
+ false
587
+ end
588
+ end
589
+
590
+ #
591
+ # イベント管理用範囲オブジェクトの生成
592
+ #
593
+ # @param [When::Coordinates::Spatial] first 南西下の境界
594
+ # @param [When::Coordinates::Spatial] last 東北上の境界
595
+ #
596
+ def initialize(first, last)
597
+ @first = first.kind_of?(Range) ? first.first : first
598
+ @last = last.kind_of?(Range) ? last.last : last
599
+ @west = @first.long
600
+ @south = @first.lat
601
+ @bottom = @first.alt
602
+ @east = @last.long
603
+ @north = @last.lat
604
+ @top = @last.alt
605
+ @long = ::Range.new(@west, @east, false)
606
+ @lat = ::Range.new(@south, @north, false)
607
+ @alt = ::Range.new(@bottom, @top, false)
608
+ end
609
+ end
610
+ end
611
+ end