timezone_lat_lon 1.0 → 1.0.1
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 +4 -4
- data/lib/timezone_lat_lon.rb +1 -3
- data/lib/timezone_lat_lon/loader.rb +11 -4
- data/lib/timezone_lat_lon/version.rb +1 -1
- data/spec/timezone_lat_lon_spec.rb +50 -0
- metadata +4 -18
- data/scripts/process-timezones.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2d1bd9290f69fa622101dc58298187b5661692211700ab4b9137f060c13492f
|
4
|
+
data.tar.gz: c6903a82828a604c3ad63ef123a96df9366cdf381be2c79b30cf9e9cddf92cf9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 954e36f11957d0e78da312072ac999e19c003aa2aeb0dbc1619191bd2f1a5d7f1a953d694576cb8af01316f9f51921c93bfe119d6501961ba4fd7f16efaf8c67
|
7
|
+
data.tar.gz: fd7dc6ae00595de75e1c6cde22edd87d214e7f6aec6ebe7c7640540419eadc35131e2767dc23b9c6addb10c37624abf60af2d306741c53875b9119804b5f3a50
|
data/lib/timezone_lat_lon.rb
CHANGED
@@ -5,10 +5,8 @@ module TimezoneLatLon
|
|
5
5
|
class << self
|
6
6
|
include Search
|
7
7
|
|
8
|
-
@@loader = TimezoneLatLon::Loader.new(geojson_filename: 'combined-compressed.json')
|
9
|
-
|
10
8
|
def loader
|
11
|
-
|
9
|
+
@@loader ||= TimezoneLatLon::Loader.new(geojson_filename: 'combined-compressed.json')
|
12
10
|
end
|
13
11
|
end
|
14
12
|
end
|
@@ -6,6 +6,8 @@ module TimezoneLatLon
|
|
6
6
|
class Loader
|
7
7
|
attr_accessor :config, :timezone_data
|
8
8
|
|
9
|
+
CACHE_FILE_NAME = 'time_zones.cache'
|
10
|
+
|
9
11
|
def initialize(config = {})
|
10
12
|
@config = {
|
11
13
|
geojson_filename: 'combined.json'
|
@@ -17,10 +19,10 @@ module TimezoneLatLon
|
|
17
19
|
private
|
18
20
|
|
19
21
|
def load_data
|
20
|
-
|
21
|
-
|
22
|
-
@timezone_data = Marshal.load(File.open(
|
23
|
-
|
22
|
+
timezone_dump_file = File.expand_path(File.join('..', '..', 'data', CACHE_FILE_NAME), __dir__)
|
23
|
+
if File.exists?(timezone_dump_file)
|
24
|
+
@timezone_data = Marshal.load(File.open(timezone_dump_file).read)
|
25
|
+
else # timezone_dump_file does not exist!
|
24
26
|
self.load_data_from_geojson
|
25
27
|
end
|
26
28
|
end
|
@@ -41,6 +43,11 @@ module TimezoneLatLon
|
|
41
43
|
attributes: attributes,
|
42
44
|
}
|
43
45
|
end
|
46
|
+
|
47
|
+
timezone_dump_file = File.expand_path(File.join('..', '..', 'data', CACHE_FILE_NAME), __dir__)
|
48
|
+
File.open(timezone_dump_file, "w") do |f|
|
49
|
+
f.write(Marshal.dump(@timezone_data))
|
50
|
+
end
|
44
51
|
end
|
45
52
|
end
|
46
53
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
describe 'TimezoneLatLon' do
|
2
|
+
latlon1 = { lat: 49.886505, lon: 25.167341 } # Ukraine
|
3
|
+
latlon2 = { lat: 35.852462, lon: 14.447913 } # Malta
|
4
|
+
latlon3 = { lat: 25.303352, lon: -156.278805 } # Pacific Ocean
|
5
|
+
|
6
|
+
# -- Test storing/loading time_zones.cache after initialization
|
7
|
+
describe 'cache file' do
|
8
|
+
CACHE_FILE = './data/time_zones.cache'
|
9
|
+
|
10
|
+
before :example do
|
11
|
+
cache_exists = File.exists?(CACHE_FILE)
|
12
|
+
File.delete(CACHE_FILE) if cache_exists
|
13
|
+
|
14
|
+
require 'timezone_lat_lon'
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'on first run' do
|
18
|
+
it 'is created' do
|
19
|
+
TimezoneLatLon.find_timezone(latlon3)
|
20
|
+
cache_exists_after = File.exists?(CACHE_FILE)
|
21
|
+
expect(cache_exists_after).to eql(true)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# -- Test the find_timezone method
|
27
|
+
describe '.find_timezone(lat:, lon:)' do
|
28
|
+
before :context do
|
29
|
+
require 'timezone_lat_lon'
|
30
|
+
end
|
31
|
+
|
32
|
+
context "given #{latlon1.inspect}" do
|
33
|
+
it "returns Europe/Ukraine" do
|
34
|
+
expect(TimezoneLatLon.find_timezone(latlon1)).to eql(TZInfo::Timezone.get('Europe/Kiev'))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "given #{latlon2}" do
|
39
|
+
it "returns Europe/Malta" do
|
40
|
+
expect(TimezoneLatLon.find_timezone(latlon2)).to eql(TZInfo::Timezone.get('Europe/Malta'))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "given #{latlon3}" do
|
45
|
+
it "returns nil" do
|
46
|
+
expect(TimezoneLatLon.find_timezone(latlon3)).to eql(nil)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timezone_lat_lon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert J. Schofield
|
@@ -80,21 +80,7 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '2.0'
|
83
|
-
|
84
|
-
name: byebug
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '11.1'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '11.1'
|
97
|
-
description: Find timezones by latitude and longitude.
|
83
|
+
description: Utilities for looking up the timezone contained by a latitude and longitude.
|
98
84
|
email: rjschofield96@gmail.com
|
99
85
|
executables: []
|
100
86
|
extensions: []
|
@@ -107,7 +93,7 @@ files:
|
|
107
93
|
- lib/timezone_lat_lon/loader.rb
|
108
94
|
- lib/timezone_lat_lon/search.rb
|
109
95
|
- lib/timezone_lat_lon/version.rb
|
110
|
-
-
|
96
|
+
- spec/timezone_lat_lon_spec.rb
|
111
97
|
homepage: https://github.com/rjschof/timezone_lat_lon
|
112
98
|
licenses:
|
113
99
|
- MIT
|
@@ -130,5 +116,5 @@ requirements: []
|
|
130
116
|
rubygems_version: 3.1.4
|
131
117
|
signing_key:
|
132
118
|
specification_version: 4
|
133
|
-
summary:
|
119
|
+
summary: Timezone lookup by latitude and longitude
|
134
120
|
test_files: []
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'benchmark'
|
2
|
-
require 'byebug'
|
3
|
-
require 'kdtree'
|
4
|
-
require 'oj'
|
5
|
-
require 'rgeo/shapefile'
|
6
|
-
require 'rgeo/geo_json'
|
7
|
-
require 'ruby-progressbar'
|
8
|
-
|
9
|
-
# -- Global variables
|
10
|
-
$timezone_data = []
|
11
|
-
|
12
|
-
# -- Helper methods
|
13
|
-
def find_containing_timezone(lat:, lon:)
|
14
|
-
factory = RGeo::Geographic.simple_mercator_factory
|
15
|
-
point = factory.point(lon, lat)
|
16
|
-
return $timezone_data.find { |sd| sd[:geometry].contains?(point) }
|
17
|
-
end
|
18
|
-
|
19
|
-
def load_geojson(geojson_path)
|
20
|
-
load_benchmark = Benchmark.measure do
|
21
|
-
file = File.open(geojson_path)
|
22
|
-
content = file.read
|
23
|
-
geojson_obj = Oj.load(content)
|
24
|
-
features = RGeo::GeoJSON.decode(geojson_obj)
|
25
|
-
features.each do |feature|
|
26
|
-
attributes = feature.keys.map do |key|
|
27
|
-
[key, feature[key]]
|
28
|
-
end.to_h
|
29
|
-
|
30
|
-
$timezone_data << {
|
31
|
-
geometry: feature.geometry,
|
32
|
-
attributes: attributes,
|
33
|
-
}
|
34
|
-
end
|
35
|
-
end
|
36
|
-
puts("Load Benchmark: #{load_benchmark}")
|
37
|
-
end
|
38
|
-
|
39
|
-
def load_shapefile(shapefile_path)
|
40
|
-
load_benchmark = Benchmark.measure do
|
41
|
-
RGeo::Shapefile::Reader.open(shapefile_path) do |file|
|
42
|
-
file.each do |record|
|
43
|
-
progress.increment
|
44
|
-
$timezone_data << {
|
45
|
-
geometry: record.geometry,
|
46
|
-
attributes: record.attributes
|
47
|
-
}
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
puts("Load Benchmark: #{load_benchmark}")
|
52
|
-
end
|
53
|
-
|
54
|
-
def test_timezone_check(lat:, lon:)
|
55
|
-
timezone = nil
|
56
|
-
benchmark = Benchmark.measure do
|
57
|
-
timezone = find_containing_timezone(lat: lat, lon: lon)
|
58
|
-
end
|
59
|
-
timezone_attrs = timezone.nil? ? nil : timezone[:attributes]
|
60
|
-
puts("Timezone for [#{lat}, #{lon}]: #{timezone_attrs || 'NOT_FOUND'} - #{benchmark}")
|
61
|
-
end
|
62
|
-
|
63
|
-
# -- Script processing
|
64
|
-
# load_shapefile('./data/timezones/shapefile/combined-shapefile.shp')
|
65
|
-
begin
|
66
|
-
timezone_data = File.open(File.expand_path("../../data/time_zones.dump", __FILE__)).read
|
67
|
-
$timezone_data = Marshal.load(timezone_data)
|
68
|
-
puts('Loaded timezone data from from dumpfile.')
|
69
|
-
rescue => exception
|
70
|
-
puts("Exception: #{exception.inspect}")
|
71
|
-
load_geojson('./data/timezones/geojson/combined-3.json')
|
72
|
-
File.open(File.expand_path("../../data/time_zones.dump", __FILE__),"w") do |f|
|
73
|
-
f.write(Marshal.dump($timezone_data))
|
74
|
-
end
|
75
|
-
puts('Loaded timezone data from scratch.')
|
76
|
-
end
|
77
|
-
|
78
|
-
puts("---------- Testing ----------")
|
79
|
-
latlon_list = [
|
80
|
-
{ lat: 49.886505, lon: 25.167341 }, # Ukraine
|
81
|
-
{ lat: 35.852462, lon: 14.447913 }, # Malta
|
82
|
-
{ lat: 23.058549, lon: 84.893071 }, # India... Jharkhand
|
83
|
-
{ lat: 25.303352, lon: -156.278805 }, # Pacific Ocean .. Near Hawaii
|
84
|
-
]
|
85
|
-
latlon_list.each do |latlon|
|
86
|
-
test_timezone_check(latlon)
|
87
|
-
end
|