knmi 0.1.4 → 0.2.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.
- data/.DS_Store +0 -0
- data/Gemfile +5 -4
- data/Gemfile.lock +22 -1
- data/README.rdoc +114 -101
- data/VERSION +1 -1
- data/data/current_stations.yml +1584 -0
- data/data/daily_data_key.yml +312 -0
- data/data/data_key.yml +491 -0
- data/data/hourly_data_key.yml +181 -0
- data/knmi.gemspec +34 -7
- data/lib/.DS_Store +0 -0
- data/lib/knmi.rb +67 -186
- data/lib/knmi/httpservice.rb +125 -0
- data/lib/knmi/parameters.rb +98 -0
- data/lib/knmi/station.rb +113 -0
- data/test/helper.rb +5 -2
- data/test/test_httpservice.rb +53 -0
- data/test/test_knmi.rb +144 -4
- data/test/test_parameters.rb +180 -0
- data/test/test_station.rb +102 -0
- metadata +74 -15
@@ -0,0 +1,181 @@
|
|
1
|
+
---
|
2
|
+
- parameter: YYYYMMDD
|
3
|
+
category:
|
4
|
+
description: Time Stamp
|
5
|
+
validate:
|
6
|
+
conversion: |-
|
7
|
+
Time.utc(
|
8
|
+
year = n.to_s[(0..3)],
|
9
|
+
month = n.to_s[(4..5)],
|
10
|
+
day = n.to_s[(6..7)]
|
11
|
+
)
|
12
|
+
units: Time
|
13
|
+
period: hourly
|
14
|
+
- parameter: HH
|
15
|
+
category:
|
16
|
+
description: Hour
|
17
|
+
validate: (1..24).include?(n)
|
18
|
+
conversion:
|
19
|
+
units: hour
|
20
|
+
period: hourly
|
21
|
+
- parameter: DD
|
22
|
+
category: WIND
|
23
|
+
description: Mean Wind Direction During the 10-Minute Period Preceding the Time of Observation
|
24
|
+
validate: (0..360).to_a.push(990).include?(n)
|
25
|
+
conversion:
|
26
|
+
units: Polar Coordinates (360=north, 90=east, 180=south, 270=west,0=calm, 990=variable)
|
27
|
+
period: hourly
|
28
|
+
- parameter: FH
|
29
|
+
category: WIND
|
30
|
+
description: Hourly Mean Wind Speed
|
31
|
+
validate: n.integer?
|
32
|
+
conversion: n / 10
|
33
|
+
units: m/s
|
34
|
+
period: hourly
|
35
|
+
- parameter: FF
|
36
|
+
category: WIND
|
37
|
+
description: Mean Wind Speed
|
38
|
+
validate: n.integer?
|
39
|
+
conversion: n / 10
|
40
|
+
units: m/s
|
41
|
+
period: hourly
|
42
|
+
- parameter: FX
|
43
|
+
category: WIND
|
44
|
+
description: Maximum Wind Gust
|
45
|
+
validate: n.integer?
|
46
|
+
conversion: n / 10
|
47
|
+
units: m/s
|
48
|
+
period: hourly
|
49
|
+
- parameter: T
|
50
|
+
category: TEMP
|
51
|
+
description: Air Temperature at 1.5 m
|
52
|
+
validate: n.integer?
|
53
|
+
conversion: n / 10
|
54
|
+
units: C
|
55
|
+
period: hourly
|
56
|
+
- parameter: T10N
|
57
|
+
category: TEMP
|
58
|
+
description: Minimum Air Temperature at 10 cm in the Preceding 6 Hours
|
59
|
+
validate: n.integer?
|
60
|
+
conversion: n / 10
|
61
|
+
units: C
|
62
|
+
period: hourly
|
63
|
+
- parameter: TD
|
64
|
+
category: TEMP
|
65
|
+
description: Dew Point Temperature
|
66
|
+
validate: n.integer?
|
67
|
+
conversion: n / 10
|
68
|
+
units: C
|
69
|
+
period: hourly
|
70
|
+
- parameter: SQ
|
71
|
+
category: RDTN
|
72
|
+
description: Sunshine Duration
|
73
|
+
validate: (-1..240).include?(n)
|
74
|
+
conversion: "n == -1 ? 0.05 : (n / 10) * 60"
|
75
|
+
units: minutes
|
76
|
+
period: hourly
|
77
|
+
- parameter: Q
|
78
|
+
category: RDTN
|
79
|
+
description: Golbal Radiation
|
80
|
+
validate: n.integer?
|
81
|
+
conversion:
|
82
|
+
units: J/cm^2
|
83
|
+
period: hourly
|
84
|
+
- parameter: DR
|
85
|
+
category: PRCP
|
86
|
+
description: Precipitation Duration
|
87
|
+
validate: (0..240).include?(n)
|
88
|
+
conversion: (n / 10) * 60
|
89
|
+
units: minutes
|
90
|
+
period: hourly
|
91
|
+
- parameter: RH
|
92
|
+
category: PRCP
|
93
|
+
description: Precipitation
|
94
|
+
validate: n.integer?
|
95
|
+
conversion: n / 10
|
96
|
+
units: mm
|
97
|
+
period: hourly
|
98
|
+
- parameter: P
|
99
|
+
category: ATMS
|
100
|
+
description: Air Pressure
|
101
|
+
validate: n.integer?
|
102
|
+
conversion: n / 10
|
103
|
+
units: hPa
|
104
|
+
period: hourly
|
105
|
+
- parameter: VV
|
106
|
+
category: VISB
|
107
|
+
description: Visibility
|
108
|
+
validate:
|
109
|
+
conversion: |-
|
110
|
+
if n == 0
|
111
|
+
'< 100 meters'
|
112
|
+
elsif (1..49).include?(n)
|
113
|
+
(n * 100).to_s + '-' + ((n+1) * 100).to_s + ' meters'
|
114
|
+
elsif n == 50
|
115
|
+
'5-6 kilometers'
|
116
|
+
elsif (56..79).include?(n)
|
117
|
+
(n - 50).to_s + '-' + (n - 49).to_s + ' kilometers'
|
118
|
+
elsif (80..88).include?(n)
|
119
|
+
(n - 50).to_s + '-' + (n - 45).to_s + ' kilometers'
|
120
|
+
elsif n == 89
|
121
|
+
'> 70 kilometers'
|
122
|
+
end
|
123
|
+
units:
|
124
|
+
period: hourly
|
125
|
+
- parameter: N
|
126
|
+
category: VISB
|
127
|
+
description: Cloud Cover
|
128
|
+
validate: (0..9).include?(n)
|
129
|
+
conversion:
|
130
|
+
units:
|
131
|
+
period: hourly
|
132
|
+
- parameter: U
|
133
|
+
category: ATMS
|
134
|
+
description: Relative Humidity
|
135
|
+
validate: (0..100).include?(n)
|
136
|
+
conversion:
|
137
|
+
units: %
|
138
|
+
period: hourly
|
139
|
+
- parameter: M
|
140
|
+
category: WTHR
|
141
|
+
description: Fog
|
142
|
+
validate: (0..1).include?(n)
|
143
|
+
conversion:
|
144
|
+
units: boolean
|
145
|
+
period: hourly
|
146
|
+
- parameter: R
|
147
|
+
category: WTHR
|
148
|
+
description: Rainfall
|
149
|
+
validate: (0..1).include?(n)
|
150
|
+
conversion:
|
151
|
+
units: boolean
|
152
|
+
period: hourly
|
153
|
+
- parameter: S
|
154
|
+
category: WTHR
|
155
|
+
description: Snow
|
156
|
+
validate: (0..1).include?(n)
|
157
|
+
conversion:
|
158
|
+
units: boolean
|
159
|
+
period: hourly
|
160
|
+
- parameter: O
|
161
|
+
category: WTHR
|
162
|
+
description: Thunder
|
163
|
+
validate: (0..1).include?(n)
|
164
|
+
conversion:
|
165
|
+
units: boolean
|
166
|
+
period: hourly
|
167
|
+
- parameter: Y
|
168
|
+
category: WTHR
|
169
|
+
description: Ice
|
170
|
+
validate: (0..1).include?(n)
|
171
|
+
conversion:
|
172
|
+
units: boolean
|
173
|
+
period: hourly
|
174
|
+
- parameter: WW
|
175
|
+
category: WTHR
|
176
|
+
description: Weather Code
|
177
|
+
validate: (0..99).include?(n)
|
178
|
+
conversion:
|
179
|
+
units: code
|
180
|
+
period: hourly
|
181
|
+
|
data/knmi.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{knmi}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["bullfight"]
|
12
|
-
s.date = %q{2011-05-
|
12
|
+
s.date = %q{2011-05-17}
|
13
13
|
s.description = %q{A set of methods to query the KNMI HTTP get form for daily climate data and select a variety of measured parameters, from available stations, in a json style array of hashes, and if necessary convert to csv.}
|
14
14
|
s.email = %q{p.schmitz@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
+
".DS_Store",
|
20
21
|
".document",
|
21
22
|
"Gemfile",
|
22
23
|
"Gemfile.lock",
|
@@ -24,10 +25,21 @@ Gem::Specification.new do |s|
|
|
24
25
|
"README.rdoc",
|
25
26
|
"Rakefile",
|
26
27
|
"VERSION",
|
28
|
+
"data/current_stations.yml",
|
29
|
+
"data/daily_data_key.yml",
|
30
|
+
"data/data_key.yml",
|
31
|
+
"data/hourly_data_key.yml",
|
27
32
|
"knmi.gemspec",
|
33
|
+
"lib/.DS_Store",
|
28
34
|
"lib/knmi.rb",
|
35
|
+
"lib/knmi/httpservice.rb",
|
36
|
+
"lib/knmi/parameters.rb",
|
37
|
+
"lib/knmi/station.rb",
|
29
38
|
"test/helper.rb",
|
30
|
-
"test/
|
39
|
+
"test/test_httpservice.rb",
|
40
|
+
"test/test_knmi.rb",
|
41
|
+
"test/test_parameters.rb",
|
42
|
+
"test/test_station.rb"
|
31
43
|
]
|
32
44
|
s.homepage = %q{http://github.com/bullfight/knmi}
|
33
45
|
s.licenses = ["MIT"]
|
@@ -36,30 +48,45 @@ Gem::Specification.new do |s|
|
|
36
48
|
s.summary = %q{Ruby API to access daily climate data from the Royal Netherlands Meteorological Institute}
|
37
49
|
s.test_files = [
|
38
50
|
"test/helper.rb",
|
39
|
-
"test/
|
51
|
+
"test/test_httpservice.rb",
|
52
|
+
"test/test_knmi.rb",
|
53
|
+
"test/test_parameters.rb",
|
54
|
+
"test/test_station.rb"
|
40
55
|
]
|
41
56
|
|
42
57
|
if s.respond_to? :specification_version then
|
43
58
|
s.specification_version = 3
|
44
59
|
|
45
60
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
|
-
s.
|
61
|
+
s.add_runtime_dependency(%q<httparty>, ["~> 0.7.7"])
|
62
|
+
s.add_runtime_dependency(%q<geokit>, ["~> 1.5.0"])
|
63
|
+
s.add_development_dependency(%q<shoulda>, ["~> 2.11.3"])
|
64
|
+
s.add_development_dependency(%q<shoulda-context>, ["~> 1.0.0.beta1"])
|
47
65
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
48
66
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
49
67
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
68
|
+
s.add_development_dependency(%q<pry>, ["~> 0.8.3"])
|
50
69
|
s.add_runtime_dependency(%q<httparty>, [">= 0.7.4"])
|
51
70
|
else
|
52
|
-
s.add_dependency(%q<
|
71
|
+
s.add_dependency(%q<httparty>, ["~> 0.7.7"])
|
72
|
+
s.add_dependency(%q<geokit>, ["~> 1.5.0"])
|
73
|
+
s.add_dependency(%q<shoulda>, ["~> 2.11.3"])
|
74
|
+
s.add_dependency(%q<shoulda-context>, ["~> 1.0.0.beta1"])
|
53
75
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
54
76
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
55
77
|
s.add_dependency(%q<rcov>, [">= 0"])
|
78
|
+
s.add_dependency(%q<pry>, ["~> 0.8.3"])
|
56
79
|
s.add_dependency(%q<httparty>, [">= 0.7.4"])
|
57
80
|
end
|
58
81
|
else
|
59
|
-
s.add_dependency(%q<
|
82
|
+
s.add_dependency(%q<httparty>, ["~> 0.7.7"])
|
83
|
+
s.add_dependency(%q<geokit>, ["~> 1.5.0"])
|
84
|
+
s.add_dependency(%q<shoulda>, ["~> 2.11.3"])
|
85
|
+
s.add_dependency(%q<shoulda-context>, ["~> 1.0.0.beta1"])
|
60
86
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
61
87
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
62
88
|
s.add_dependency(%q<rcov>, [">= 0"])
|
89
|
+
s.add_dependency(%q<pry>, ["~> 0.8.3"])
|
63
90
|
s.add_dependency(%q<httparty>, [">= 0.7.4"])
|
64
91
|
end
|
65
92
|
end
|
data/lib/.DS_Store
ADDED
Binary file
|
data/lib/knmi.rb
CHANGED
@@ -1,202 +1,83 @@
|
|
1
|
-
|
2
|
-
require '
|
1
|
+
begin
|
2
|
+
require 'httparty'
|
3
|
+
require 'geokit'
|
4
|
+
require 'csv'
|
5
|
+
rescue LoadError => e
|
6
|
+
if require 'rubygems' then retry
|
7
|
+
else raise(e)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
%w(station parameters httpservice).each { |file| require File.join(File.dirname(__FILE__), 'knmi', file) }
|
12
|
+
|
13
|
+
module KNMI
|
3
14
|
|
4
|
-
class KNMI
|
5
|
-
include HTTParty
|
6
|
-
base_uri 'http://www.knmi.nl/climatology/daily_data/getdata_day.cgi'
|
7
|
-
|
8
15
|
class << self
|
9
|
-
private :new
|
10
16
|
|
11
|
-
#
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
"stns=#{station_number * ":"}"
|
17
|
-
else
|
18
|
-
"stns=#{station_number}"
|
19
|
-
end
|
17
|
+
#
|
18
|
+
# Get nearest station by lat lng
|
19
|
+
# KNMI.station_by_location(52.165, 4.419) #=> #<KNMI::Station:0x0000010134e7f0>
|
20
|
+
def station_by_location(lat, lng)
|
21
|
+
Station.closest_to(lat, lng)
|
20
22
|
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
+
#
|
25
|
+
# Get station object by station ID
|
26
|
+
# KNMI.station_by_id(210) #=> #<KNMI::Station:0x000001016b9b38>
|
27
|
+
def station_by_id(station_id)
|
28
|
+
Station.find(station_id)
|
24
29
|
end
|
25
30
|
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
31
|
+
#
|
32
|
+
# Generate array of unique daily or hourly parameter objects
|
33
|
+
# All details in daily_data_key.yml and hourly_data_key.yml
|
34
|
+
# inputs
|
35
|
+
# period = "daily" or "hourly"
|
36
|
+
# params =
|
37
|
+
# categories =
|
30
38
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
39
|
+
def parameters(period, params = "", categories = "")
|
40
|
+
if params.blank? and categories.blank?
|
41
|
+
list = Parameters.all(period)
|
42
|
+
else
|
43
|
+
list = []
|
44
|
+
|
45
|
+
# Parameters by category
|
46
|
+
list << Parameters.category(period, categories)
|
47
|
+
list.flatten!
|
48
|
+
|
49
|
+
# Parameters by name
|
50
|
+
params = unique_params(params, list) #ensure params are unique to list
|
51
|
+
list << Parameters.find(period, params)
|
52
|
+
list.flatten!
|
53
|
+
list.compact!
|
54
|
+
end
|
55
|
+
return list
|
44
56
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
57
|
+
|
58
|
+
#
|
59
|
+
# Input a station object from KNMI.station_by_id or KNMI.station_by_location
|
60
|
+
# and a parameter hash of objects from # KNMI.Parameters
|
61
|
+
# return
|
62
|
+
def get_data(station_object, parameter_object, start_at = nil, end_at = nil, seasonal = false)
|
63
|
+
if parameter_object[0].period == "daily"
|
64
|
+
HttpService.get_daily(station_object, parameter_object, start_at, end_at, seasonal)
|
65
|
+
elsif parameter_object[0].period == "hourly"
|
66
|
+
HttpService.get_hourly(station_object, parameter_object, start_at, end_at, seasonal)
|
51
67
|
end
|
52
|
-
|
53
|
-
# Collections of variables and all Possible Variables
|
54
|
-
varOpts = {
|
55
|
-
"WIND" => ["DDVEC", "FG", "FHX", "FHX", "FX"],
|
56
|
-
"TEMP" => ["TG", "TN", "TX", "T10N"],
|
57
|
-
"SUNR" => ["SQ", "SP", "Q"],
|
58
|
-
"PRCP" => ["DR", "RH", "EV24"],
|
59
|
-
"PRES" => ["PG", "PGX", "PGN"],
|
60
|
-
"VICL" => ["VVN", "VVX", "NG"],
|
61
|
-
"MSTR" => ["VVN", "VVX", "NG"],
|
62
|
-
"ALL" => ["DDVEC", "FHVEC", "FG", "FHX",
|
63
|
-
"FHXH", "FHN", "FHNH", "FXX", "FXXH", "TG", "TN",
|
64
|
-
"TNH", "TX", "TXH", "T10N", "T10NH", "SQ", "SP",
|
65
|
-
"Q", "DR", "RH", "RHX", "RHXH", "EV24", "PG", "PX",
|
66
|
-
"PXH", "PN", "PNH", "VVN", "VVNH", "VVX", "VVXH",
|
67
|
-
"NG", "UG", "UX", "UXH", "UN", "UNH"]
|
68
|
-
}
|
69
|
-
|
70
|
-
# Drop in invalid vars
|
71
|
-
vars = ( vars & varOpts.to_a.flatten )
|
72
|
-
|
73
|
-
# Only Allow Variable to be selected once, All, or TEMP, not ALL & TEMP
|
74
|
-
# And count the number of selected variables
|
75
|
-
if vars.include?("ALL") == true or vars.empty? == true
|
76
|
-
vars = "ALL"
|
77
|
-
nvars = varOpts["ALL"].count
|
78
|
-
elsif (vars & varOpts.keys) # check if contains keys
|
79
|
-
|
80
|
-
x = []
|
81
|
-
(vars & varOpts.keys).each do |k|
|
82
|
-
x << varOpts.values_at(k)
|
83
|
-
end
|
84
|
-
vars = (vars - x.flatten)
|
85
|
-
|
86
|
-
nvars = 0
|
87
|
-
( vars & varOpts.keys ).each do |v|
|
88
|
-
nvars += varOpts[v].count
|
89
|
-
end
|
90
|
-
|
91
|
-
( vars - varOpts.keys ).each do |v|
|
92
|
-
nvars += 1
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
return vars, nvars
|
97
68
|
end
|
98
|
-
|
99
|
-
# Parse Response into hashed arrays
|
100
|
-
#Other elements
|
101
|
-
#varlist = res[(7+nstn)..(6 + nstn + nvars)]
|
102
|
-
#colheader = res[(8 + nstn + nvars)]
|
103
|
-
#header = res[0..(9 + nstn + nvars)]
|
104
|
-
def parse(response, station_number, vars)
|
105
|
-
# Line Index Numbers
|
106
|
-
nstn = [station_number].flatten.length
|
107
|
-
vars, nvars = check_variables(vars)
|
108
|
-
|
109
|
-
# Split lines into array
|
110
|
-
response = response.split(/\n/)
|
111
|
-
|
112
|
-
# Get Station Details
|
113
|
-
stations = response[5..(4+nstn)]
|
114
|
-
stations = stations.join.tr("\t", "\s")
|
115
|
-
stations = stations.tr("#", "")
|
116
|
-
stations = stations.tr(":", "")
|
117
|
-
stations = CSV.parse( stations, {:col_sep => "\s"} )
|
118
|
-
stations = stations.map {|row| row.map {|cell| cell.to_s } }
|
119
|
-
st_header = [:station_code, :lng, :lat, :elev, :name]
|
120
|
-
stations = stations.map {|row| Hash[*st_header.zip(row).flatten] }
|
121
69
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
varlist = varlist.map {|row| Hash[*vr_header.zip(row).flatten] }
|
131
|
-
|
132
|
-
# Get and clean data
|
133
|
-
response = response[(8 + nstn + nvars)..response.length]
|
134
|
-
response = response.join.tr("\s+", "")
|
135
|
-
response = response.tr("#", "")
|
136
|
-
|
137
|
-
# Parse into array and then hash with var name
|
138
|
-
response = CSV.parse(response, {:skip_blanks => true})
|
139
|
-
header = response.shift.map {|i| i.to_s.intern }
|
140
|
-
string_data = response.map {|row| row.map {|cell| cell.to_s } }
|
141
|
-
data = string_data.map {|row| Hash[*header.zip(row).flatten] }
|
142
|
-
|
143
|
-
return {:stations => stations, :variables => varlist, :data => data}
|
144
|
-
end
|
145
|
-
end # End Private
|
146
|
-
|
147
|
-
# gets variables from station or list of stations
|
148
|
-
# with all variables if vars is empty or selected variables passed as an array
|
149
|
-
# data is from begining of current month to current day
|
150
|
-
# Example
|
151
|
-
# station_number = [210, 212]
|
152
|
-
# vars = "TG"
|
153
|
-
# res = KNMIdaily.get_station( station_number, vars )
|
154
|
-
# output {:stations => {:}}
|
155
|
-
def self.get_station(station_number, vars = "")
|
156
|
-
query = station(station_number) + "&" + variables(vars)
|
157
|
-
puts query
|
158
|
-
res = get("", { :query => query } )
|
159
|
-
res = parse(res, station_number, vars)
|
160
|
-
end
|
161
|
-
|
162
|
-
# gets variables from station or list of stations
|
163
|
-
# with all variables if vars is empty or selected variables passed as an array
|
164
|
-
# data is from start date to current
|
165
|
-
def self.get_station_start_to_current(station_number, start, vars = "")
|
166
|
-
query = station(station_number) + "&" + start_date(start) + "&" + variables(vars)
|
167
|
-
puts query
|
168
|
-
res = get("", { :query => query } )
|
169
|
-
res = parse(res, station_number, vars)
|
170
|
-
end
|
171
|
-
|
172
|
-
# gets variables from station or list of stations
|
173
|
-
# with all variables if vars is empty or selected variables passed as an array
|
174
|
-
# data is from start date to end date
|
175
|
-
def self.get_station_range(station_number, _start, _end, vars = "")
|
176
|
-
query = station(station_number) + "&" + start_date(_start) + "&" + end_date(_end) + "&" + variables(vars)
|
177
|
-
puts query
|
178
|
-
res = get("", { :query => query } )
|
179
|
-
res = parse(res, station_number, vars)
|
180
|
-
end
|
181
|
-
|
182
|
-
# gets variables from station or list of stations
|
183
|
-
# with all variables if vars is empty or selected variables passed as an array
|
184
|
-
# seasonal data is from start date to end date
|
185
|
-
# by selected month and day within each year
|
186
|
-
def self.get_seasonal(station_number, _start, _end, vars = "")
|
187
|
-
query = station(station_number) + "&" + "inseason=true" + "&" + start_date(_start) + "&" + end_date(_end) + "&" + variables(vars)
|
188
|
-
puts query
|
189
|
-
get("", { :query => query } )
|
190
|
-
end
|
191
|
-
|
192
|
-
def self.to_csv(filename, response)
|
193
|
-
CSV.open(filename, "wb") do |csv|
|
194
|
-
response[:data]
|
195
|
-
csv << response[0].keys
|
196
|
-
response[(1..(response.length - 1))].each do |line|
|
197
|
-
csv << line.values
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# Identify and eliminate overlap between params and categories
|
74
|
+
def unique_params(params, list)
|
75
|
+
list.each do |e|
|
76
|
+
params = [params].flatten
|
77
|
+
params.delete_if {|p| p == e.parameter }
|
198
78
|
end
|
79
|
+
return params
|
199
80
|
end
|
81
|
+
|
200
82
|
end
|
201
|
-
|
202
83
|
end
|