Sha256: 298592354beb3af089ef918193e168c0d3ddaa204fccd1976a46f2b4eccfd25f
Contents?: true
Size: 1.12 KB
Versions: 3
Compression:
Stored size: 1.12 KB
Contents
# frozen_string_literal: true require 'offline_geocoder/version' require 'csv' require 'geokdtree' class OfflineGeocoder CSV_PATH = File.expand_path('../og_cities1000.csv', __dir__) def initialize return if defined? @@cities @@cities = [] @@tree = Geokdtree::Tree.new(2) @@table = [] index = 0 CSV.foreach(CSV_PATH, headers: true, header_converters: :symbol) do |row| as_hash = row.to_h as_hash[:lat] = as_hash[:lat].to_f as_hash[:lon] = as_hash[:lon].to_f @@tree.insert([row[:lat], row[:lon]], index) @@table << as_hash index += 1 end end def search(query, lon = nil) lat, lon = lon.nil? ? [query[:lat], query[:lon]] : [query, lon] if lat && lon search_by_latlon(lat.to_f, lon.to_f) else search_by_attr(query) end end # Hide internal variables def inspect "#<#{self.class}:0x#{format('%<id>014x', id: (object_id << 1))}>" end private def search_by_latlon(lat, lon) @@table[@@tree.nearest([lat, lon]).data.to_i].to_h end def search_by_attr(query = {}) @@table.select { |object| object >= query }.first end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
offline_geocoder-0.3 | lib/offline_geocoder.rb |
offline_geocoder-0.2.1 | lib/offline_geocoder.rb |
offline_geocoder-0.2.0 | lib/offline_geocoder.rb |