Module: GitFit::Elevation::DemCache

Defined in:
lib/git_fit/elevation/dem_cache.rb

Constant Summary collapse

DEM_CACHE_DIR =
ENV.fetch('GIT_FIT_DEM_CACHE_DIR', 'data/cache/dem')
CACHE_FILE =
File.join(DEM_CACHE_DIR, 'dem.json')
GRID =
0.0003

Class Method Summary collapse

Class Method Details

.grid_key(lat, lng) ⇒ Object



14
15
16
# File 'lib/git_fit/elevation/dem_cache.rb', line 14

def grid_key(lat, lng)
  "#{(lat / GRID).round}/#{(lng / GRID).round}"
end

.load_allObject



18
19
20
21
22
23
# File 'lib/git_fit/elevation/dem_cache.rb', line 18

def load_all
  return {} unless File.exist?(CACHE_FILE)
  JSON.parse(File.read(CACHE_FILE))
rescue StandardError
  {}
end

.load_batch(slice) ⇒ Object



25
26
27
28
29
30
31
32
33
# File 'lib/git_fit/elevation/dem_cache.rb', line 25

def load_batch(slice)
  all = load_all
  results = {}
  slice.each do |lat, lng|
    gk = grid_key(lat, lng)
    results[gk] = all[gk] if all.key?(gk)
  end
  results
end

.missing_keys(slice, cached) ⇒ Object



35
36
37
# File 'lib/git_fit/elevation/dem_cache.rb', line 35

def missing_keys(slice, cached)
  slice.reject { |lat, lng| cached.key?(grid_key(lat, lng)) }
end

.save_batch(elevs_by_gk) ⇒ Object



39
40
41
42
43
44
45
46
47
# File 'lib/git_fit/elevation/dem_cache.rb', line 39

def save_batch(elevs_by_gk)
  return if elevs_by_gk.empty?
  FileUtils.mkdir_p(DEM_CACHE_DIR)
  existing = load_all
  elevs_by_gk.each { |gk, elev| existing[gk] = elev }
  File.write(CACHE_FILE, JSON.generate(existing))
rescue StandardError => e
  warn "DEM cache write error: #{e.message}"
end