tranzito_utils 1.2.1 → 1.3.0
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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9200b266283acc5bca16516873cfa19fd2df8f3da6ebdf3c00678224f797ff5
|
4
|
+
data.tar.gz: 3bb4b8c641003c58dbca7925b82fce1e9e9d536a8127bf545587de01a11611a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3bab2fe8fa1c67a8fe1aaee70d8ff6737ab22429cd9392012cf403ee7f519ac8ec18569e54ee335a4a7a16d1976fcebe7e1d733cbb0098e66b5085aa29b4bc9
|
7
|
+
data.tar.gz: 6586213cd8e7dabfcf5eb483c41ec57167eacca52e51d5d5de1d54d4b3b5730eb2908e64f54b5dee68e80c1ff3f593c2564fe56159f23afe2be5436c7559298e
|
@@ -0,0 +1,85 @@
|
|
1
|
+
class SolarPositionCalculator
|
2
|
+
LATITUDE_RANGE = (-90..90)
|
3
|
+
LONGITUDE_RANGE = (-180..180)
|
4
|
+
|
5
|
+
attr_reader :latitude, :longitude, :timezone
|
6
|
+
|
7
|
+
def initialize(latitude, longitude, timezone)
|
8
|
+
validate_latitude(latitude)
|
9
|
+
validate_longitude(longitude)
|
10
|
+
@latitude = latitude
|
11
|
+
@longitude = longitude
|
12
|
+
@timezone = timezone
|
13
|
+
end
|
14
|
+
|
15
|
+
def sunrise_time(date)
|
16
|
+
calculate_sun_time(date, :sunrise)
|
17
|
+
end
|
18
|
+
|
19
|
+
def sunset_time(date)
|
20
|
+
calculate_sun_time(date, :sunset)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def calculate_sun_time(date, type)
|
26
|
+
validate_date(date)
|
27
|
+
utc_time = calculate_utc_time(date, type)
|
28
|
+
utc_to_timezone(date, utc_time)
|
29
|
+
end
|
30
|
+
|
31
|
+
def calculate_utc_time(date, type)
|
32
|
+
time = Time.new(date.year, date.month, date.day, 12, 0, 0, timezone)
|
33
|
+
gamma = calculate_gamma(time)
|
34
|
+
eqtime = calculate_eqtime(gamma)
|
35
|
+
|
36
|
+
decl = calculate_decl(gamma)
|
37
|
+
ha = calculate_ha(decl)
|
38
|
+
calculate_sun_time_utc(ha, eqtime, type)
|
39
|
+
end
|
40
|
+
|
41
|
+
def calculate_sun_time_utc(ha, eqtime, type)
|
42
|
+
if type == :sunrise
|
43
|
+
720 - 4 * (longitude + ha * 180 / Math::PI) - eqtime
|
44
|
+
else
|
45
|
+
720 - 4 * (longitude - ha * 180 / Math::PI) - eqtime
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def calculate_gamma(time)
|
50
|
+
2 * Math::PI / (leap_year?(time.year) ? 366 : 365) * (time.yday - 1 + (time.hour - 12) / 24.0)
|
51
|
+
end
|
52
|
+
|
53
|
+
def calculate_eqtime(gamma)
|
54
|
+
229.18 * (0.000075 + 0.001868 * Math.cos(gamma) - 0.032077 * Math.sin(gamma) - 0.014615 * Math.cos(2 * gamma) - 0.040849 * Math.sin(2 * gamma))
|
55
|
+
end
|
56
|
+
|
57
|
+
def calculate_decl(gamma)
|
58
|
+
0.006918 - 0.399912 * Math.cos(gamma) + 0.070257 * Math.sin(gamma) - 0.006758 * Math.cos(2 * gamma) + 0.000907 * Math.sin(2 * gamma) - 0.002697 * Math.cos(3 * gamma) + 0.00148 * Math.sin(3 * gamma)
|
59
|
+
end
|
60
|
+
|
61
|
+
def calculate_ha(decl)
|
62
|
+
Math.acos(Math.cos(Math::PI / 180 * 90.833) / (Math.cos(Math::PI / 180 * latitude) * Math.cos(decl)) - Math.tan(Math::PI / 180 * latitude) * Math.tan(decl))
|
63
|
+
end
|
64
|
+
|
65
|
+
def utc_to_timezone(date, utc_time)
|
66
|
+
response = Time.parse("#{date} #{Time.at(utc_time * 60).utc.strftime("%H:%M:%S")}") + timezone * 3600
|
67
|
+
response.strftime("%H:%M:%S")
|
68
|
+
end
|
69
|
+
|
70
|
+
def leap_year?(year)
|
71
|
+
year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
|
72
|
+
end
|
73
|
+
|
74
|
+
def validate_latitude(latitude)
|
75
|
+
raise ArgumentError, "Latitude should be between -90 and 90 degrees" unless LATITUDE_RANGE.include?(latitude)
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_longitude(longitude)
|
79
|
+
raise ArgumentError, "Longitude should be between -180 and 180 degrees" unless LONGITUDE_RANGE.include?(longitude)
|
80
|
+
end
|
81
|
+
|
82
|
+
def validate_date(date)
|
83
|
+
raise ArgumentError, "Invalid date" unless date.is_a?(Date)
|
84
|
+
end
|
85
|
+
end
|
data/lib/tranzito_utils.rb
CHANGED
@@ -21,4 +21,5 @@ require "tranzito_utils/helpers/sortable_helper"
|
|
21
21
|
require "tranzito_utils/helpers/helpers"
|
22
22
|
require "tranzito_utils/services/time_parser"
|
23
23
|
require "tranzito_utils/services/normalize"
|
24
|
+
require "tranzito_utils/services/solar_position_calculator"
|
24
25
|
require "tranzito_utils/gem"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tranzito_utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- willbarrettdev
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2023-
|
13
|
+
date: 2023-06-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/tranzito_utils/helpers/helpers.rb
|
113
113
|
- lib/tranzito_utils/helpers/sortable_helper.rb
|
114
114
|
- lib/tranzito_utils/services/normalize.rb
|
115
|
+
- lib/tranzito_utils/services/solar_position_calculator.rb
|
115
116
|
- lib/tranzito_utils/services/time_parser.rb
|
116
117
|
- lib/tranzito_utils/version.rb
|
117
118
|
homepage: https://github.com/Tranzito/tranzito_utils
|