geonames_local 3.3.0 → 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|