Class: HasGeoLookup::BoundaryImporter

Inherits:
Object
  • Object
show all
Defined in:
lib/has_geo_lookup/boundary_importer.rb

Class Method Summary collapse

Class Method Details

.import_country(iso2_code, options = {}) ⇒ Hash

Import all available ADM levels (1-4) for a country

Parameters:

  • iso2_code (String)

    2-letter ISO country code (e.g., "US", "FR")

  • options (Hash) (defaults to: {})

    Import options

Options Hash (options):

  • :cache_dir (String)

    Directory for caching downloaded files

  • :verbose (Boolean)

    Enable detailed progress output (default: true)

Returns:

  • (Hash)

    Import results with :success, :total_processed, :errors keys

Raises:

  • (ArgumentError)


21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/has_geo_lookup/boundary_importer.rb', line 21

def import_country(iso2_code, options = {})
  iso2 = iso2_code&.upcase
  raise ArgumentError, "Please provide a 2-letter country code" unless iso2
  
  cache_dir = options[:cache_dir] || default_cache_dir
  verbose = options.fetch(:verbose, true)
  
  # Convert ISO2 to ISO3 using iso_3166 gem with fallbacks
  iso3, country_name = resolve_country_codes(iso2, verbose)
  
  errors = []
  total_processed = 0
  factory = create_geometry_factory
  
  (1..5).each do |level|
    adm = "ADM#{level}"
    puts "📍 Importing #{adm} boundaries..." if verbose
    
    result = import_adm_level(iso3, adm, factory, cache_dir, errors, verbose)
    
    unless result[:success]
      puts "⏭️  Skipping remaining ADM levels (#{adm} and higher not available)" if verbose
      break
    end
    
    total_processed += result[:count]
  end
  
  {
    success: true,
    total_processed: total_processed,
    errors: errors,
    country: { iso2: iso2, iso3: iso3, name: country_name }
  }
end

.import_level(iso2_code, adm_level, options = {}) ⇒ Hash

Import boundaries for a specific ADM level

Parameters:

  • iso2_code (String)

    2-letter ISO country code

  • adm_level (String)

    Administrative level ("ADM1", "ADM2", "ADM3", "ADM4", "ADM5")

  • options (Hash) (defaults to: {})

    Import options (same as import_country)

Returns:

  • (Hash)

    Import results

Raises:

  • (ArgumentError)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/has_geo_lookup/boundary_importer.rb', line 64

def import_level(iso2_code, adm_level, options = {})
  iso2 = iso2_code&.upcase
  raise ArgumentError, "Please provide a 2-letter country code" unless iso2
  raise ArgumentError, "Please provide ADM level (ADM1-ADM5)" unless adm_level&.match?(/\AADM[1-5]\z/)
  
  cache_dir = options[:cache_dir] || default_cache_dir
  verbose = options.fetch(:verbose, true)
  
  iso3, country_name = resolve_country_codes(iso2, verbose)
  
  errors = []
  factory = create_geometry_factory
  
  result = import_adm_level(iso3, adm_level, factory, cache_dir, errors, verbose)
  
  {
    success: result[:success],
    total_processed: result[:count],
    errors: errors,
    country: { iso2: iso2, iso3: iso3, name: country_name }
  }
end