geonames_local 3.3.0 → 3.3.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/README.md +15 -9
- data/bin/geonames +2 -2
- data/geonames_local.gemspec +2 -2
- data/lib/geonames_local.rb +0 -2
- data/lib/geonames_local/cli.rb +43 -38
- data/lib/geonames_local/data/dump.rb +2 -3
- data/lib/geonames_local/features/spot.rb +23 -23
- data/lib/geonames_local/models/mongodb.rb +21 -15
- data/lib/geonames_local/version.rb +1 -1
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c788cde1271fbcde5596ca18134547b68ebe2488
|
4
|
+
data.tar.gz: 983752fea10114e374c21e75e23b5e21808c31fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7a08a957601e2663126bd6fe7c5021b46b6527e0e15a1549e8b6971b5ad688443f82c73aad92ba44e93f4e48567a6034a108c742c24d92bb472af2fb92ee369
|
7
|
+
data.tar.gz: eb7b597058aa178b5e8f28f1d565a9b586dd7099d3b6675b3d32bc99ca45c1fc13d2b7f3020b532d5e12a7ae0af69f71af223e95cbb10b1ba13413a161f31204
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@ Use
|
|
11
11
|
|
12
12
|
Install where you want to populate the DB:
|
13
13
|
|
14
|
-
|
14
|
+
gem install geonames_local
|
15
15
|
|
16
16
|
|
17
17
|
You will also need in your system:
|
@@ -25,24 +25,30 @@ Config
|
|
25
25
|
|
26
26
|
Create a config yml file:
|
27
27
|
|
28
|
-
|
29
|
-
geonames init
|
30
|
-
|
28
|
+
geonames init
|
31
29
|
|
32
30
|
Will generate a "geonames.yml" file on your folder.
|
33
31
|
The file is self explanatory.
|
34
32
|
|
35
|
-
|
33
|
+
Geonames splits the nations/countries database from the rest, so:
|
34
|
+
|
35
|
+
|
36
|
+
To populate the nations database for the first time use:
|
37
|
+
|
38
|
+
geonames -c geoconfig.yml nations
|
39
|
+
|
40
|
+
|
41
|
+
Then you can run geonames to populate regions/cities...
|
42
|
+
|
43
|
+
geonames -c geonames.yml
|
36
44
|
|
37
45
|
To run it. Use -v for verbose.
|
38
46
|
|
39
|
-
If you are not sure your country/nation code, use:
|
40
47
|
|
41
|
-
|
48
|
+
If you are not sure your country/nation code, use:
|
42
49
|
|
43
|
-
|
50
|
+
geonames list <search>
|
44
51
|
|
45
|
-
geonames -c geoconfig.yml nations
|
46
52
|
|
47
53
|
|
48
54
|
Adapters
|
data/bin/geonames
CHANGED
data/geonames_local.gemspec
CHANGED
@@ -25,8 +25,8 @@ Gem::Specification.new do |gem|
|
|
25
25
|
"README.md"
|
26
26
|
]
|
27
27
|
|
28
|
-
gem.add_dependency('mongoid', ['
|
29
|
-
gem.add_dependency('geopolitical', ['
|
28
|
+
gem.add_dependency('mongoid', ['~> 3.1.0'])
|
29
|
+
gem.add_dependency('geopolitical', ['> 0.8.1'])
|
30
30
|
|
31
31
|
gem.post_install_message = %q{
|
32
32
|
Geonames Local
|
data/lib/geonames_local.rb
CHANGED
data/lib/geonames_local/cli.rb
CHANGED
@@ -11,32 +11,35 @@ require 'geonames_local/cli'
|
|
11
11
|
|
12
12
|
|
13
13
|
module Geonames
|
14
|
+
#
|
15
|
+
# Command Line Interface for Geonames Local
|
16
|
+
#
|
17
|
+
#
|
14
18
|
class CLI
|
15
19
|
def self.parse_options(argv)
|
16
20
|
options = {}
|
17
21
|
|
18
22
|
argv.options do |opts|
|
19
|
-
opts.banner =
|
20
|
-
|
21
|
-
|
22
|
-
opts.on(
|
23
|
-
opts.
|
24
|
-
opts.separator
|
25
|
-
opts.
|
26
|
-
opts.on(
|
27
|
-
opts.
|
28
|
-
opts.separator
|
29
|
-
opts.
|
30
|
-
opts.on(
|
31
|
-
opts.on(
|
32
|
-
opts.on(
|
33
|
-
opts.
|
34
|
-
opts.separator
|
35
|
-
opts.
|
36
|
-
opts.on(
|
37
|
-
opts.on(
|
38
|
-
opts.
|
39
|
-
opts.separator ""
|
23
|
+
opts.banner = 'Geonames Command Line Usage\n\n geonames <nation code(s)> <opts>\n\n\n'
|
24
|
+
|
25
|
+
opts.on('-l', '--level LEVEL', String, 'The level of logging to report') { |level| options[:level] = level }
|
26
|
+
opts.on('-d', '--dump', 'Dump DB before all') { options[:dump] = true }
|
27
|
+
opts.separator ''
|
28
|
+
opts.separator 'Config file:'
|
29
|
+
opts.on('-c', '--config CONFIG', String, 'Geonames Config file path') { |file| options[:config] = file }
|
30
|
+
opts.on('-i', '--import CONFIG', String, 'Geonames Import SHP/DBF/GPX') { |file| options[:shp] = file }
|
31
|
+
opts.separator ''
|
32
|
+
opts.separator 'SHP Options:'
|
33
|
+
opts.on('--map TYPE', Array, 'Use zone/road to import') { |s| options[:map] = s.map(&:to_sym) }
|
34
|
+
opts.on('--type TYPE', String, 'Use zone/road to import') { |s| options[:type] = s }
|
35
|
+
opts.on('--city CITY', String, 'Use city gid to import') { |s| options[:city] = s }
|
36
|
+
opts.on('--nation NATION', String, 'Use nation gid to import') { |s| options[:nation] = s }
|
37
|
+
opts.separator ''
|
38
|
+
opts.separator 'Common Options:'
|
39
|
+
opts.on('-h', '--help', 'Show this message') { puts opts; exit }
|
40
|
+
opts.on('-v', '--verbose', 'Turn on logging to STDOUT') { |bool| options[:verbose] = bool }
|
41
|
+
opts.on('-V', '--version', 'Show version') { puts Geonames::VERSION; exit }
|
42
|
+
opts.separator ''
|
40
43
|
begin
|
41
44
|
opts.parse!
|
42
45
|
if argv.empty? && !options[:config]
|
@@ -56,23 +59,26 @@ module Geonames
|
|
56
59
|
class << self
|
57
60
|
|
58
61
|
def load_config
|
62
|
+
info "Loading config file..."
|
59
63
|
if Opt[:config]
|
60
64
|
Opt.merge! YAML.load(File.read(Opt[:config]))
|
61
65
|
else
|
62
66
|
# Load config/geonames.yml if there's one
|
63
|
-
if File.exists?(cfg = File.join(
|
67
|
+
if File.exists?(cfg = File.join('config', 'geonames.yml'))
|
64
68
|
Opt.merge! YAML.load(File.read(cfg))
|
65
69
|
else
|
66
|
-
|
70
|
+
fail
|
67
71
|
end
|
68
72
|
end
|
69
73
|
rescue
|
70
|
-
info "
|
74
|
+
info "Can't find config file"
|
71
75
|
exit
|
72
76
|
end
|
73
77
|
|
74
78
|
# Ugly but works?
|
75
79
|
def work(argv)
|
80
|
+
info "Geopolitical Local Start!"
|
81
|
+
|
76
82
|
trap(:INT) { stop! }
|
77
83
|
trap(:TERM) { stop! }
|
78
84
|
Opt.merge! parse_options(argv)
|
@@ -90,7 +96,7 @@ module Geonames
|
|
90
96
|
#
|
91
97
|
if argv[0] =~ /list|codes/
|
92
98
|
Codes.each do |key,val|
|
93
|
-
str = [val.values, key.to_s].join(
|
99
|
+
str = [val.values, key.to_s].join(' ').downcase
|
94
100
|
if s = argv[1]
|
95
101
|
next unless str =~ /#{s.downcase}/
|
96
102
|
end
|
@@ -103,9 +109,9 @@ module Geonames
|
|
103
109
|
# If arguments scaffold, config, write down yml.
|
104
110
|
#
|
105
111
|
if argv[0] =~ /scaff|conf|init/
|
106
|
-
fname = (argv[1] ||
|
112
|
+
fname = (argv[1] || 'geonames') + '.yml'
|
107
113
|
if File.exist?(fname)
|
108
|
-
puts "File exists
|
114
|
+
puts "File exists: #{fname}"
|
109
115
|
else
|
110
116
|
puts "Writing to #{fname}"
|
111
117
|
`cp #{File.join(File.dirname(__FILE__), 'config', 'geonames.yml')} #{fname}`
|
@@ -116,7 +122,7 @@ module Geonames
|
|
116
122
|
#
|
117
123
|
# Require georuby optionally
|
118
124
|
#
|
119
|
-
require
|
125
|
+
require 'geo_ruby' if Opt[:mapping] && Opt[:mapping][:geom]
|
120
126
|
|
121
127
|
#
|
122
128
|
# Load config if we got til here
|
@@ -142,7 +148,7 @@ module Geonames
|
|
142
148
|
dump = Geonames::Dump.new(:all, :dump)
|
143
149
|
info "\n---\nTotal #{dump.data.length} parsed."
|
144
150
|
|
145
|
-
info
|
151
|
+
info 'Writing to nations DB'
|
146
152
|
Geonames::Models::MongoWrapper.nations dump.data, Opt[:clean]
|
147
153
|
|
148
154
|
# Regions, Cities....
|
@@ -151,10 +157,10 @@ module Geonames
|
|
151
157
|
dump = Geonames::Dump.new(Opt[:nations], :dump).data
|
152
158
|
info "\n---\nTotal #{dump.size} parsed. #{zip.size} zips."
|
153
159
|
|
154
|
-
info
|
160
|
+
info 'Join dump << zip'
|
155
161
|
dump = unify!(dump, zip).group_by(&:kind)
|
156
162
|
|
157
|
-
info
|
163
|
+
info 'Writing to DB...'
|
158
164
|
Geonames::Models::MongoWrapper.batch dump, Opt[:clean]
|
159
165
|
# info "Writing cities..."
|
160
166
|
# Geonames::Models::City.from_batch dump[:city]
|
@@ -165,13 +171,13 @@ module Geonames
|
|
165
171
|
def load_adapter(name)
|
166
172
|
begin
|
167
173
|
require "geonames_local/models/#{name}"
|
168
|
-
|
169
|
-
|
170
|
-
|
174
|
+
rescue LoadError
|
175
|
+
info "Can't find adapter for #{name}"
|
176
|
+
stop!
|
171
177
|
end
|
172
178
|
end
|
173
179
|
|
174
|
-
def unify!
|
180
|
+
def unify!(dump, zip)
|
175
181
|
start = Time.now
|
176
182
|
dump.map! do |spot|
|
177
183
|
if other = zip.find { |d| d.code == spot.code }
|
@@ -181,16 +187,15 @@ module Geonames
|
|
181
187
|
spot
|
182
188
|
end
|
183
189
|
end
|
184
|
-
info "Done. #{(Time.now-start).to_i}s"
|
190
|
+
info "Done. #{(Time.now - start).to_i}s"
|
185
191
|
dump
|
186
192
|
end
|
187
193
|
|
188
194
|
def stop!
|
189
|
-
puts
|
195
|
+
puts 'Closing Geonames...'
|
190
196
|
exit
|
191
197
|
end
|
192
198
|
|
193
|
-
|
194
199
|
end # class < self
|
195
200
|
|
196
201
|
end # CLI
|
@@ -76,13 +76,12 @@ module Geonames
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
total = Time.now - start
|
79
|
-
info "#{red} #{@kind}
|
79
|
+
info "#{red} #{@kind} spots parsed #{total}s (#{(red / total).to_i}/s)"
|
80
80
|
end
|
81
81
|
rescue Errno::ENOENT => e
|
82
|
-
info "Failed to download #{file}, skipping."
|
82
|
+
info "Failed to download #{file}, skipping. #{e}"
|
83
83
|
end
|
84
84
|
|
85
|
-
|
86
85
|
end
|
87
86
|
|
88
87
|
end
|
@@ -1,4 +1,7 @@
|
|
1
1
|
module Geonames
|
2
|
+
#
|
3
|
+
# Main Ruby Model for Geonames Spot Concept
|
4
|
+
#
|
2
5
|
class Spot
|
3
6
|
attr_accessor :gid, :name, :ascii, :lat, :lon, :nation, :kind,
|
4
7
|
:code, :pop, :tz, :geom, :region, :zip, :abbr, :id
|
@@ -16,7 +19,7 @@ module Geonames
|
|
16
19
|
return unless params.instance_of? String
|
17
20
|
kind == :zip ? parse_zip(params) : parse(params)
|
18
21
|
if @kind == :region
|
19
|
-
@name.gsub!(/Estado d\w\s/,
|
22
|
+
@name.gsub!(/Estado d\w\s/, '')
|
20
23
|
@abbr = get_abbr
|
21
24
|
end
|
22
25
|
end
|
@@ -26,9 +29,9 @@ module Geonames
|
|
26
29
|
# This works 75% of the time in brazil heh
|
27
30
|
#
|
28
31
|
def get_abbr
|
29
|
-
s = @name.split(
|
32
|
+
s = @name.split(' ')
|
30
33
|
if s.length > 1
|
31
|
-
[s[0][0].chr,s[-1][0].chr].map(&:upcase).join
|
34
|
+
[s[0][0].chr, s[-1][0].chr].map(&:upcase).join
|
32
35
|
else
|
33
36
|
s[0][0..1].upcase
|
34
37
|
end
|
@@ -37,9 +40,9 @@ module Geonames
|
|
37
40
|
#
|
38
41
|
# Parse Geonames Dump Export
|
39
42
|
#
|
40
|
-
def parse
|
43
|
+
def parse(row)
|
41
44
|
gid, @name, @ascii, @alternates, lat, lon, feat, kind,
|
42
|
-
@nation,
|
45
|
+
@nation, _cc2, @region, @code, _adm3, _adm4, @pop, @ele,
|
43
46
|
@gtop, @tz, @up = row.split(/\t/)
|
44
47
|
|
45
48
|
@gid = @geoname_id = gid.to_i
|
@@ -53,8 +56,8 @@ module Geonames
|
|
53
56
|
# Parse Geonames Zip Export
|
54
57
|
#
|
55
58
|
def parse_zip(row)
|
56
|
-
|
57
|
-
lat, lon,
|
59
|
+
_nation, @zip, @name, _a1, _a1c, _a2, @code, _a3, _a3c,
|
60
|
+
lat, lon, _acc = row.split(/\t/)
|
58
61
|
|
59
62
|
@kind = :city
|
60
63
|
parse_geom(lat, lon)
|
@@ -67,10 +70,10 @@ module Geonames
|
|
67
70
|
def parse_geom(lat, lon)
|
68
71
|
@lat, @lon = lat.to_f, lon.to_f
|
69
72
|
|
70
|
-
if defined?
|
73
|
+
if defined? GeoRuby
|
71
74
|
@geom = GeoRuby::SimpleFeatures::Point.from_x_y(@lon, @lat)
|
72
75
|
else
|
73
|
-
{ :
|
76
|
+
{ lat: @lat, lon: @lon }
|
74
77
|
end
|
75
78
|
end
|
76
79
|
|
@@ -81,38 +84,35 @@ module Geonames
|
|
81
84
|
#
|
82
85
|
# Parse Time
|
83
86
|
def updated_at
|
84
|
-
Time.utc(*@up.split(
|
87
|
+
Time.utc(*@up.split('-'))
|
85
88
|
end
|
86
89
|
|
87
90
|
# Translate geonames ADMx to models
|
88
91
|
def human_code(code)
|
89
92
|
case code
|
90
|
-
|
91
|
-
|
93
|
+
when 'ADM1' then :region
|
94
|
+
when 'ADM2', 'ADM3', 'ADM4' then :city
|
92
95
|
else :other
|
93
96
|
end
|
94
97
|
end
|
95
98
|
|
96
99
|
class << self
|
97
100
|
|
98
|
-
|
99
|
-
|
101
|
+
attr_accessor :collection
|
102
|
+
|
103
|
+
def nearest(x, y)
|
104
|
+
from_hash(Adapter.find_near(collection, x, y, 1)[0])
|
100
105
|
end
|
101
106
|
|
102
107
|
def from_hash(hsh)
|
103
|
-
spot =
|
104
|
-
hsh.each { |key, val| spot.instance_variable_set("
|
108
|
+
spot = new
|
109
|
+
hsh.each { |key, val| spot.instance_variable_set("@#{key}", val) }
|
105
110
|
spot.geom = GeoRuby::SimpleFeatures::Point.from_x_y(*spot.geom)
|
106
111
|
spot
|
107
112
|
end
|
108
113
|
|
109
|
-
def set_coll(name)
|
110
|
-
@coll = name
|
111
|
-
end
|
112
|
-
|
113
|
-
def collection
|
114
|
-
@coll
|
115
|
-
end
|
116
114
|
end
|
115
|
+
|
117
116
|
end
|
117
|
+
|
118
118
|
end
|
@@ -4,6 +4,7 @@ require 'geopolitical/helpers'
|
|
4
4
|
|
5
5
|
Mongoid.configure do |config|
|
6
6
|
#config.master = Mongo::Connection.new.db("symbolize_test")
|
7
|
+
info "Using Mongoid v#{Mongoid::VERSION}"
|
7
8
|
info "Mongoid connecting to #{Opt[:db]}"
|
8
9
|
config.connect_to(Opt[:db][:name])
|
9
10
|
end
|
@@ -18,14 +19,6 @@ module Geonames
|
|
18
19
|
|
19
20
|
class << self
|
20
21
|
|
21
|
-
def nations data, clean
|
22
|
-
Nation.delete_all if clean
|
23
|
-
data.each do |row|
|
24
|
-
create Nation, parse_nation(row) rescue nil
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
22
|
def batch data, clean = false
|
30
23
|
[Region, City].each(&:delete_all) if clean
|
31
24
|
|
@@ -35,7 +28,7 @@ module Geonames
|
|
35
28
|
end
|
36
29
|
|
37
30
|
def create klass, data
|
38
|
-
info "#{klass}.new #{data}"
|
31
|
+
# info "#{klass}.new #{data}"
|
39
32
|
klass.create! data
|
40
33
|
rescue => e
|
41
34
|
warn "Prob com spot #{e} #{e.backtrace.join("\n")}"
|
@@ -47,6 +40,15 @@ module Geonames
|
|
47
40
|
end
|
48
41
|
end
|
49
42
|
|
43
|
+
#
|
44
|
+
# Parse Nations
|
45
|
+
#
|
46
|
+
def nations data, clean
|
47
|
+
Nation.delete_all if clean
|
48
|
+
data.each do |row|
|
49
|
+
create Nation, parse_nation(row) rescue nil
|
50
|
+
end
|
51
|
+
end
|
50
52
|
|
51
53
|
def parse_nation row
|
52
54
|
abbr, iso3, ison, fips, name, capital, area, pop, continent,
|
@@ -62,7 +64,9 @@ module Geonames
|
|
62
64
|
}
|
63
65
|
end
|
64
66
|
|
65
|
-
|
67
|
+
#
|
68
|
+
# Parse Regions
|
69
|
+
#
|
66
70
|
def parse_region s
|
67
71
|
nation = Nation.find_by(abbr: /#{s.nation}/i)
|
68
72
|
info "Region: #{s.name} / #{s.abbr}"
|
@@ -73,7 +77,10 @@ module Geonames
|
|
73
77
|
}
|
74
78
|
end
|
75
79
|
|
76
|
-
|
80
|
+
#
|
81
|
+
# Parse Cities
|
82
|
+
#
|
83
|
+
def parse_city(s)
|
77
84
|
region = Region.find_by(code: s.region)
|
78
85
|
slug = City.new(slug: s.ascii).slug
|
79
86
|
attempt = slug.dup
|
@@ -95,8 +102,8 @@ module Geonames
|
|
95
102
|
end
|
96
103
|
|
97
104
|
end
|
98
|
-
end
|
99
105
|
|
106
|
+
end
|
100
107
|
|
101
108
|
# class Nation < Geonames::Spot
|
102
109
|
|
@@ -105,7 +112,8 @@ module Geonames
|
|
105
112
|
# end
|
106
113
|
|
107
114
|
# def to_hash
|
108
|
-
# { "gid" => @gid.to_s, "name" => @name,
|
115
|
+
# { "gid" => @gid.to_s, "name" => @name,
|
116
|
+
# "kind" => "nation", "code" => @code}
|
109
117
|
# end
|
110
118
|
|
111
119
|
# def export
|
@@ -117,8 +125,6 @@ module Geonames
|
|
117
125
|
# end
|
118
126
|
# end
|
119
127
|
|
120
|
-
|
121
|
-
|
122
128
|
# class Zip
|
123
129
|
# include Mongoid::Document
|
124
130
|
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geonames_local
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcos Piccinini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mongoid
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: 3.1.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.
|
26
|
+
version: 3.1.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: geopolitical
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.8.
|
33
|
+
version: 0.8.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.8.
|
40
|
+
version: 0.8.1
|
41
41
|
description: Dumps geonames data to feed a local db
|
42
42
|
email: x@nofxx.com
|
43
43
|
executables:
|