knmi 0.2.0 → 0.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.
@@ -0,0 +1,193 @@
1
+ knmi
2
+ ====
3
+
4
+ Ruby API to access Royal Netherlands Meteorological Institute daily climate data
5
+ Access climatological data as provided by the Royal Netherlands Meteorological Institute through the http get forms for daily and hourly data
6
+
7
+ * http://www.knmi.nl/climatology/daily_data/getdata_day.cgi
8
+ * http://www.knmi.nl/klimatologie/uurgegevens/getdata_uur.cgi
9
+
10
+ This gem was constructed using information from the KNMI climate data pages here.
11
+
12
+ * Hourly data (Dutch) - http://www.knmi.nl/klimatologie/uurgegevens/scriptxs-nl.html#uur
13
+ * Daily data (English) - http://www.knmi.nl/climatology/daily_data/scriptxs-en.html
14
+ * Select Data with a form, listed below are links to metadata about each station http://www.knmi.nl/climatology/daily_data/selection.cgi
15
+
16
+ Installation
17
+ ------------
18
+ gem install httparty
19
+ gem install geokit
20
+
21
+ gem install knmi
22
+
23
+ Example Usage
24
+ -------------
25
+
26
+ # Quick Script
27
+
28
+ require 'knmi'
29
+
30
+ station = KNMI.station_by_id(235)
31
+ parameter = KNMI.parameters(period = "daily", params = nil, categories = ["TEMP", "WIND"])
32
+ starts = Time.utc(2010, 6, 28) # 2010 April 28th
33
+ ends = Time.utc(2010, 6, 29) # 2010 April 29th
34
+ request = KNMI.get_data(station, parameter, starts, ends)
35
+ data = KNMI::Calculations.convert(request.data)
36
+
37
+ # Elaborated Script
38
+
39
+ require 'knmi'
40
+
41
+ # Get station object by station ID
42
+ station = KNMI.station_by_id(235)
43
+
44
+ station
45
+ #=> #<KNMI::Station:0x0000010133c938> # A struct object
46
+
47
+ # Available Instance Variables
48
+ station.instance_variables
49
+ #=> [:@id, :@name, :@elevation, :@photo, :@map, :@web, :@instrumentation, :@coordinates]
50
+ station.id
51
+ #=> 235
52
+ station.name
53
+ #=>"De kooy"
54
+ station.coordinates
55
+ #=> 52.924,4.785
56
+
57
+
58
+ # Get parameter object at the time interval you wish to use "hourly" or "daily"
59
+ # Params can be a single term or an array of terms such as "TG" or ["TG", TX]
60
+ # Categories can be a single term or an array of terms such as "WIND" or ["WIND", "TEMP"]
61
+ parameters = KNMI.parameters(period = "daily", params = nil, categories = ["TEMP", "WIND"])
62
+
63
+ parameters # returns an array of parameter objects
64
+ #=> [#<KNMI::Parameters:0x000001011387e0 @parameter="TX", @category="TEMP", @description="Maximum Temperature", @validate="n.integer?", @conversion="n / 10", @units="C", @period="daily">]
65
+
66
+ # Available Instance Variables
67
+ parameters[0].instance_variables
68
+ #=>[:@parameter, :@category, :@description, :@validate, :@conversion, :@units, :@period]
69
+
70
+ parameters[0].parameter
71
+ #=> "TX"
72
+
73
+
74
+ # Define Time period of interest
75
+ starts = Time.utc(2010, 6, 28) # 2010 April 28th
76
+ ends = Time.utc(2010, 7, 01) # 2010 April 29th
77
+
78
+ # Get Data using previously retrieved objects
79
+ request = KNMI.get_data(station, parameters, starts, ends)
80
+
81
+ # Available Instance Variables
82
+ request.instance_variables
83
+ #=> [:@query, :@data]
84
+
85
+ request.query
86
+ #=>["stns=235", "vars=TX", "start=20100628", "end=20100629"]
87
+
88
+ request.data
89
+ #=>[{:STN=>"235", :YYYYMMDD=>"20100628", :TX=>"263"}, {:STN=>"235", :YYYYMMDD=>"20100629", :TX=>"225"}]
90
+
91
+ request.data[0]
92
+ #=>{:STN=>"235", :YYYYMMDD=>"20100628", :TX=>"263"}
93
+
94
+
95
+ # Convert data from storage format to operating format
96
+ data = KNMI.convert(parameters, request)
97
+
98
+ Available Parameters
99
+ --------------------
100
+ All available recorded parameters can be found in the file .data/data_key.yml
101
+ This file contains the parameter name, category, description, a script to validate the data, a script to convert the data to to appropriate units, units, and the appropriate period.
102
+
103
+ Daily Data
104
+ ----------
105
+ |Parameter|Category|Description|
106
+ |:--------|:-------|:----------|
107
+ |YYYYMMDD | | Time Stamp|
108
+ |DDVEC |WIND | Wind Direction |
109
+ |FHVEC |WIND | Vector Mean Wind Speed|
110
+ |FG |WIND | Daily Mean Wind Speed|
111
+ |FHX |WIND | Maximum Hourly Mean Windspeed|
112
+ |FHXH |WIND | Hourly Division at Which Maximum Wind Speed Was Measured|
113
+ |FHN |WIND | Minimum Hourly Mean Windspeed|
114
+ |FHNH |WIND | Hourly Division at Which Minimum Wind Speed Was Measured|
115
+ |FXX |WIND | Maximum Instantaneous Wind Speed|
116
+ |FXXH |WIND | Hourly Division at Which Maximum Instantaneous Wind Speed Was Measured|
117
+ |TG |TEMP | Daily Mean Temperature|
118
+ |TN |TEMP | Minimum Temperature|
119
+ |TNH |TEMP | Hourly Division in Which Minimum Temperature Was Measured|
120
+ |TX |TEMP | Maximum Temperature|
121
+ |TXH |TEMP | Hourly Division in Which Maximum Temperature Was Measured|
122
+ |T10N |TEMP | Minimum Temperature at 10 Cm Above Surface|
123
+ |T10NH |TEMP | Six Hourly Division at Which Minimum Temperature at 10 Cm Above Surface Was Measured|
124
+ |SQ |RADT | Sunshine Duration|
125
+ |SP |RADT | Percent of Maximum Sunshine Duration|
126
+ |Q |RADT | Global Radiation|
127
+ |DR |PRCP | Precipitation Duration|
128
+ |RH |PRCP | Daily Precipitation|
129
+ |RHX |PRCP | Maximum Hourly Precipitation|
130
+ |RHXH |PRCP | Hourly Division in Which Maximum Hourly Precipitation Was Measured|
131
+ |EV24 |ATMS | Potential Evapotranspiration|
132
+ |PG |ATMS | Daily Mean Sea Level Pressure|
133
+ |PX |ATMS | Maximum Hourly Sea Level Pressure|
134
+ |PXH |ATMS | Hourly Division on Which Maximum Hourly Sea Level Pressure Was Measured|
135
+ |PN |ATMS | Minimum Hourly Sea Level Pressure|
136
+ |PNH |ATMS | Hourly Division in Which Minimum Hourly Sea Level Pressure Was Measured|
137
+ |VVN |VISB | Minimum Visibility|
138
+ |VVNH |VISB | Hourly Division in Which Minimum Visibility Was Measured|
139
+ |VVX |VISB | Maximum Visibility|
140
+ |VVXH |VISB | Hourly Division in Which Maximum Visibility Was Measured|
141
+ |NG |VISB | Mean Daily Cloud Cover|
142
+ |UG |ATMS | Daily Mean Relative Humidity|
143
+ |UX |ATMS | Maximum Relative Humidity|
144
+ |UXH |ATMS | Hourly Division in Which Maximum Relative Humidity Was Measured|
145
+ |UN |ATMS | Minimum Relative Humidity|
146
+ |UNH |ATMS | Hourly Division in Which Minimum Relative Humidity Was Measured|
147
+
148
+ Hourly Data
149
+ -----------
150
+ |Parameter|Category|Description|
151
+ |:--------|:-------|:----------|
152
+ |YYYYMMDD | | Time Stamp|
153
+ |HH | |Hour |
154
+ |DD |WIND | Mean wind direction during the 10-minute period preceding the time of observation|
155
+ |FH |WIND | Hourly mean wind speed|
156
+ |FF |WIND | Mean wind speed|
157
+ |FX |WIND | Maximum wind gust|
158
+ |T |TEMP | Air Temperature at 1.5 m|
159
+ |T10N |TEMP | Minimum Air Temperature at 10 cm in the preceding 6 hours|
160
+ |TD |TEMP | Dew Point Temperature|
161
+ |SQ |RDTN | Sunshine Duration|
162
+ |Q |RDTN | Golbal Radiation|
163
+ |DR |PRCP | Precipitation Duration|
164
+ |RH |PRCP | Precipitation|
165
+ |P |ATMS | Air Pressure|
166
+ |VV |VISB | Visibility|
167
+ |N |VISB | Cloud Cover|
168
+ |U |ATMS | Relative Humidity|
169
+ |M |WTHR | Fog|
170
+ |R |WTHR | Rainfall|
171
+ |S |WTHR | Snow|
172
+ |O |WTHR | Thunder|
173
+ |Y |WTHR | Ice|
174
+ |WW |WTHR | Weather Code|
175
+
176
+ TODO
177
+ ----
178
+
179
+ Write unit tests for lib/calculations/calculations.rb
180
+
181
+ Please Note the license included in the header source header
182
+ ---------------------------------------------------------------
183
+ # DEZE GEGEVENS MOGEN VRIJ WORDEN GEBRUIKT MITS DE VOLGENDE BRONVERMELDING WORDT GEGEVEN:
184
+ # KONINKLIJK NEDERLANDS METEOROLOGISCH INSTITUUT (KNMI)
185
+ #
186
+ # THESE DATA CAN BE USED FREELY PROVIDED THAT THE FOLLOWING SOURCE IS ACKNOWLEDGED:
187
+ # ROYAL NETHERLANDS METEOROLOGICAL INSTITUTE
188
+
189
+ Copyright
190
+ ---------
191
+
192
+ Copyright (c) 2011 Patrick Galvin Schmitz p.schmitz@gmail.com. See LICENSE.txt for
193
+ further details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -5,24 +5,23 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{knmi}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.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-17}
12
+ s.date = %q{2011-05-19}
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 = [
16
16
  "LICENSE.txt",
17
- "README.rdoc"
17
+ "README.mkdn"
18
18
  ]
19
19
  s.files = [
20
- ".DS_Store",
21
20
  ".document",
22
21
  "Gemfile",
23
22
  "Gemfile.lock",
24
23
  "LICENSE.txt",
25
- "README.rdoc",
24
+ "README.mkdn",
26
25
  "Rakefile",
27
26
  "VERSION",
28
27
  "data/current_stations.yml",
@@ -30,12 +29,13 @@ Gem::Specification.new do |s|
30
29
  "data/data_key.yml",
31
30
  "data/hourly_data_key.yml",
32
31
  "knmi.gemspec",
33
- "lib/.DS_Store",
34
32
  "lib/knmi.rb",
33
+ "lib/knmi/calculations.rb",
35
34
  "lib/knmi/httpservice.rb",
36
35
  "lib/knmi/parameters.rb",
37
36
  "lib/knmi/station.rb",
38
37
  "test/helper.rb",
38
+ "test/test_calculations.rb",
39
39
  "test/test_httpservice.rb",
40
40
  "test/test_knmi.rb",
41
41
  "test/test_parameters.rb",
@@ -48,6 +48,7 @@ Gem::Specification.new do |s|
48
48
  s.summary = %q{Ruby API to access daily climate data from the Royal Netherlands Meteorological Institute}
49
49
  s.test_files = [
50
50
  "test/helper.rb",
51
+ "test/test_calculations.rb",
51
52
  "test/test_httpservice.rb",
52
53
  "test/test_knmi.rb",
53
54
  "test/test_parameters.rb",
@@ -8,41 +8,79 @@ rescue LoadError => e
8
8
  end
9
9
  end
10
10
 
11
- %w(station parameters httpservice).each { |file| require File.join(File.dirname(__FILE__), 'knmi', file) }
11
+ %w(station parameters httpservice calculations).each { |file| require File.join(File.dirname(__FILE__), 'knmi', file) }
12
12
 
13
13
  module KNMI
14
14
 
15
15
  class << self
16
16
 
17
- #
18
17
  # Get nearest station by lat lng
19
- # KNMI.station_by_location(52.165, 4.419) #=> #<KNMI::Station:0x0000010134e7f0>
18
+ #
19
+ # @param lat [Numeric] - latitude e.g. 52.165
20
+ # @param lng [Numeric] - longitude e.g. 52.165
21
+ # @param [Array] [] - [lat, lng] e.g. [52.165, 4,419] *eqivalent to (lat, lng)*
22
+ # @param [GeoKit::LatLng] - Geokit object e.g. GeoKit::LatLng.new(52.165, 4.419) *eqivalent to (lat, lng)*
23
+ # @return [KNMI::Station] - Object with details about the station nearest to the requested lat/lng
24
+ #
25
+ # @example Get nearest station by lat, lng
26
+ # KNMI.station_by_location(52.165, 52.165)
27
+ #
28
+ # @example Get nearest station by [lat, lng]
29
+ # KNMI.station_by_location([52.165, 52.165])
30
+ #
31
+ # @example Get nearest station with GeoKit object
32
+ # KNMI.station_by_location(GeoKit::LatLng.new(52.165, 4.419))
33
+ #
20
34
  def station_by_location(lat, lng)
21
35
  Station.closest_to(lat, lng)
22
36
  end
23
37
 
24
- #
25
38
  # Get station object by station ID
26
- # KNMI.station_by_id(210) #=> #<KNMI::Station:0x000001016b9b38>
39
+ #
40
+ # @param station_id [String, Numeric] - number of station of interest, station_ids can be found in
41
+ # @return [KNMI::Station] - Object with details about the requested station
42
+ #
43
+ # @example Get station by ID
44
+ # KNMI.station_by_id(210)
45
+ #
27
46
  def station_by_id(station_id)
28
47
  Station.find(station_id)
29
48
  end
30
49
 
50
+ # Get an array of parameter objects
31
51
  #
32
- # Generate array of unique daily or hourly parameter objects
33
52
  # All details in daily_data_key.yml and hourly_data_key.yml
34
- # inputs
35
- # period = "daily" or "hourly"
36
- # params =
37
- # categories =
38
-
39
- def parameters(period, params = "", categories = "")
40
- if params.blank? and categories.blank?
53
+ # @param [string] period - "daily" or "hourly"
54
+ # @param [Array<string>] params - array of parameters e.g ["TX", "TG"]
55
+ # @param [Array<string>] categories - array of categories e.g. ["WIND", "TEMP"]
56
+ # @return [Array<KNMI::Parameters>] - array of KNMI::Parameters objects
57
+ #
58
+ # @example Get daily station data and a single parameter
59
+ # KNMI.parameters("daily", "TX")
60
+ #
61
+ # @example Get hourly station data and a multiple parameters
62
+ # KNMI.parameters("hourly", ["TX", "TG"])
63
+ #
64
+ # @example Get hourly station data and a multiple categories
65
+ # KNMI.parameters("daily", nil, ["WIND", "TEMP"])
66
+ #
67
+ def parameters(period, params = nil, categories = nil)
68
+ if params.nil? and categories.nil?
69
+
41
70
  list = Parameters.all(period)
42
- else
43
- list = []
71
+
72
+ elsif categories.nil?
44
73
 
74
+ # Parameters by name
75
+ list = []
76
+ params = unique_params(params, list) #ensure params are unique to list
77
+ list << Parameters.find(period, params)
78
+ list.flatten!
79
+ list.compact!
80
+ else
81
+
45
82
  # Parameters by category
83
+ list = []
46
84
  list << Parameters.category(period, categories)
47
85
  list.flatten!
48
86
 
@@ -55,17 +93,42 @@ module KNMI
55
93
  return list
56
94
  end
57
95
 
96
+ # Retrieve climate data from a weather station
97
+ #
98
+ # @param station [KNMI::Station] - station object retrieved with KNMI.station_by_id() or KNMI.station_by_location()
99
+ # @param parameters [Array<KNMI::Parameters>] - parameters object retrieved with KNMI.parameters()
100
+ # @param starts [Time] - Time object e.g. Time.utc(2010, 6, 28)
101
+ # @param ends [Time] - Time object e.g. Time.utc(2010, 6, 29)
102
+ # @param seasonal [Boolean]
58
103
  #
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)
104
+ # @return [KNMI::HttpService]
105
+ def get_data(station, parameters, starts = nil, ends = nil, seasonal = false)
106
+
107
+ if parameters[0].period == "daily"
108
+ HttpService.get_daily(station, parameters, starts, ends, seasonal)
109
+
110
+ elsif parameters[0].period == "hourly"
111
+ HttpService.get_hourly(station, parameters, starts, ends, seasonal)
112
+
67
113
  end
68
114
  end
115
+
116
+ # Input data request object and return array of hashes converted from storage to operable units.
117
+ #
118
+ # @param parameters [KNMI::Stations] - Parameters object
119
+ # @param request [KNMI:HttpService] - Data object from HttpRequest
120
+ #
121
+ # @return [Hash] - Hash containing climate data in operable units
122
+ def convert(parameters, request)
123
+
124
+ if parameters[0].period == "daily"
125
+ KNMI::Calculations.convert_daily(request.data)
126
+
127
+ elsif parameters[0].period == "hourly"
128
+ KNMI::Calculations.convert_hourly(request.data)
129
+
130
+ end
131
+ end
69
132
 
70
133
 
71
134
  private
@@ -0,0 +1,185 @@
1
+ module KNMI
2
+ class Calculations
3
+ class << self
4
+
5
+ # Converts Daily KNMI.get_data().data from storage to operable units
6
+ #
7
+ # @param [Array<Hash>] array - in storage format (integers)
8
+ # @return [Array<Hash>] - in operable format (Float, Integer, Time)
9
+ def convert_daily(array)
10
+ x = []
11
+
12
+ array.each_with_index do |a, index|
13
+ x[index] = {}
14
+ x[index][:stn] = a
15
+ a.each_pair { |key,value| x[index].merge!( {key => converts_daily(key, value)} ) }
16
+
17
+ end
18
+
19
+ return x
20
+ end
21
+
22
+ # Converts Hourly KNMI.get_data().data from storage to operable units
23
+ #
24
+ # @param [Array<Hash>] array - Array of hashes, in storage format (integers)
25
+ # @return [Array<Hash>] - Array of hashes, in operable format (Float, Integer, Time)
26
+ def convert_hourly(array)
27
+ x = []
28
+
29
+ array.each_with_index do |a, index|
30
+ x[index] = {}
31
+ a.each_pair { |key,value| x[index].merge!( {key => converts_daily(key, value)} ) }
32
+ x[index][:Time] = x[index][:YYYYMMDD] + x[index][:HH]
33
+
34
+ end
35
+
36
+ return x
37
+ end
38
+
39
+ private
40
+
41
+ def converts_daily( key, n )
42
+ if key == :STN
43
+ n
44
+ elsif [:FHVEC, :FG, :FHX, :FHN, :FXX, :TG, :TN, :TX, :T10N, :RH, :EV24, :PG, :PX, :PN].include?(key)
45
+
46
+ n.integer? ? n.to_f / 10 : nil
47
+
48
+ elsif [:FHXH, :FHNH, :FXXH, :TNH, :TXH, :RHXH, :PXH, :PNH, :VVNH, :VVXH, :UXH, :UNH].include?(key)
49
+
50
+ (1..24).include?(n) ? n : nil
51
+
52
+ elsif [:SP, :UG, :UX, :UN].include?(key)
53
+
54
+ (0..100).include?(n) ? n : nil
55
+
56
+ elsif [:RHX].include?(key)
57
+
58
+ n = n.integer? ? n : nil
59
+ return n == -1 ? 0.05 : n.to_f / 10
60
+
61
+ elsif [:Q].include?(key)
62
+
63
+ n.integer? ? n : nil
64
+
65
+ elsif [:DR].include?(key)
66
+
67
+ (0..6).include?(n) ? (n.to_f / 10) * 60 : nil
68
+
69
+ elsif [:DDVEC].include?(key)
70
+
71
+ (0..360).include?(n) ? n : nil
72
+
73
+ elsif [:SQ].include?(key)
74
+
75
+ n = (-1..6).include?(n) ? n : nil
76
+ return n == -1 ? 0.05 : (n.to_f / 10) * 60
77
+
78
+ elsif [:T10NH].include?(key)
79
+
80
+ (6..24).step(6).include?(n) ? n : nil
81
+
82
+ elsif [:NG].include?(key)
83
+
84
+ (0..9).include?(n) ? n : nil
85
+
86
+ elsif [:YYYYMMDD].include?(key)
87
+
88
+ Time.utc(
89
+ year = n.to_s[(0..3)],
90
+ month = n.to_s[(4..5)],
91
+ day = n.to_s[(6..7)]
92
+ )
93
+
94
+ elsif [:VVN, :VVX].include?(key)
95
+
96
+ if n == 0
97
+ '< 100 meters'
98
+ elsif (1..49).include?(n)
99
+ (n * 100).to_s + '-' + ((n+1) * 100).to_s + ' meters'
100
+ elsif n == 50
101
+ '5-6 kilometers'
102
+ elsif (56..79).include?(n)
103
+ (n - 50).to_s + '-' + (n - 49).to_s + ' kilometers'
104
+ elsif (80..88).include?(n)
105
+ (n - 50).to_s + '-' + (n - 45).to_s + ' kilometers'
106
+ elsif n == 89
107
+ '> 70 kilometers'
108
+ end
109
+
110
+ end
111
+ end
112
+
113
+
114
+ def converts_hourly( key, n )
115
+ if key == :STN
116
+
117
+ n
118
+
119
+ elsif [:FH, :FF, :FX, :T, :T10N, :TD, :RH, :P].include?(key)
120
+
121
+ n.integer? ? n.to_f / 10 : nil
122
+
123
+ elsif [:M, :R, :S, :O, :Y].include?(key)
124
+
125
+ (0..1).include?(n) ? n : nil
126
+
127
+ elsif key == :SQ
128
+
129
+ (-1..240).include?(n) ? n : nil
130
+ return n == -1 ? 0.05 : (n / 10) * 60
131
+
132
+ elsif key == :U
133
+
134
+ (0..100).include?(n) ? n : nil
135
+
136
+ elsif key == :DR
137
+
138
+ (0..240).include?(n) ? (n / 10) * 60 : nil
139
+
140
+ elsif key == :DD
141
+
142
+ (0..360).to_a.push(990).include?(n) ? n : nil
143
+
144
+ elsif key == :N
145
+
146
+ (0..9).include?(n) ? n : nil
147
+
148
+ elsif key == :WW
149
+
150
+ (0..99).include?(n) ? n : nil
151
+
152
+ elsif key == :HH
153
+
154
+ (1..24).include?(n) ? n : nil
155
+
156
+ elsif [:YYYYMMDD].include?(key)
157
+
158
+ Time.utc(
159
+ year = n.to_s[(0..3)],
160
+ month = n.to_s[(4..5)],
161
+ day = n.to_s[(6..7)]
162
+ )
163
+
164
+ elsif [:VVN, :VVX].include?(key)
165
+
166
+ if n == 0
167
+ '< 100 meters'
168
+ elsif (1..49).include?(n)
169
+ (n * 100).to_s + '-' + ((n+1) * 100).to_s + ' meters'
170
+ elsif n == 50
171
+ '5-6 kilometers'
172
+ elsif (56..79).include?(n)
173
+ (n - 50).to_s + '-' + (n - 49).to_s + ' kilometers'
174
+ elsif (80..88).include?(n)
175
+ (n - 50).to_s + '-' + (n - 45).to_s + ' kilometers'
176
+ elsif n == 89
177
+ '> 70 kilometers'
178
+ end
179
+
180
+ end
181
+ end
182
+
183
+ end
184
+ end
185
+ end
@@ -5,25 +5,43 @@ module KNMI
5
5
 
6
6
  class << self
7
7
 
8
- def get_daily(station_object, parameter_object, start_at = nil, end_at = nil, seasonal = false)
8
+ # Requests Daily data
9
+ #
10
+ # @param station_object [KNMI::Station] - Station Object
11
+ # @param parameter_object [KNMI::Parameters] - Parameter Object
12
+ # @param starts [Time] - Time Object
13
+ # @param ends [Time] - Time Object
14
+ # @param seasonal [Boolean]
15
+ # @return [KNMI::HttpService]
16
+ #
17
+ def get_daily(station_object, parameters_object, starts = nil, ends = nil, seasonal = false)
9
18
  # select YYYYMMDD (drops hour term)
10
- query = [station(station_object), parameters(parameter_object),
11
- start_date(start_at)[0..13], end_date(end_at)[0..11],
19
+ query = [station(station_object), parameters(parameters_object),
20
+ start_date(starts)[0..13], end_date(ends)[0..11],
12
21
  seasonal(seasonal)].compact
13
22
  result = get('http://www.knmi.nl/climatology/daily_data/getdata_day.cgi', { :query => "#{query * "&"}" } )
14
23
 
15
- data = parse(station_object, parameter_object, result)
24
+ data = parse(station_object, parameters_object, result)
16
25
 
17
26
  return new({"query" => query, "data" => data})
18
27
  end
19
-
20
- def get_hourly(station_object, parameter_object, start_at = nil, end_at = nil, seasonal = false)
21
- query = [station(station_object), parameters(parameter_object),
22
- start_date(start_at), end_date(end_at),
28
+
29
+ # Requests Hourly data
30
+ #
31
+ # @param station_object [KNMI::Station] - Station Object
32
+ # @param parameter_object [KNMI::Parameters] - Parameter Object
33
+ # @param starts [Time] - Time Object
34
+ # @param ends [Time] - Time Object
35
+ # @param seasonal [Boolean]
36
+ # @return [KNMI::HttpService]
37
+ #
38
+ def get_hourly(station_object, parameters_object, starts = nil, ends = nil, seasonal = false)
39
+ query = [station(station_object), parameters(parameters_object),
40
+ start_date(starts), end_date(ends),
23
41
  seasonal(seasonal)].compact
24
42
  result = get('http://www.knmi.nl/klimatologie/uurgegevens/getdata_uur.cgi', { :query => "#{query * "&"}" } )
25
43
 
26
- data = parse(station_object, parameter_object, result)
44
+ data = parse(station_object, parameters_object, result)
27
45
 
28
46
  return new({"query" => query, "data" => data})
29
47
  end
@@ -98,7 +116,7 @@ module KNMI
98
116
  # Parse into array and then hash with var name
99
117
  data = CSV.parse(data, {:skip_blanks => true})
100
118
  header = data.shift.map {|i| i.to_s.intern }
101
- string_data = data.map {|row| row.map {|cell| cell.to_s } }
119
+ string_data = data.map {|row| row.map {|cell| cell.to_i } }
102
120
  data = string_data.map {|row| Hash[*header.zip(row).flatten] }
103
121
 
104
122
  return data
@@ -106,14 +124,21 @@ module KNMI
106
124
 
107
125
  end
108
126
 
109
- #
110
127
  # Returns query string used in HTTP get request
111
- # KNMI::HttpService.get_daily(210) #=> @ query =>[ "stns=210", "vars=ALL", "start=2011051500", "end=2011051613"]
128
+ #
129
+ # @return [Array<string>] - array of strings which contains the components used in the HTTP request
130
+ #
131
+ # @example
132
+ # KNMI::HttpService.get_daily(station, parameter).query
133
+ # =>[ "stns=210", "vars=ALL", "start=2011051500", "end=2011051613"]
112
134
  attr_reader :query
113
135
 
114
- #
115
136
  # Parsed HTTP request
116
- # Array of Hashes
137
+ #
138
+ # @return [Array<Hash>] - array of hashes which contains climate data in storage(integer) format
139
+ # @example
140
+ # KNMI::HttpService.get_daily(station, parameter).data
141
+ # =>[{:STN=>"235", :YYYYMMDD=>"20100628", :TX=>"263"}, {:STN=>"235", :YYYYMMDD=>"20100629", :TX=>"225"}]
117
142
  attr_reader :data
118
143
 
119
144
  def initialize(properties)
@@ -3,11 +3,16 @@ module KNMI
3
3
  class << self
4
4
  attr_writer :keys_file
5
5
 
6
+ # Retrieve Parameter Object by named parameter
6
7
  #
7
- # Retrieve information about Parameter can be string or array
8
+ # @param period [String] - "daily" or "hourly"
9
+ # @param parameter [Array, String] - Array of strings or string of parameter name
10
+ # @return [Array<KNMI::Parameters>] - array of parameter objects
11
+ #
12
+ # @example
13
+ # KNMI::Parameter.find(period = "daily", "TA")
14
+ # KNMI::Parameter.find(period = "daily", ["TG", "TX"])
8
15
  #
9
- # KNMI::Parameter.find(period = "daily", "TA") #=> KNMI::Parameter object for TG (Daily Max temperature)
10
- # KNMI::Parameter.find(period = "daily", ["TG", "TX"]) #=> KNMI::Parameter array of objects TG (Daily Mean temperature) and TX (Daily Max Temperature)
11
16
  def find(period, parameter)
12
17
  parameter = [parameter].flatten
13
18
 
@@ -19,12 +24,16 @@ module KNMI
19
24
  return list
20
25
  end
21
26
 
27
+ # Retrieve Parameter Object by named parameter
28
+ #
29
+ # @param period [String] - "daily" or "hourly"
30
+ # @param category [Array, String] - Array of strings or string of category name
31
+ # @return [Array<KNMI::Parameters>] - array of parameter objects
22
32
  #
23
- # Retrieve each parameter within a category
24
- # an Array of structs
33
+ # @example
34
+ # KNMI.Parameter.category(period = "daily, ""WIND")
35
+ # KNMI.Parameter.category(period = "daily, ["WIND", "TEMP"])
25
36
  #
26
- # KNMI.Parameter.category(period = "daily, ""WIND") #=> [#<Parameter:0x00000100b433f8 @parameter="SQ", @category="RADT", @description="Sunshine Duration", @validate="(-1..6).include?(n)", @conversion="n == -1 ? 0.05 : (n / 10) * 60", @units="minutes">, #<Daily:0x00000100b43290 @parameter="SP", @category="RADT", @description="Percent of Maximum Sunshine Duration", @validate="(0..100).include?(n)", @conversion=nil, @units="%">, #<Daily:0x00000100b43128 @parameter="Q", @category="RADT", @description="Global Radiation", @validate="n.integer?", @conversion=nil, @units="J/cm^2">]
27
- # KNMI.Parameter.category(period = "daily, ["WIND", "TEMP"])
28
37
  def category(period, category)
29
38
  category = [category].flatten
30
39
 
@@ -36,9 +45,10 @@ module KNMI
36
45
  return list.flatten!
37
46
  end
38
47
 
39
- #
40
48
  # Retrieve all Parameters
41
- # an Array of structs
49
+ # @param period [String] - "daily" or "hourly"
50
+ # @return [Array<KNMI::Parameters>] - array of parameter objects
51
+ #
42
52
  def all(period)
43
53
  list = []
44
54
  list << keys.select { |k| k.period == period }
@@ -61,25 +71,25 @@ module KNMI
61
71
 
62
72
  end
63
73
 
64
- # Paramter shortname
74
+ # @return [String] - Paramter shortname
65
75
  attr_reader :parameter
66
76
 
67
- # Categories grouping parameters
77
+ # @return [String] - Categories grouping parameters
68
78
  attr_reader :category
69
79
 
70
- # Description of parameter
80
+ # @return [String] - Description of parameter
71
81
  attr_reader :description
72
82
 
73
- # Code to validate data as accurate
83
+ # @return [String] - example code to validate data as accurate
74
84
  attr_reader :validate
75
85
 
76
- # Code to convert data into appropriate format/units
86
+ # @return [String] - example code to convert data into appropriate format/units for operation
77
87
  attr_reader :conversion
78
88
 
79
- # Unit of converted format
89
+ # @return [String] - Unit of converted format
80
90
  attr_reader :units
81
91
 
82
- # Time Period
92
+ # @return [String] - Time Period "daily" or "hourly"
83
93
  attr_reader :period
84
94
 
85
95
  def initialize(properties)
@@ -88,6 +98,7 @@ module KNMI
88
98
  end
89
99
  end
90
100
 
101
+ # @return [Hash] - Hash containing important details about parameters object
91
102
  def detail
92
103
  {:parameter => @parameter, :category => @category,
93
104
  :description => @description, :validate => @validate,
@@ -1,23 +1,35 @@
1
1
  module KNMI
2
2
  class Station
3
3
  class <<self
4
- attr_writer :stations_file #:nodoc:
4
+ attr_writer :stations_file
5
5
 
6
+ # Retrieve station object by id
6
7
  #
7
- # Retrieve information about a station given a station ID
8
+ # @param id [Numeric, String] - Station id
9
+ # @return [KNMI::Station]
10
+ #
11
+ # @example Retrieve Station object for Valkenburg
12
+ # KNMI::Station.find(210)
8
13
  #
9
- # KNMI::Station.find(210) #=> KNMI::Station object for Valkenburg
10
14
  def find(id)
11
15
  stations.find { |station| station.id == id }
12
16
  end
13
17
 
14
- #
15
18
  # Find the station closest to a given location. Can accept arguments in any of the following
16
19
  # three forms (all are equivalent):
17
20
  #
21
+ # @param *args [String, Array, Geokit::LatLLng]
22
+ # @return [KNMI::Station] - Object with details about the station nearest to the requested lat/lng
23
+ #
24
+ # @example Retrieve Station by lat, lng
18
25
  # KNMI::Station.closest_to(52.165, 4.419)
26
+ #
27
+ # @example Retrieve Station by [lat, lng]
19
28
  # KNMI::Station.closest_to([52.165, 4.419])
29
+ #
30
+ # @example Retrieve Station with GeoKit object
20
31
  # KNMI::Station.closest_to(GeoKit::LatLng.new(52.165, 4.419))
32
+ #
21
33
  def closest_to(*args)
22
34
  if args.length == 1
23
35
  if args.first.respond_to?(:distance_to)
@@ -59,31 +71,32 @@ module KNMI
59
71
  @stations_file ||= File.join(File.dirname(__FILE__), '..', '..', 'data', 'current_stations.yml')
60
72
  end
61
73
  end
62
-
63
- # GeoKit::LatLng containing the station's coordinates
74
+
75
+ # @return [GeoKit::LatLng] - object containing the station's coordinates
64
76
  attr_reader :coordinates
65
77
 
66
- # Station ID (e.g., 210)
78
+ # @return [String] - Station ID (e.g., 210)
67
79
  attr_reader :id
68
80
 
69
- # Station name (e.g., "Valkenburg")
81
+ # @return [String] - Station name (e.g., "Valkenburg")
70
82
  attr_reader :name
71
83
 
72
- # Station Elevation
84
+ # @return [String] - Station Elevation
73
85
  attr_reader :elevation
74
86
  alias_method :elev, :elevation
75
87
  alias_method :altitude, :elevation
76
88
  alias_method :alt, :elevation
77
89
 
78
- # Link to Station Photo
90
+ # @return [String] - Link to Station Photo {http://www.knmi.nl/klimatologie/metadata/210_valkenburg_big.jpg Station 210 - Valkenburg Station Photo}
79
91
  attr_reader :photo
80
92
 
81
- # Link to map of station location
93
+ # @return [String] - Link to map of station location {http://www.knmi.nl/klimatologie/metadata/stn_210.gif Station 210 - Valkenburg Station Map}
82
94
  attr_reader :map
83
95
 
84
- # Link to Metadata page listing
96
+ # @return [String] - Link to Metadata page listing http://www.knmi.nl/klimatologie/metadata/valkenburg.html {Station 210 - Valkenburg Station MetaData page}
85
97
  attr_reader :web
86
98
 
99
+ # @return [Hash<Array>] - Hash containing arrays with detail about historical and current instrumentation at station
87
100
  attr_reader :instrumentation
88
101
 
89
102
  def initialize(properties)
@@ -93,19 +106,21 @@ module KNMI
93
106
  @coordinates = GeoKit::LatLng.new(properties['lat'], properties['lng'])
94
107
  end
95
108
 
96
- # Latitude of station
109
+ # @return [Float] - Latitude of station
97
110
  def latitude
98
111
  @coordinates.lat
99
112
  end
100
113
  alias_method :lat, :latitude
101
114
 
102
- # Longitude of station
115
+ # @return [Float] - Longitude of station
103
116
  def longitude
104
117
  @coordinates.lng
105
118
  end
106
119
  alias_method :lng, :longitude
107
120
  alias_method :lon, :longitude
108
121
 
122
+
123
+ # @return [Hash] - contains a has with detail about the station
109
124
  def detail
110
125
  {:id => @id, :name => @name, :elev => @elevation, :lat => latitude, :lng => longitude}
111
126
  end
@@ -0,0 +1,5 @@
1
+ require 'helper'
2
+
3
+ class TestCalculations < KNMI::TestCase
4
+ # TODO
5
+ end
@@ -20,7 +20,7 @@ class TestHttpService < KNMI::TestCase
20
20
  end
21
21
 
22
22
  should "have result" do
23
- assert_equal @response.data, [{:STN=>"235", :YYYYMMDD=>"20100628", :TX=>"263"}, {:STN=>"235", :YYYYMMDD=>"20100629", :TX=>"225"}]
23
+ assert_equal @response.data, [{:STN=>235, :YYYYMMDD=>20100628, :TX=>263}, {:STN=>235, :YYYYMMDD=>20100629, :TX=>225}]
24
24
  end
25
25
  end
26
26
 
@@ -43,10 +43,10 @@ class TestHttpService < KNMI::TestCase
43
43
  end
44
44
 
45
45
  should "have result" do
46
- assert_equal @response.data, [
47
- {:STN=>"235", :YYYYMMDD=>"20100427", :HH=>"1", :T=>"88"},
48
- {:STN=>"235", :YYYYMMDD=>"20100427", :HH=>"2", :T=>"79"},
49
- {:STN=>"235", :YYYYMMDD=>"20100427", :HH=>"3", :T=>"73"} ]
46
+ assert_equal @response.data, [
47
+ {:STN=>235, :YYYYMMDD=>20100427, :HH=>1, :T=>88},
48
+ {:STN=>235, :YYYYMMDD=>20100427, :HH=>2, :T=>79},
49
+ {:STN=>235, :YYYYMMDD=>20100427, :HH=>3, :T=>73} ]
50
50
  end
51
51
  end
52
52
 
@@ -122,26 +122,46 @@ class TestKNMI < KNMI::TestCase
122
122
 
123
123
  context "get data over daily timestep" do
124
124
  setup do
125
- station = KNMI.station_by_location(52.165, 4.419)
126
- params = KNMI.parameters(period = "daily", "TX")
127
- start_at = Time.utc(2010, 6, 28)
128
- end_at = Time.utc(2010, 6, 29)
129
- @response = KNMI.get_data(station, params, start_at, end_at)
125
+ @station = KNMI.station_by_location(52.165, 4.419).freeze
126
+ @params = KNMI.parameters(period = "daily", "TX").freeze
127
+ @starts = Time.utc(2010, 6, 28)
128
+ @ends = Time.utc(2010, 6, 29)
129
+ @request = KNMI.get_data(@station, @params, @starts, @ends)
130
+ @data = KNMI.convert(@params, @request)
130
131
  end
131
132
 
132
133
  should "have HTTParty::Response class" do
133
- assert_equal @response.class, KNMI::HttpService
134
+ assert_equal @request.class, KNMI::HttpService
134
135
  end
135
136
 
136
- should "have query" do
137
- assert_equal @response.query, ["stns=210", "vars=TX", "start=20100628", "end=20100629"]
137
+ should "request should have query" do
138
+ assert_equal @request.query, ["stns=210", "vars=TX", "start=20100628", "end=20100629"]
138
139
  end
139
140
 
140
- should "have result" do
141
- assert_equal @response.data, [
142
- {:STN=>"210", :YYYYMMDD=>"20100628", :TX=>"268"},
143
- {:STN=>"210", :YYYYMMDD=>"20100629", :TX=>"239"}]
144
- end
141
+ should "request should have result" do
142
+ assert_equal @request.data, [{:STN=>210, :YYYYMMDD=>20100628, :TX=>268},
143
+ {:STN=>210, :YYYYMMDD=>20100629, :TX=>239}]
144
+ end
145
+
146
+ should "data should have class array" do
147
+ assert_equal @data.class, Array
148
+ end
149
+
150
+ should "data[0] should have class Hash" do
151
+ assert_equal @data[0].class, Hash
152
+ end
153
+
154
+ should "data[0] should have station" do
155
+ assert_equal @data[0][:STN], 210
156
+ end
157
+
158
+ should "data[0] should have result" do
159
+ assert_equal @data[0][:TX], 26.8
160
+ end
161
+
162
+ should "data[0] should have time class" do
163
+ assert_equal @data[0][:YYYYMMDD].class, Time
164
+ end
145
165
  end
146
166
 
147
167
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: knmi
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.2.0
5
+ version: 0.3.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - bullfight
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-05-17 00:00:00 Z
13
+ date: 2011-05-19 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -119,14 +119,13 @@ extensions: []
119
119
 
120
120
  extra_rdoc_files:
121
121
  - LICENSE.txt
122
- - README.rdoc
122
+ - README.mkdn
123
123
  files:
124
- - .DS_Store
125
124
  - .document
126
125
  - Gemfile
127
126
  - Gemfile.lock
128
127
  - LICENSE.txt
129
- - README.rdoc
128
+ - README.mkdn
130
129
  - Rakefile
131
130
  - VERSION
132
131
  - data/current_stations.yml
@@ -134,12 +133,13 @@ files:
134
133
  - data/data_key.yml
135
134
  - data/hourly_data_key.yml
136
135
  - knmi.gemspec
137
- - lib/.DS_Store
138
136
  - lib/knmi.rb
137
+ - lib/knmi/calculations.rb
139
138
  - lib/knmi/httpservice.rb
140
139
  - lib/knmi/parameters.rb
141
140
  - lib/knmi/station.rb
142
141
  - test/helper.rb
142
+ - test/test_calculations.rb
143
143
  - test/test_httpservice.rb
144
144
  - test/test_knmi.rb
145
145
  - test/test_parameters.rb
@@ -157,7 +157,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - ">="
159
159
  - !ruby/object:Gem::Version
160
- hash: 1440179461476455421
160
+ hash: 3402158507789262008
161
161
  segments:
162
162
  - 0
163
163
  version: "0"
@@ -176,6 +176,7 @@ specification_version: 3
176
176
  summary: Ruby API to access daily climate data from the Royal Netherlands Meteorological Institute
177
177
  test_files:
178
178
  - test/helper.rb
179
+ - test/test_calculations.rb
179
180
  - test/test_httpservice.rb
180
181
  - test/test_knmi.rb
181
182
  - test/test_parameters.rb
data/.DS_Store DELETED
Binary file
@@ -1,132 +0,0 @@
1
- = knmi
2
-
3
- Ruby API to access Royal Netherlands Meteorological Institute daily climate data
4
-
5
- Access climatological data as provided by the Royal Netherlands Meteorological Institute through the http get forms for daily and hourly data
6
- http://www.knmi.nl/climatology/daily_data/getdata_day.cgi
7
- http://www.knmi.nl/klimatologie/uurgegevens/getdata_uur.cgi
8
-
9
- Details
10
- * Hourly data (Dutch) - http://www.knmi.nl/klimatologie/uurgegevens/scriptxs-nl.html#uur
11
- * Daily data (English) - http://www.knmi.nl/climatology/daily_data/scriptxs-en.html
12
- * Select Data with a form, listed below are links to metadata about each station http://www.knmi.nl/climatology/daily_data/selection.cgi
13
-
14
-
15
- = Installation
16
- gem install httparty
17
- gem install geokit
18
-
19
- gem install knmi
20
-
21
- = Dependancies
22
- * "httparty", "~> 0.7.7"
23
- * "geokit", "~> 1.5.0"
24
-
25
- = Example Usage
26
- # Get station object by station ID
27
- station = KNMI.station_by_id(235)
28
-
29
- # Get parameter object at the time interval you wish to use "hourly" or "daily"
30
- # Params can be a single term or an array of terms such as "TG" or ["TG", TX]
31
- # Categories can be a single term or an array of terms such as "WIND" or ["WIND", "TEMP"]
32
-
33
- parameter = KNMI.parameters(period = "daily", params = "TX", categories = "")
34
-
35
- # Define Time period of interest
36
- start_at = Time.utc(2010, 6, 28) # 2010 April 28th
37
- end_at = Time.utc(2010, 6, 29) # 2010 April 29th
38
-
39
- # Get Data using previously retrieved objects
40
- data = KNMI.get_data(station, parameter, start_at, end_at)
41
-
42
- = TODO
43
- * function validate data at each time step using associated parameterobject.validate
44
- * function to convert data at each time step using associated parameterobject.conversion
45
-
46
- = Available Data
47
- All available recorded parameters can be found in the file
48
- .data/data_key.yml
49
-
50
- = Daily Data
51
- Parameter Category Description
52
- YYYYMMDD Time Stamp
53
- DDVEC WIND Wind Direction
54
- FHVEC WIND Vector Mean Wind Speed
55
- FG WIND Daily Mean Wind Speed
56
- FHX WIND Maximum Hourly Mean Windspeed
57
- FHXH WIND Hourly Division at Which Maximum Wind Speed Was Measured
58
- FHN WIND Minimum Hourly Mean Windspeed
59
- FHNH WIND Hourly Division at Which Minimum Wind Speed Was Measured
60
- FXX WIND Maximum Instantaneous Wind Speed
61
- FXXH WIND Hourly Division at Which Maximum Instantaneous Wind Speed Was Measured
62
- TG TEMP Daily Mean Temperature
63
- TN TEMP Minimum Temperature
64
- TNH TEMP Hourly Division in Which Minimum Temperature Was Measured
65
- TX TEMP Maximum Temperature
66
- TXH TEMP Hourly Division in Which Maximum Temperature Was Measured
67
- T10N TEMP Minimum Temperature at 10 Cm Above Surface
68
- T10NH TEMP Six Hourly Division at Which Minimum Temperature at 10 Cm Above Surface Was Measured
69
- SQ RADT Sunshine Duration
70
- SP RADT Percent of Maximum Sunshine Duration
71
- Q RADT Global Radiation
72
- DR PRCP Precipitation Duration
73
- RH PRCP Daily Precipitation
74
- RHX PRCP Maximum Hourly Precipitation
75
- RHXH PRCP Hourly Division in Which Maximum Hourly Precipitation Was Measured
76
- EV24 ATMS Potential Evapotranspiration
77
- PG ATMS Daily Mean Sea Level Pressure
78
- PX ATMS Maximum Hourly Sea Level Pressure
79
- PXH ATMS Hourly Division on Which Maximum Hourly Sea Level Pressure Was Measured
80
- PN ATMS Minimum Hourly Sea Level Pressure
81
- PNH ATMS Hourly Division in Which Minimum Hourly Sea Level Pressure Was Measured
82
- VVN VISB Minimum Visibility
83
- VVNH VISB Hourly Division in Which Minimum Visibility Was Measured
84
- VVX VISB Maximum Visibility
85
- VVXH VISB Hourly Division in Which Maximum Visibility Was Measured
86
- NG VISB Mean Daily Cloud Cover
87
- UG ATMS Daily Mean Relative Humidity
88
- UX ATMS Maximum Relative Humidity
89
- UXH ATMS Hourly Division in Which Maximum Relative Humidity Was Measured
90
- UN ATMS Minimum Relative Humidity
91
- UNH ATMS Hourly Division in Which Minimum Relative Humidity Was Measured
92
-
93
- = Hourly Data
94
- Parameter Category Description
95
- YYYYMMDD Time Stamp
96
- HH Hour
97
- DD WIND Mean wind direction during the 10-minute period preceding the time of observation
98
- FH WIND Hourly mean wind speed
99
- FF WIND Mean wind speed
100
- FX WIND Maximum wind gust
101
- T TEMP Air Temperature at 1.5 m
102
- T10N TEMP Minimum Air Temperature at 10 cm in the preceding 6 hours
103
- TD TEMP Dew Point Temperature
104
- SQ RDTN Sunshine Duration
105
- Q RDTN Golbal Radiation
106
- DR PRCP Precipitation Duration
107
- RH PRCP Precipitation
108
- P ATMS Air Pressure
109
- VV VISB Visibility
110
- N VISB Cloud Cover
111
- U ATMS Relative Humidity
112
- M WTHR Fog
113
- R WTHR Rainfall
114
- S WTHR Snow
115
- O WTHR Thunder
116
- Y WTHR Ice
117
- WW WTHR Weather Code
118
-
119
-
120
- = Please Note the disclaimer included in the header source header
121
- # DEZE GEGEVENS MOGEN VRIJ WORDEN GEBRUIKT MITS DE VOLGENDE BRONVERMELDING WORDT GEGEVEN:
122
- # KONINKLIJK NEDERLANDS METEOROLOGISCH INSTITUUT (KNMI)
123
- #
124
- # THESE DATA CAN BE USED FREELY PROVIDED THAT THE FOLLOWING SOURCE IS ACKNOWLEDGED:
125
- # ROYAL NETHERLANDS METEOROLOGICAL INSTITUTE
126
-
127
-
128
- == Copyright
129
-
130
- Copyright (c) 2011 Patrick Galvin Schmitz p.schmitz@gmail.com. See LICENSE.txt for
131
- further details.
132
-
Binary file