geonames_local 0.3.1 → 0.5.0
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.
- data/README.rdoc +26 -11
- data/Rakefile +5 -12
- data/VERSION +1 -1
- data/bin/geonames +1 -1
- data/geonames.yml +3 -2
- data/geonames_local.gemspec +65 -68
- data/lib/geonames_ar.rb +2 -4
- data/lib/geonames_cli.rb +2 -1
- data/lib/geonames_local/adapters/mongodb.rb +2 -1
- data/lib/geonames_local/adapters/postgres.rb +28 -13
- data/lib/geonames_local/cli.rb +6 -56
- data/lib/geonames_local/data/dump.rb +4 -4
- data/lib/geonames_local/data/sync.rb +74 -0
- data/lib/geonames_local/features/spot.rb +9 -4
- data/lib/geonames_local/models/ar.rb +50 -0
- data/lib/geonames_local/{model/country.rb → models/mongo.rb} +27 -26
- data/lib/geonames_local/{mongo/country.rb → models/tokyo.rb} +23 -1
- data/lib/geonames_local.rb +1 -3
- data/spec/geonames_local/adapters/mongodb_spec.rb +14 -9
- data/spec/geonames_local/cli_spec.rb +5 -0
- data/spec/geonames_local/data/dump_spec.rb +4 -0
- data/spec/geonames_local/features/spot_spec.rb +146 -66
- data/spec/geonames_local/models/ar_spec.rb +73 -0
- data/spec/geonames_local/{mongo/city_spec.rb → models/mongo_spec.rb} +7 -8
- data/spec/spec_ar_helper.rb +78 -37
- data/spec/spec_helper.rb +4 -3
- data/spec/spec_mongo_helper.rb +3 -2
- metadata +24 -26
- data/.gitignore +0 -28
- data/lib/geonames_local/model/city.rb +0 -26
- data/lib/geonames_local/model/province.rb +0 -18
- data/lib/geonames_local/mongo/city.rb +0 -7
- data/lib/geonames_local/mongo/province.rb +0 -18
- data/spec/geonames_local/model/ar_spec.rb +0 -19
- data/spec/spec.opts +0 -1
data/README.rdoc
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
= Geonames Local
|
2
2
|
|
3
|
-
Download and store Geonames.org data.
|
3
|
+
Download and store (pg, mongo, tokyo) Geonames.org data.
|
4
4
|
Making every Geoname API operation possible on your servers.
|
5
5
|
No hit limit, fast as possible.
|
6
6
|
|
7
7
|
|
8
8
|
== Usage
|
9
9
|
|
10
|
-
To use
|
10
|
+
To use one adapter, install the corresponding gem:
|
11
11
|
|
12
12
|
PostgreSQL => pg
|
13
|
-
MongoDB =>
|
13
|
+
MongoDB => mongo (optional: mongo_ext)
|
14
14
|
Tokyo => tokyocabinet
|
15
15
|
|
16
|
-
|
16
|
+
You will also need in your system:
|
17
|
+
|
18
|
+
* unzip
|
19
|
+
* curl
|
20
|
+
|
17
21
|
|
18
22
|
=== PostgreSQL
|
19
23
|
|
@@ -35,7 +39,7 @@ The file is self explanatory.
|
|
35
39
|
|
36
40
|
geonames -c geonames.yml
|
37
41
|
|
38
|
-
|
42
|
+
To run it. Use -v for verbose.
|
39
43
|
|
40
44
|
If you are not sure your country code, use:
|
41
45
|
|
@@ -45,7 +49,14 @@ If you are not sure your country code, use:
|
|
45
49
|
== Relational Mapping
|
46
50
|
|
47
51
|
When using PG, this gem will (try) to relational map Geonames
|
48
|
-
data on your scheme.
|
52
|
+
data on your scheme.
|
53
|
+
|
54
|
+
== ActiveRecord
|
55
|
+
|
56
|
+
Check out lib/geonames/models/ar.rb
|
57
|
+
|
58
|
+
I`m wondering the best way (and if it`s a good idea) to auto include'em on rails.
|
59
|
+
For now, just copy as you see fit.
|
49
60
|
|
50
61
|
|
51
62
|
== PostgreSQL
|
@@ -55,6 +66,7 @@ So, supposing ActiveRecord, something like this is possible:
|
|
55
66
|
City.first.province.country.abbr
|
56
67
|
=> "BR"
|
57
68
|
|
69
|
+
|
58
70
|
=== Migration
|
59
71
|
|
60
72
|
Default PG migration:
|
@@ -62,7 +74,7 @@ Default PG migration:
|
|
62
74
|
create_table :cities do |t|
|
63
75
|
t.references :country, :null => false
|
64
76
|
t.references :province
|
65
|
-
t.string :name,
|
77
|
+
t.string :name, :null => false
|
66
78
|
t.point :geom, :srid => 4326
|
67
79
|
t.integer :gid, :zip
|
68
80
|
end
|
@@ -80,22 +92,25 @@ Default PG migration:
|
|
80
92
|
end
|
81
93
|
|
82
94
|
add_index :cities, :name
|
83
|
-
add_index :cities, :gid
|
84
95
|
add_index :cities, :zip
|
85
96
|
add_index :cities, :country_id
|
86
97
|
add_index :cities, :province_id
|
98
|
+
add_index :cities, :gid, :unique => true
|
87
99
|
add_index :cities, :geom, :spatial => true
|
88
100
|
add_index :provinces, :name
|
89
101
|
add_index :provinces, :abbr
|
90
|
-
add_index :provinces, :gid
|
91
102
|
add_index :provinces, :country_id
|
103
|
+
add_index :provinces, :gid, :unique => true
|
104
|
+
add_index :countries, :abbr, :unique => true
|
105
|
+
add_index :countries, :name, :unique => true
|
92
106
|
|
93
107
|
|
94
|
-
==
|
108
|
+
== TODO/Problems
|
95
109
|
|
96
110
|
- Local relational mapping of geonames data
|
97
|
-
- Map geonames fields to your db scheme
|
111
|
+
- Map geonames fields to your db scheme
|
98
112
|
- Countries are a static yml file :/
|
113
|
+
- IP Geonames? http://ipinfodb.com
|
99
114
|
|
100
115
|
|
101
116
|
== Note on Patches/Pull Requests
|
data/Rakefile
CHANGED
@@ -44,20 +44,13 @@ rescue LoadError
|
|
44
44
|
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
45
45
|
end
|
46
46
|
|
47
|
-
require '
|
48
|
-
|
49
|
-
|
50
|
-
spec.
|
47
|
+
require 'rspec/core/rake_task'
|
48
|
+
desc "Runs spec suite"
|
49
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
50
|
+
spec.pattern = 'spec/*_spec.rb'
|
51
|
+
spec.rspec_opts = ['--backtrace --colour']
|
51
52
|
end
|
52
53
|
|
53
|
-
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
54
|
-
spec.libs << 'lib' << 'spec'
|
55
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
56
|
-
spec.rcov = true
|
57
|
-
end
|
58
|
-
|
59
|
-
task :spec => :check_dependencies
|
60
|
-
|
61
54
|
task :default => :spec
|
62
55
|
|
63
56
|
require 'rake/rdoctask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
data/bin/geonames
CHANGED
data/geonames.yml
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
#
|
2
2
|
# Geonames Local Config Example
|
3
3
|
#
|
4
|
-
:store:
|
4
|
+
:store: postgres
|
5
5
|
:codes: [br]
|
6
6
|
:level: city
|
7
|
+
:min_pop: 100000
|
7
8
|
:mapping:
|
8
9
|
:name: name
|
9
10
|
:geom: true
|
10
11
|
:db:
|
11
12
|
:host: localhost
|
12
|
-
:dbname:
|
13
|
+
:dbname: geonames_ar
|
13
14
|
:user: postgres
|
14
15
|
:password:
|
data/geonames_local.gemspec
CHANGED
@@ -1,74 +1,71 @@
|
|
1
1
|
# Generated by jeweler
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{geonames_local}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.5.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marcos Piccinini"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-04-24}
|
13
13
|
s.default_executable = %q{geonames}
|
14
14
|
s.description = %q{Dump and feed a tokyo cabinet for local geonames search}
|
15
15
|
s.email = %q{x@nofxx.com}
|
16
16
|
s.executables = ["geonames"]
|
17
17
|
s.extra_rdoc_files = [
|
18
18
|
"LICENSE",
|
19
|
-
|
19
|
+
"README.rdoc"
|
20
20
|
]
|
21
21
|
s.files = [
|
22
22
|
".document",
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
"spec/spec_mongo_helper.rb",
|
70
|
-
"task/benchmark.rb",
|
71
|
-
"task/benchmark_cabinet.rb"
|
23
|
+
"LICENSE",
|
24
|
+
"README.rdoc",
|
25
|
+
"Rakefile",
|
26
|
+
"VERSION",
|
27
|
+
"bin/geonames",
|
28
|
+
"geonames.yml",
|
29
|
+
"geonames_local.gemspec",
|
30
|
+
"lib/geonames_ar.rb",
|
31
|
+
"lib/geonames_cli.rb",
|
32
|
+
"lib/geonames_local.rb",
|
33
|
+
"lib/geonames_local/adapters/mongodb.rb",
|
34
|
+
"lib/geonames_local/adapters/postgres.rb",
|
35
|
+
"lib/geonames_local/adapters/tokyo.rb",
|
36
|
+
"lib/geonames_local/cli.rb",
|
37
|
+
"lib/geonames_local/config/codes.yml",
|
38
|
+
"lib/geonames_local/config/geonames.sql",
|
39
|
+
"lib/geonames_local/config/geonames.yml",
|
40
|
+
"lib/geonames_local/data/dump.rb",
|
41
|
+
"lib/geonames_local/data/export.rb",
|
42
|
+
"lib/geonames_local/data/shp.rb",
|
43
|
+
"lib/geonames_local/data/sync.rb",
|
44
|
+
"lib/geonames_local/features/road.rb",
|
45
|
+
"lib/geonames_local/features/spot.rb",
|
46
|
+
"lib/geonames_local/features/zone.rb",
|
47
|
+
"lib/geonames_local/geonames.rb",
|
48
|
+
"lib/geonames_local/models/ar.rb",
|
49
|
+
"lib/geonames_local/models/mongo.rb",
|
50
|
+
"lib/geonames_local/models/tokyo.rb",
|
51
|
+
"spec/geonames_local/adapters/mongodb_spec.rb",
|
52
|
+
"spec/geonames_local/adapters/postgres_spec.rb",
|
53
|
+
"spec/geonames_local/adapters/tokyo_spec.rb",
|
54
|
+
"spec/geonames_local/cli_spec.rb",
|
55
|
+
"spec/geonames_local/data/cache_spec.rb",
|
56
|
+
"spec/geonames_local/data/dump_spec.rb",
|
57
|
+
"spec/geonames_local/data/shp_spec.rb",
|
58
|
+
"spec/geonames_local/features/road_spec.rb",
|
59
|
+
"spec/geonames_local/features/spot_spec.rb",
|
60
|
+
"spec/geonames_local/features/zone_spec.rb",
|
61
|
+
"spec/geonames_local/models/ar_spec.rb",
|
62
|
+
"spec/geonames_local/models/mongo_spec.rb",
|
63
|
+
"spec/geonames_local_spec.rb",
|
64
|
+
"spec/spec_ar_helper.rb",
|
65
|
+
"spec/spec_helper.rb",
|
66
|
+
"spec/spec_mongo_helper.rb",
|
67
|
+
"task/benchmark.rb",
|
68
|
+
"task/benchmark_cabinet.rb"
|
72
69
|
]
|
73
70
|
s.homepage = %q{http://github.com/nofxx/geonames_local}
|
74
71
|
s.post_install_message = %q{
|
@@ -94,26 +91,26 @@ http://github.com/mongodb/mongo-ruby-driver
|
|
94
91
|
|
95
92
|
Have fun because:
|
96
93
|
}
|
97
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
98
94
|
s.require_paths = ["lib"]
|
99
95
|
s.rubygems_version = %q{1.3.7}
|
100
96
|
s.summary = %q{Dump and feed a tokyo local geonames db}
|
101
97
|
s.test_files = [
|
98
|
+
"spec/geonames_local/adapters/mongodb_spec.rb",
|
99
|
+
"spec/geonames_local/adapters/postgres_spec.rb",
|
100
|
+
"spec/geonames_local/adapters/tokyo_spec.rb",
|
101
|
+
"spec/geonames_local/cli_spec.rb",
|
102
|
+
"spec/geonames_local/data/cache_spec.rb",
|
103
|
+
"spec/geonames_local/data/dump_spec.rb",
|
104
|
+
"spec/geonames_local/data/shp_spec.rb",
|
105
|
+
"spec/geonames_local/features/road_spec.rb",
|
106
|
+
"spec/geonames_local/features/spot_spec.rb",
|
107
|
+
"spec/geonames_local/features/zone_spec.rb",
|
108
|
+
"spec/geonames_local/models/ar_spec.rb",
|
109
|
+
"spec/geonames_local/models/mongo_spec.rb",
|
110
|
+
"spec/geonames_local_spec.rb",
|
102
111
|
"spec/spec_ar_helper.rb",
|
103
|
-
|
104
|
-
|
105
|
-
"spec/geonames_local/data/cache_spec.rb",
|
106
|
-
"spec/geonames_local/model/ar_spec.rb",
|
107
|
-
"spec/geonames_local/mongo/city_spec.rb",
|
108
|
-
"spec/geonames_local/cli_spec.rb",
|
109
|
-
"spec/geonames_local/adapters/postgres_spec.rb",
|
110
|
-
"spec/geonames_local/adapters/tokyo_spec.rb",
|
111
|
-
"spec/geonames_local/adapters/mongodb_spec.rb",
|
112
|
-
"spec/geonames_local/features/spot_spec.rb",
|
113
|
-
"spec/geonames_local/features/zone_spec.rb",
|
114
|
-
"spec/geonames_local/features/road_spec.rb",
|
115
|
-
"spec/spec_mongo_helper.rb",
|
116
|
-
"spec/geonames_local_spec.rb"
|
112
|
+
"spec/spec_helper.rb",
|
113
|
+
"spec/spec_mongo_helper.rb"
|
117
114
|
]
|
118
115
|
|
119
116
|
if s.respond_to? :specification_version then
|
data/lib/geonames_ar.rb
CHANGED
@@ -4,11 +4,9 @@
|
|
4
4
|
$:.unshift(File.dirname(__FILE__)) unless
|
5
5
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
6
6
|
|
7
|
+
# Adapter = Geonames::Postgres.new(Opt[:db])
|
7
8
|
# Require Libs
|
8
9
|
require 'geonames_local/geonames'
|
9
10
|
|
10
|
-
require 'geonames_local/
|
11
|
-
require 'geonames_local/model/province'
|
12
|
-
require 'geonames_local/model/city'
|
11
|
+
require 'geonames_local/models/ar'
|
13
12
|
#require 'geonames_local/data/shp'
|
14
|
-
|
data/lib/geonames_cli.rb
CHANGED
@@ -6,8 +6,9 @@ $:.unshift(File.dirname(__FILE__)) unless
|
|
6
6
|
|
7
7
|
# Require CLI Stuff
|
8
8
|
require 'geonames_local/geonames'
|
9
|
-
require 'geonames_local/cli'
|
10
9
|
require 'geonames_local/data/shp'
|
11
10
|
require 'geonames_local/data/dump'
|
11
|
+
require 'geonames_local/data/sync'
|
12
12
|
require 'geonames_local/data/export'
|
13
|
+
require 'geonames_local/cli'
|
13
14
|
|
@@ -78,7 +78,8 @@ module Geonames
|
|
78
78
|
# getNear command returns distance too
|
79
79
|
# <1.9 needs OrderedHash
|
80
80
|
def near(resource, x, y, limit=nil)
|
81
|
-
|
81
|
+
# FIXME: Better explicity require OrderedHash?
|
82
|
+
cmd = Object.const_defined?("OrderedHash") ? OrderedHash.new : { }
|
82
83
|
cmd["geoNear"] = resource
|
83
84
|
cmd["near"] = sin_proj(x,y)
|
84
85
|
cmd["num"] = limit if limit
|
@@ -5,27 +5,30 @@ module Geonames
|
|
5
5
|
Countries = {}
|
6
6
|
Provinces = {}
|
7
7
|
|
8
|
-
def initialize(opts) #table, addr = "localhost", port = 5432)
|
8
|
+
def initialize(opts={}) #table, addr = "localhost", port = 5432)
|
9
9
|
@conn = PGconn.new(opts)
|
10
10
|
end
|
11
11
|
|
12
12
|
#
|
13
13
|
# Get Country and Province ID from the DB
|
14
|
+
#
|
15
|
+
# Maps the FKs ids correctly for our bank
|
16
|
+
#
|
14
17
|
def get_some_ids(some)
|
15
|
-
|
18
|
+
cid = Countries[some.country] ||=
|
16
19
|
@conn.exec("SELECT countries.id FROM countries WHERE UPPER(countries.abbr) = UPPER('#{some.country}')")[0]["id"] rescue nil
|
17
|
-
|
20
|
+
cid ||= write("countries", {:name => Codes[some.country.downcase.to_sym][:pt_br], :abbr => some.country })
|
18
21
|
|
19
|
-
|
20
|
-
|
22
|
+
pid = nil
|
23
|
+
tid = nil
|
21
24
|
if some.kind_of? Spot
|
22
|
-
|
25
|
+
pid = Provinces[some.province] ||= find("provinces", Cache[:provinces].
|
23
26
|
find{ |p| p.province == some.province}.gid)
|
24
27
|
else
|
25
|
-
|
26
|
-
|
28
|
+
tid = find("cities", some.city)
|
29
|
+
pid = @conn.exec("SELECT cities.province_id FROM cities WHERE cities.id = #{tid}")[0]["province_id"] rescue nil
|
27
30
|
end
|
28
|
-
[
|
31
|
+
[cid, pid, tid]
|
29
32
|
end
|
30
33
|
|
31
34
|
#
|
@@ -33,22 +36,25 @@ module Geonames
|
|
33
36
|
def insert(table, some)
|
34
37
|
country_id, province_id, city_id = get_some_ids(some)
|
35
38
|
case table
|
36
|
-
when :
|
39
|
+
when :city
|
37
40
|
write("cities", {:name => some.name, :country_id => country_id,
|
38
41
|
:geom => some.geom.as_hex_ewkb, :gid => some.gid,
|
39
42
|
:zip => some.zip, :province_id => province_id})
|
40
|
-
when :
|
43
|
+
when :province
|
41
44
|
write("provinces", { :name => some.name, :abbr => some.abbr,
|
42
45
|
:country_id => country_id, :gid => some.gid })
|
43
|
-
when :
|
46
|
+
when :road
|
44
47
|
write("roads", { :name => some.name, :geom => some.geom.as_hex_ewkb, :kind => some.kind,
|
45
48
|
:country_id => country_id, :city_id => city_id, :province_id => province_id })
|
49
|
+
else
|
50
|
+
puts "Fail to insert #{some}"
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
49
54
|
#
|
50
55
|
# Find a record`s ID
|
51
|
-
def find(
|
56
|
+
def find(kind, id, name=nil)
|
57
|
+
table = get_table kind
|
52
58
|
begin
|
53
59
|
if name
|
54
60
|
@conn.exec("SELECT #{table}.id FROM #{table} WHERE (#{table}.name = E'#{id}')")[0]["id"]
|
@@ -79,6 +85,15 @@ module Geonames
|
|
79
85
|
end.join(",")
|
80
86
|
end
|
81
87
|
|
88
|
+
def get_table(kind)
|
89
|
+
case kind
|
90
|
+
when :city then "cities"
|
91
|
+
when :country then "countries"
|
92
|
+
else
|
93
|
+
kind.to_s + "s"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
82
97
|
#
|
83
98
|
# Naive PG insert ORM =D
|
84
99
|
def write(table, hsh)
|
data/lib/geonames_local/cli.rb
CHANGED
@@ -60,6 +60,11 @@ BANNER
|
|
60
60
|
Opt.merge! YAML.load(File.read(Opt[:config]))
|
61
61
|
end
|
62
62
|
|
63
|
+
# Load config/geonames.yml if there's one
|
64
|
+
if File.exists?(cfg = File.join("config", "geonames.yml"))
|
65
|
+
Opt.merge! YAML.load(File.read(cfg))
|
66
|
+
end
|
67
|
+
|
63
68
|
if shp = Opt[:shp]
|
64
69
|
SHP.import(shp)
|
65
70
|
exit
|
@@ -94,69 +99,14 @@ BANNER
|
|
94
99
|
if argv[0] =~ /csv|json/
|
95
100
|
Geonames::Export.new(Country.all).to_csv
|
96
101
|
else
|
97
|
-
db = load_adapter(Opt[:store])
|
98
102
|
info "Using adapter #{Opt[:store]}.."
|
99
103
|
Geonames::Dump.work(Opt[:codes], :zip) #rescue puts "Command not found: #{comm} #{@usage}"
|
100
104
|
Geonames::Dump.work(Opt[:codes], :dump) #rescue puts "Command not found: #{comm} #{@usage}"
|
101
105
|
info "\n---\nTotal #{Cache[:dump].length} parsed. #{Cache[:zip].length} zips."
|
102
|
-
|
103
|
-
unify!
|
104
|
-
write_to_store!(db)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def load_adapter(name)
|
109
|
-
begin
|
110
|
-
require "geonames_local/adapters/#{name}"
|
111
|
-
Geonames.class_eval(name.capitalize).new(Opt[:db])
|
112
|
-
rescue LoadError
|
113
|
-
puts "Can't find adapter #{name}"
|
114
|
-
stop!
|
106
|
+
Sync.work!
|
115
107
|
end
|
116
108
|
end
|
117
109
|
|
118
|
-
def write_to_store!(db)
|
119
|
-
groups = Cache[:dump].group_by(&:kind)
|
120
|
-
Cache[:provinces] = groups[:provinces]
|
121
|
-
# ensure this order....
|
122
|
-
do_write(db, groups[:provinces])
|
123
|
-
do_write(db, groups[:cities])
|
124
|
-
end
|
125
|
-
|
126
|
-
def do_write(db, values)
|
127
|
-
return if values.empty?
|
128
|
-
key = values[0].table
|
129
|
-
start = Time.now
|
130
|
-
writt = 0
|
131
|
-
info "\nWriting #{values.length} #{key}..."
|
132
|
-
values.each do |val|
|
133
|
-
meth = val.respond_to?(:gid) ? [val.gid] : [val.name, true]
|
134
|
-
unless db.find(val.table, *meth)
|
135
|
-
db.insert(val.table, val)
|
136
|
-
writt += 1
|
137
|
-
end
|
138
|
-
end
|
139
|
-
total = Time.now - start
|
140
|
-
info "#{writt} #{key} written in #{total} sec (#{(writt/total).to_i}/s)"
|
141
|
-
end
|
142
|
-
|
143
|
-
def unify!
|
144
|
-
start = Time.now
|
145
|
-
Cache[:dump].map! do |spot|
|
146
|
-
if other = Cache[:zip].find { |d| d.code == spot.code }
|
147
|
-
spot.zip = other.zip
|
148
|
-
spot
|
149
|
-
else
|
150
|
-
spot
|
151
|
-
end
|
152
|
-
end
|
153
|
-
info "Done. #{(Time.now-start).to_i}s"
|
154
|
-
end
|
155
|
-
|
156
|
-
def stop!
|
157
|
-
puts "Closing Geonames..."
|
158
|
-
exit
|
159
|
-
end
|
160
110
|
end
|
161
111
|
|
162
112
|
end
|