geonames_local 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +2 -2
- data/Rakefile +3 -1
- data/VERSION +1 -1
- data/geonames.yml +14 -0
- data/geonames_local.gemspec +26 -17
- data/lib/geonames_ext.rb +15 -0
- data/lib/geonames_local/adapters/mongodb.rb +68 -9
- data/lib/geonames_local/adapters/tokyo.rb +24 -0
- data/lib/geonames_local/config/geonames.sql +331 -0
- data/lib/geonames_local/{dump.rb → data/dump.rb} +0 -0
- data/lib/geonames_local/{export.rb → data/export.rb} +0 -0
- data/lib/geonames_local/features/spot.rb +40 -7
- data/lib/geonames_local/geonames.rb +20 -0
- data/lib/geonames_local/model/city.rb +7 -0
- data/lib/geonames_local/model/conn.rb +7 -0
- data/lib/geonames_local/{features → model}/country.rb +0 -0
- data/lib/geonames_local/{features → model}/province.rb +0 -0
- data/lib/geonames_local.rb +8 -23
- data/spec/geonames_local/adapters/mongodb_spec.rb +105 -0
- data/spec/geonames_local/{data → adapters}/postgres_spec.rb +1 -0
- data/spec/geonames_local/{data → adapters}/tokyo_spec.rb +0 -0
- data/spec/geonames_local/data/shp_spec.rb +1 -0
- data/spec/geonames_local/features/spot_spec.rb +37 -3
- data/spec/geonames_local/model/city_spec.rb +35 -0
- data/spec/spec_ext_helper.rb +5 -0
- metadata +34 -25
- data/lib/geonames_local/data/cache.rb +0 -5
- data/lib/geonames_local/data/geoquery.rb +0 -31
- data/lib/geonames_local/features/city.rb +0 -9
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Geonames Local
|
2
2
|
|
3
|
-
Download and store
|
3
|
+
Download and store Geonames.org data.
|
4
4
|
Making every Geoname API operation possible on your servers.
|
5
5
|
No hit limit, fast as possible.
|
6
6
|
|
@@ -85,7 +85,7 @@ Default PG migration:
|
|
85
85
|
add_index :cities, :province_id
|
86
86
|
add_index :cities, :geom, :spatial => true
|
87
87
|
add_index :provinces, :name
|
88
|
-
add_index :provinces, :
|
88
|
+
add_index :provinces, :abbr
|
89
89
|
add_index :provinces, :gid
|
90
90
|
add_index :provinces, :country_id
|
91
91
|
|
data/Rakefile
CHANGED
@@ -10,8 +10,10 @@ begin
|
|
10
10
|
gem.email = "x@nofxx.com"
|
11
11
|
gem.homepage = "http://github.com/nofxx/geonames_local"
|
12
12
|
gem.authors = ["Marcos Piccinini"]
|
13
|
+
|
14
|
+
gem.add_dependency "nofxx-georuby", ">= 1.7.1"
|
13
15
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
-
|
16
|
+
|
15
17
|
gem.post_install_message = <<-POST_INSTALL_MESSAGE
|
16
18
|
|
17
19
|
Geonames Local
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/geonames.yml
ADDED
data/geonames_local.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{geonames_local}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.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{2010-03-
|
12
|
+
s.date = %q{2010-03-20}
|
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}
|
@@ -26,35 +26,41 @@ Gem::Specification.new do |s|
|
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION",
|
28
28
|
"bin/geonames",
|
29
|
+
"geonames.yml",
|
29
30
|
"geonames_local.gemspec",
|
31
|
+
"lib/geonames_ext.rb",
|
30
32
|
"lib/geonames_local.rb",
|
31
33
|
"lib/geonames_local/adapters/mongodb.rb",
|
32
34
|
"lib/geonames_local/adapters/postgres.rb",
|
33
35
|
"lib/geonames_local/adapters/tokyo.rb",
|
34
36
|
"lib/geonames_local/cli.rb",
|
35
37
|
"lib/geonames_local/config/codes.yml",
|
38
|
+
"lib/geonames_local/config/geonames.sql",
|
36
39
|
"lib/geonames_local/config/geonames.yml",
|
37
|
-
"lib/geonames_local/data/
|
38
|
-
"lib/geonames_local/data/
|
40
|
+
"lib/geonames_local/data/dump.rb",
|
41
|
+
"lib/geonames_local/data/export.rb",
|
39
42
|
"lib/geonames_local/data/shp.rb",
|
40
|
-
"lib/geonames_local/dump.rb",
|
41
|
-
"lib/geonames_local/export.rb",
|
42
|
-
"lib/geonames_local/features/city.rb",
|
43
|
-
"lib/geonames_local/features/country.rb",
|
44
|
-
"lib/geonames_local/features/province.rb",
|
45
43
|
"lib/geonames_local/features/road.rb",
|
46
44
|
"lib/geonames_local/features/spot.rb",
|
47
45
|
"lib/geonames_local/features/zone.rb",
|
46
|
+
"lib/geonames_local/geonames.rb",
|
47
|
+
"lib/geonames_local/model/city.rb",
|
48
|
+
"lib/geonames_local/model/conn.rb",
|
49
|
+
"lib/geonames_local/model/country.rb",
|
50
|
+
"lib/geonames_local/model/province.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",
|
48
54
|
"spec/geonames_local/cli_spec.rb",
|
49
55
|
"spec/geonames_local/data/cache_spec.rb",
|
50
|
-
"spec/geonames_local/data/postgres_spec.rb",
|
51
56
|
"spec/geonames_local/data/shp_spec.rb",
|
52
|
-
"spec/geonames_local/data/tokyo_spec.rb",
|
53
57
|
"spec/geonames_local/features/road_spec.rb",
|
54
58
|
"spec/geonames_local/features/spot_spec.rb",
|
55
59
|
"spec/geonames_local/features/zone_spec.rb",
|
60
|
+
"spec/geonames_local/model/city_spec.rb",
|
56
61
|
"spec/geonames_local_spec.rb",
|
57
62
|
"spec/spec.opts",
|
63
|
+
"spec/spec_ext_helper.rb",
|
58
64
|
"spec/spec_helper.rb",
|
59
65
|
"task/benchmark.rb",
|
60
66
|
"task/benchmark_cabinet.rb"
|
@@ -90,14 +96,17 @@ Have fun because:
|
|
90
96
|
s.test_files = [
|
91
97
|
"spec/spec_helper.rb",
|
92
98
|
"spec/geonames_local/data/shp_spec.rb",
|
93
|
-
"spec/geonames_local/data/postgres_spec.rb",
|
94
|
-
"spec/geonames_local/data/tokyo_spec.rb",
|
95
99
|
"spec/geonames_local/data/cache_spec.rb",
|
100
|
+
"spec/geonames_local/model/city_spec.rb",
|
96
101
|
"spec/geonames_local/cli_spec.rb",
|
102
|
+
"spec/geonames_local/adapters/postgres_spec.rb",
|
103
|
+
"spec/geonames_local/adapters/tokyo_spec.rb",
|
104
|
+
"spec/geonames_local/adapters/mongodb_spec.rb",
|
97
105
|
"spec/geonames_local/features/spot_spec.rb",
|
98
106
|
"spec/geonames_local/features/zone_spec.rb",
|
99
107
|
"spec/geonames_local/features/road_spec.rb",
|
100
|
-
"spec/geonames_local_spec.rb"
|
108
|
+
"spec/geonames_local_spec.rb",
|
109
|
+
"spec/spec_ext_helper.rb"
|
101
110
|
]
|
102
111
|
|
103
112
|
if s.respond_to? :specification_version then
|
@@ -105,15 +114,15 @@ Have fun because:
|
|
105
114
|
s.specification_version = 3
|
106
115
|
|
107
116
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
108
|
-
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
109
117
|
s.add_runtime_dependency(%q<nofxx-georuby>, [">= 1.7.1"])
|
118
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
110
119
|
else
|
111
|
-
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
112
120
|
s.add_dependency(%q<nofxx-georuby>, [">= 1.7.1"])
|
121
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
113
122
|
end
|
114
123
|
else
|
115
|
-
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
116
124
|
s.add_dependency(%q<nofxx-georuby>, [">= 1.7.1"])
|
125
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
117
126
|
end
|
118
127
|
end
|
119
128
|
|
data/lib/geonames_ext.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#
|
2
|
+
# Geonames Extension
|
3
|
+
#
|
4
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
5
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
6
|
+
|
7
|
+
# Require Libs
|
8
|
+
require 'geonames_local/geonames'
|
9
|
+
|
10
|
+
require 'geonames_local/model/conn'
|
11
|
+
require 'geonames_local/model/country'
|
12
|
+
require 'geonames_local/model/province'
|
13
|
+
require 'geonames_local/model/city'
|
14
|
+
#require 'geonames_local/data/shp'
|
15
|
+
|
@@ -5,28 +5,77 @@ module Geonames
|
|
5
5
|
|
6
6
|
RESOURCES = ["countries", "provinces", "cities"]
|
7
7
|
|
8
|
-
def initialize(params)
|
9
|
-
port = params[:port] || 27017
|
10
|
-
@conn = Mongo::Connection.new(
|
11
|
-
@db = @conn.db(params[:dbname])
|
12
|
-
purge
|
8
|
+
def initialize(params={})
|
9
|
+
host, port = params[:host] || "localhost", params[:port] || 27017
|
10
|
+
@conn = Mongo::Connection.new(host, port)
|
11
|
+
@db = @conn.db(params[:dbname] || "geonames")
|
12
|
+
#purge
|
13
13
|
setup
|
14
14
|
end
|
15
15
|
|
16
16
|
def setup
|
17
17
|
for re in RESOURCES
|
18
18
|
coll = @db.collection(re)
|
19
|
-
coll.create_index(["id", Mongo::ASCENDING])
|
20
|
-
|
19
|
+
coll.create_index(["id", Mongo::ASCENDING], ["gid", Mongo::ASCENDING])
|
20
|
+
|
21
|
+
# Geometric index, more info:
|
22
|
+
# http://www.mongodb.org/display/DOCS/Geospatial+Indexing
|
23
|
+
coll.create_index([["geom", Mongo::GEO2D]], :min => -180, :max => 180)
|
21
24
|
end
|
22
25
|
end
|
23
26
|
|
27
|
+
def all(resource, limit=nil, skip=0)
|
28
|
+
@db.collection(resource.to_s).find().to_a
|
29
|
+
end
|
30
|
+
|
24
31
|
def find(resource, id, name=nil)
|
25
|
-
@db.collection(resource.to_s).
|
32
|
+
@db.collection(resource.to_s).find_one("id" => id)
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_by_name(resource, name)
|
36
|
+
do_find(resource, "name" => /#{name}/)
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_by_zip(resource, zip)
|
40
|
+
do_find(resource, "zip" => /#{zip}/)
|
41
|
+
end
|
42
|
+
|
43
|
+
def do_find(resource, hsh)
|
44
|
+
@db.collection(resource.to_s).find(hsh).to_a
|
26
45
|
end
|
27
46
|
|
28
47
|
def insert(resource, spot)
|
29
|
-
|
48
|
+
hsh = spot.to_hash
|
49
|
+
hsh["geom"][0] = sin_proj(hsh["geom"])[0] if hsh["geom"]
|
50
|
+
@db.collection(resource.to_s).insert(hsh)
|
51
|
+
end
|
52
|
+
|
53
|
+
def count(resource)
|
54
|
+
@db.collection(resource).count
|
55
|
+
end
|
56
|
+
|
57
|
+
def find_near(resource, x, y, limit=nil, skip=0)
|
58
|
+
coll = @db.collection(resource.to_s).find("geom" => { "$near" => { "x" => x, "y" => y }}).skip(skip)
|
59
|
+
coll.limit(limit) if limit
|
60
|
+
coll.to_a
|
61
|
+
end
|
62
|
+
|
63
|
+
# +1.3.4
|
64
|
+
def find_within(resource, geom, limit=nil)
|
65
|
+
op = geom[1].kind_of?(Numeric) ? "$center" : "$box"
|
66
|
+
coll = @db.collection(resource.to_s).find("geom" => { "$within" => { op => geom }})
|
67
|
+
coll.limit(limit) if limit
|
68
|
+
coll.to_a
|
69
|
+
end
|
70
|
+
|
71
|
+
# getNear command returns distance too
|
72
|
+
# <1.9 needs OrderedHash
|
73
|
+
def near(resource, x, y, limit=nil)
|
74
|
+
cmd = OrderedHash.new
|
75
|
+
cmd["geoNear"] = resource
|
76
|
+
cmd["near"] = sin_proj(x,y)
|
77
|
+
cmd["num"] = limit if limit
|
78
|
+
@db.command(cmd)["results"].to_a
|
30
79
|
end
|
31
80
|
|
32
81
|
def purge
|
@@ -35,5 +84,15 @@ module Geonames
|
|
35
84
|
end
|
36
85
|
end
|
37
86
|
|
87
|
+
def index_info(resource)
|
88
|
+
@db.collection(resource).index_information
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def sin_proj(x,y=nil)
|
94
|
+
x,y = x unless y
|
95
|
+
[x * Math.cos(y * Math::PI/180), y]
|
96
|
+
end
|
38
97
|
end
|
39
98
|
end
|
@@ -83,3 +83,27 @@ module Geonames
|
|
83
83
|
end
|
84
84
|
|
85
85
|
end
|
86
|
+
|
87
|
+
# def self.point(tdb, x, y)
|
88
|
+
# qry = TDBQRY::new(tdb)
|
89
|
+
# qry.addcond("x", TDBQRY::QCNUMGE, minx.to_s())
|
90
|
+
# qry.addcond("x", TDBQRY::QCNUMLE, maxx.to_s())
|
91
|
+
# qry.addcond("y", TDBQRY::QCNUMGE, miny.to_s())
|
92
|
+
# qry.addcond("y", TDBQRY::QCNUMLE, maxy.to_s())
|
93
|
+
# qry.setorder("x", TDBQRY::QONUMASC)
|
94
|
+
# qry.setlimit(80)
|
95
|
+
# end
|
96
|
+
|
97
|
+
|
98
|
+
# def self.area(tdb, minx, maxx, miny, maxy)
|
99
|
+
# qry = TDBQRY::new(tdb)
|
100
|
+
# qry.addcond("x", TDBQRY::QCNUMGE, minx.to_s())
|
101
|
+
# qry.addcond("x", TDBQRY::QCNUMLE, maxx.to_s())
|
102
|
+
# qry.addcond("y", TDBQRY::QCNUMGE, miny.to_s())
|
103
|
+
# qry.addcond("y", TDBQRY::QCNUMLE, maxy.to_s())
|
104
|
+
# qry.setorder("x", TDBQRY::QONUMASC)
|
105
|
+
|
106
|
+
# res = qry.search
|
107
|
+
# info res.length # number of results found
|
108
|
+
# return res
|
109
|
+
# end
|
@@ -0,0 +1,331 @@
|
|
1
|
+
--
|
2
|
+
-- PostgreSQL database dump
|
3
|
+
--
|
4
|
+
|
5
|
+
-- Started on 2010-03-19 05:44:38 BRT
|
6
|
+
|
7
|
+
SET statement_timeout = 0;
|
8
|
+
SET client_encoding = 'UTF8';
|
9
|
+
SET standard_conforming_strings = off;
|
10
|
+
SET check_function_bodies = false;
|
11
|
+
SET client_min_messages = warning;
|
12
|
+
SET escape_string_warning = off;
|
13
|
+
|
14
|
+
SET search_path = public, pg_catalog;
|
15
|
+
|
16
|
+
SET default_tablespace = '';
|
17
|
+
|
18
|
+
SET default_with_oids = false;
|
19
|
+
|
20
|
+
--
|
21
|
+
-- TOC entry 2245 (class 1259 OID 21665)
|
22
|
+
-- Dependencies: 2544 2545 2546 3 992
|
23
|
+
-- Name: cities; Type: TABLE; Schema: public; Owner: -; Tablespace:
|
24
|
+
--
|
25
|
+
|
26
|
+
CREATE TABLE cities (
|
27
|
+
id integer NOT NULL,
|
28
|
+
country_id integer NOT NULL,
|
29
|
+
province_id integer,
|
30
|
+
name character varying(255) NOT NULL,
|
31
|
+
gid integer,
|
32
|
+
zip integer,
|
33
|
+
geom geometry,
|
34
|
+
CONSTRAINT enforce_dims_geom CHECK ((st_ndims(geom) = 2)),
|
35
|
+
CONSTRAINT enforce_geotype_geom CHECK (((geometrytype(geom) = 'POINT'::text) OR (geom IS NULL))),
|
36
|
+
CONSTRAINT enforce_srid_geom CHECK ((st_srid(geom) = 4326))
|
37
|
+
);
|
38
|
+
|
39
|
+
|
40
|
+
--
|
41
|
+
-- TOC entry 2244 (class 1259 OID 21663)
|
42
|
+
-- Dependencies: 3 2245
|
43
|
+
-- Name: cities_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
44
|
+
--
|
45
|
+
|
46
|
+
CREATE SEQUENCE cities_id_seq
|
47
|
+
START WITH 1
|
48
|
+
INCREMENT BY 1
|
49
|
+
NO MAXVALUE
|
50
|
+
NO MINVALUE
|
51
|
+
CACHE 1;
|
52
|
+
|
53
|
+
|
54
|
+
--
|
55
|
+
-- TOC entry 2557 (class 0 OID 0)
|
56
|
+
-- Dependencies: 2244
|
57
|
+
-- Name: cities_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
58
|
+
--
|
59
|
+
|
60
|
+
ALTER SEQUENCE cities_id_seq OWNED BY cities.id;
|
61
|
+
|
62
|
+
|
63
|
+
--
|
64
|
+
-- TOC entry 2543 (class 2604 OID 21668)
|
65
|
+
-- Dependencies: 2245 2244 2245
|
66
|
+
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
|
67
|
+
--
|
68
|
+
|
69
|
+
ALTER TABLE cities ALTER COLUMN id SET DEFAULT nextval('cities_id_seq'::regclass);
|
70
|
+
|
71
|
+
|
72
|
+
--
|
73
|
+
-- TOC entry 2548 (class 2606 OID 21670)
|
74
|
+
-- Dependencies: 2245 2245
|
75
|
+
-- Name: cities_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
|
76
|
+
--
|
77
|
+
|
78
|
+
ALTER TABLE ONLY cities
|
79
|
+
ADD CONSTRAINT cities_pkey PRIMARY KEY (id);
|
80
|
+
|
81
|
+
|
82
|
+
--
|
83
|
+
-- TOC entry 2549 (class 1259 OID 21697)
|
84
|
+
-- Dependencies: 2245
|
85
|
+
-- Name: index_cities_on_country_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
86
|
+
--
|
87
|
+
|
88
|
+
CREATE INDEX index_cities_on_country_id ON cities USING btree (country_id);
|
89
|
+
|
90
|
+
|
91
|
+
--
|
92
|
+
-- TOC entry 2550 (class 1259 OID 21699)
|
93
|
+
-- Dependencies: 2245 1869
|
94
|
+
-- Name: index_cities_on_geom; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
95
|
+
--
|
96
|
+
|
97
|
+
CREATE INDEX index_cities_on_geom ON cities USING gist (geom);
|
98
|
+
|
99
|
+
|
100
|
+
--
|
101
|
+
-- TOC entry 2551 (class 1259 OID 21695)
|
102
|
+
-- Dependencies: 2245
|
103
|
+
-- Name: index_cities_on_gid; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
104
|
+
--
|
105
|
+
|
106
|
+
CREATE INDEX index_cities_on_gid ON cities USING btree (gid);
|
107
|
+
|
108
|
+
|
109
|
+
--
|
110
|
+
-- TOC entry 2552 (class 1259 OID 21694)
|
111
|
+
-- Dependencies: 2245
|
112
|
+
-- Name: index_cities_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
113
|
+
--
|
114
|
+
|
115
|
+
CREATE INDEX index_cities_on_name ON cities USING btree (name);
|
116
|
+
|
117
|
+
|
118
|
+
--
|
119
|
+
-- TOC entry 2553 (class 1259 OID 21698)
|
120
|
+
-- Dependencies: 2245
|
121
|
+
-- Name: index_cities_on_province_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
122
|
+
--
|
123
|
+
|
124
|
+
CREATE INDEX index_cities_on_province_id ON cities USING btree (province_id);
|
125
|
+
|
126
|
+
|
127
|
+
--
|
128
|
+
-- TOC entry 2554 (class 1259 OID 21696)
|
129
|
+
-- Dependencies: 2245
|
130
|
+
-- Name: index_cities_on_zip; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
131
|
+
--
|
132
|
+
|
133
|
+
CREATE INDEX index_cities_on_zip ON cities USING btree (zip);
|
134
|
+
|
135
|
+
|
136
|
+
--
|
137
|
+
-- PostgreSQL database dump
|
138
|
+
--
|
139
|
+
|
140
|
+
-- Started on 2010-03-19 05:45:05 BRT
|
141
|
+
|
142
|
+
SET statement_timeout = 0;
|
143
|
+
SET client_encoding = 'UTF8';
|
144
|
+
SET standard_conforming_strings = off;
|
145
|
+
SET check_function_bodies = false;
|
146
|
+
SET client_min_messages = warning;
|
147
|
+
SET escape_string_warning = off;
|
148
|
+
|
149
|
+
SET search_path = public, pg_catalog;
|
150
|
+
|
151
|
+
SET default_tablespace = '';
|
152
|
+
|
153
|
+
SET default_with_oids = false;
|
154
|
+
|
155
|
+
--
|
156
|
+
-- TOC entry 2249 (class 1259 OID 21688)
|
157
|
+
-- Dependencies: 3
|
158
|
+
-- Name: countries; Type: TABLE; Schema: public; Owner: -; Tablespace:
|
159
|
+
--
|
160
|
+
|
161
|
+
CREATE TABLE countries (
|
162
|
+
id integer NOT NULL,
|
163
|
+
name character varying(30) NOT NULL,
|
164
|
+
abbr character varying(2) NOT NULL
|
165
|
+
);
|
166
|
+
|
167
|
+
|
168
|
+
--
|
169
|
+
-- TOC entry 2248 (class 1259 OID 21686)
|
170
|
+
-- Dependencies: 3 2249
|
171
|
+
-- Name: countries_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
172
|
+
--
|
173
|
+
|
174
|
+
CREATE SEQUENCE countries_id_seq
|
175
|
+
START WITH 1
|
176
|
+
INCREMENT BY 1
|
177
|
+
NO MAXVALUE
|
178
|
+
NO MINVALUE
|
179
|
+
CACHE 1;
|
180
|
+
|
181
|
+
|
182
|
+
--
|
183
|
+
-- TOC entry 2548 (class 0 OID 0)
|
184
|
+
-- Dependencies: 2248
|
185
|
+
-- Name: countries_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
186
|
+
--
|
187
|
+
|
188
|
+
ALTER SEQUENCE countries_id_seq OWNED BY countries.id;
|
189
|
+
|
190
|
+
|
191
|
+
--
|
192
|
+
-- TOC entry 2543 (class 2604 OID 21691)
|
193
|
+
-- Dependencies: 2249 2248 2249
|
194
|
+
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
|
195
|
+
--
|
196
|
+
|
197
|
+
ALTER TABLE countries ALTER COLUMN id SET DEFAULT nextval('countries_id_seq'::regclass);
|
198
|
+
|
199
|
+
|
200
|
+
--
|
201
|
+
-- TOC entry 2545 (class 2606 OID 21693)
|
202
|
+
-- Dependencies: 2249 2249
|
203
|
+
-- Name: countries_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
|
204
|
+
--
|
205
|
+
|
206
|
+
ALTER TABLE ONLY countries
|
207
|
+
ADD CONSTRAINT countries_pkey PRIMARY KEY (id);
|
208
|
+
|
209
|
+
|
210
|
+
--
|
211
|
+
-- PostgreSQL database dump
|
212
|
+
--
|
213
|
+
|
214
|
+
-- Started on 2010-03-19 05:45:19 BRT
|
215
|
+
|
216
|
+
SET statement_timeout = 0;
|
217
|
+
SET client_encoding = 'UTF8';
|
218
|
+
SET standard_conforming_strings = off;
|
219
|
+
SET check_function_bodies = false;
|
220
|
+
SET client_min_messages = warning;
|
221
|
+
SET escape_string_warning = off;
|
222
|
+
|
223
|
+
SET search_path = public, pg_catalog;
|
224
|
+
|
225
|
+
SET default_tablespace = '';
|
226
|
+
|
227
|
+
SET default_with_oids = false;
|
228
|
+
|
229
|
+
--
|
230
|
+
-- TOC entry 2247 (class 1259 OID 21680)
|
231
|
+
-- Dependencies: 3
|
232
|
+
-- Name: provinces; Type: TABLE; Schema: public; Owner: -; Tablespace:
|
233
|
+
--
|
234
|
+
|
235
|
+
CREATE TABLE provinces (
|
236
|
+
id integer NOT NULL,
|
237
|
+
country_id integer NOT NULL,
|
238
|
+
name character varying(255) NOT NULL,
|
239
|
+
abbr character varying(2) NOT NULL,
|
240
|
+
gid integer
|
241
|
+
);
|
242
|
+
|
243
|
+
|
244
|
+
--
|
245
|
+
-- TOC entry 2246 (class 1259 OID 21678)
|
246
|
+
-- Dependencies: 3 2247
|
247
|
+
-- Name: provinces_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
248
|
+
--
|
249
|
+
|
250
|
+
CREATE SEQUENCE provinces_id_seq
|
251
|
+
START WITH 1
|
252
|
+
INCREMENT BY 1
|
253
|
+
NO MAXVALUE
|
254
|
+
NO MINVALUE
|
255
|
+
CACHE 1;
|
256
|
+
|
257
|
+
|
258
|
+
--
|
259
|
+
-- TOC entry 2552 (class 0 OID 0)
|
260
|
+
-- Dependencies: 2246
|
261
|
+
-- Name: provinces_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
262
|
+
--
|
263
|
+
|
264
|
+
ALTER SEQUENCE provinces_id_seq OWNED BY provinces.id;
|
265
|
+
|
266
|
+
|
267
|
+
--
|
268
|
+
-- TOC entry 2543 (class 2604 OID 21683)
|
269
|
+
-- Dependencies: 2246 2247 2247
|
270
|
+
-- Name: id; Type: DEFAULT; Schema: public; Owner: -
|
271
|
+
--
|
272
|
+
|
273
|
+
ALTER TABLE provinces ALTER COLUMN id SET DEFAULT nextval('provinces_id_seq'::regclass);
|
274
|
+
|
275
|
+
|
276
|
+
--
|
277
|
+
-- TOC entry 2549 (class 2606 OID 21685)
|
278
|
+
-- Dependencies: 2247 2247
|
279
|
+
-- Name: provinces_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace:
|
280
|
+
--
|
281
|
+
|
282
|
+
ALTER TABLE ONLY provinces
|
283
|
+
ADD CONSTRAINT provinces_pkey PRIMARY KEY (id);
|
284
|
+
|
285
|
+
|
286
|
+
--
|
287
|
+
-- TOC entry 2544 (class 1259 OID 21701)
|
288
|
+
-- Dependencies: 2247
|
289
|
+
-- Name: index_provinces_on_abbr; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
290
|
+
--
|
291
|
+
|
292
|
+
CREATE INDEX index_provinces_on_abbr ON provinces USING btree (abbr);
|
293
|
+
|
294
|
+
|
295
|
+
--
|
296
|
+
-- TOC entry 2545 (class 1259 OID 21703)
|
297
|
+
-- Dependencies: 2247
|
298
|
+
-- Name: index_provinces_on_country_id; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
299
|
+
--
|
300
|
+
|
301
|
+
CREATE INDEX index_provinces_on_country_id ON provinces USING btree (country_id);
|
302
|
+
|
303
|
+
|
304
|
+
--
|
305
|
+
-- TOC entry 2546 (class 1259 OID 21702)
|
306
|
+
-- Dependencies: 2247
|
307
|
+
-- Name: index_provinces_on_gid; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
308
|
+
--
|
309
|
+
|
310
|
+
CREATE INDEX index_provinces_on_gid ON provinces USING btree (gid);
|
311
|
+
|
312
|
+
|
313
|
+
--
|
314
|
+
-- TOC entry 2547 (class 1259 OID 21700)
|
315
|
+
-- Dependencies: 2247
|
316
|
+
-- Name: index_provinces_on_name; Type: INDEX; Schema: public; Owner: -; Tablespace:
|
317
|
+
--
|
318
|
+
|
319
|
+
CREATE INDEX index_provinces_on_name ON provinces USING btree (name);
|
320
|
+
|
321
|
+
|
322
|
+
-- Completed on 2010-03-19 05:45:19 BRT
|
323
|
+
|
324
|
+
--
|
325
|
+
-- PostgreSQL database dump complete
|
326
|
+
--
|
327
|
+
|
328
|
+
|
329
|
+
|
330
|
+
|
331
|
+
|
File without changes
|
File without changes
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Geonames
|
2
2
|
class Spot
|
3
3
|
attr_accessor :gid, :name, :ascii, :lat, :lon, :country, :kind,
|
4
|
-
:code, :pop, :tz, :geom, :province, :zip, :abbr
|
4
|
+
:code, :pop, :tz, :geom, :province, :zip, :abbr, :id
|
5
5
|
alias :x :lon
|
6
6
|
alias :y :lat
|
7
7
|
alias :geoname_id :gid
|
@@ -11,10 +11,10 @@ module Geonames
|
|
11
11
|
# = Geonames Spot
|
12
12
|
#
|
13
13
|
# Every geoname type will be parsed as a spot
|
14
|
-
def initialize(params, k)
|
14
|
+
def initialize(params=nil, k=nil)
|
15
15
|
return unless params.instance_of? String
|
16
16
|
k == :zip ? parse_zip(params) : parse(params)
|
17
|
-
if @kind == :
|
17
|
+
if @kind == :province
|
18
18
|
@name.gsub!(/Estado d\w\s/, "")
|
19
19
|
@abbr = get_abbr
|
20
20
|
end
|
@@ -75,16 +75,49 @@ module Geonames
|
|
75
75
|
def to_hash
|
76
76
|
{ "id" => @geoname_id, "gid" => @geoname_id.to_s, "kind" => @kind.to_s,
|
77
77
|
"name" => @name, "ascii" => @ascii, "country" => @country,
|
78
|
-
"geom" =>
|
78
|
+
"geom" => [@geom.x, @geom.y], "tz" => @tz }
|
79
79
|
end
|
80
80
|
|
81
|
-
|
82
81
|
def human_code(code)
|
83
82
|
case code
|
84
|
-
when 'ADM1' then :
|
85
|
-
when 'ADM2' then :
|
83
|
+
when 'ADM1' then :province
|
84
|
+
when 'ADM2' then :city
|
86
85
|
else :other
|
87
86
|
end
|
88
87
|
end
|
88
|
+
|
89
|
+
class << self
|
90
|
+
|
91
|
+
def all
|
92
|
+
Adapter.all(@coll)
|
93
|
+
end
|
94
|
+
|
95
|
+
def find(id)
|
96
|
+
Adapter.find(@coll, id)
|
97
|
+
end
|
98
|
+
|
99
|
+
def find_by_name(name)
|
100
|
+
Adapter.find_by_name(@coll, name).map { |hsh| from_hash(hsh) }
|
101
|
+
end
|
102
|
+
|
103
|
+
def nearest(x,y)
|
104
|
+
from_hash(Adapter.find_near(@coll, x, y, 1)[0])
|
105
|
+
end
|
106
|
+
|
107
|
+
def from_hash(hsh)
|
108
|
+
spot = self.new
|
109
|
+
hsh.each { |key, val| spot.instance_variable_set("@"+key, val) }
|
110
|
+
spot.geom = GeoRuby::SimpleFeatures::Point.from_x_y(*spot.geom)
|
111
|
+
spot
|
112
|
+
end
|
113
|
+
|
114
|
+
def set_coll(name)
|
115
|
+
@coll = name
|
116
|
+
end
|
117
|
+
|
118
|
+
def collection
|
119
|
+
@coll
|
120
|
+
end
|
121
|
+
end
|
89
122
|
end
|
90
123
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'logger'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require 'geonames_local/features/spot'
|
6
|
+
require 'geonames_local/features/road'
|
7
|
+
require 'geonames_local/features/zone'
|
8
|
+
|
9
|
+
module Geonames
|
10
|
+
Opt = {}
|
11
|
+
Cache = {:dump => [], :zip => [], :roads => [], :zones => []}
|
12
|
+
Codes = YAML.load(File.read(File.join(File.dirname(__FILE__), 'config', 'codes.yml')))
|
13
|
+
VERSION = File.read(File.join(File.dirname(__FILE__), '..', '..', 'VERSION'))
|
14
|
+
|
15
|
+
def info(txt)
|
16
|
+
if Opt[:verbose]
|
17
|
+
puts(txt)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
File without changes
|
File without changes
|
data/lib/geonames_local.rb
CHANGED
@@ -1,28 +1,13 @@
|
|
1
|
+
#
|
2
|
+
# Geonames Local
|
3
|
+
#
|
1
4
|
$:.unshift(File.dirname(__FILE__)) unless
|
2
5
|
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
3
6
|
|
4
|
-
|
5
|
-
require '
|
6
|
-
require 'yaml'
|
7
|
-
require 'geonames_local/features/spot'
|
8
|
-
require 'geonames_local/features/country'
|
9
|
-
require 'geonames_local/features/city'
|
10
|
-
require 'geonames_local/features/road'
|
11
|
-
require 'geonames_local/features/zone'
|
12
|
-
require 'geonames_local/data/shp'
|
7
|
+
# Require CLI Stuff
|
8
|
+
require 'geonames_local/geonames'
|
13
9
|
require 'geonames_local/cli'
|
14
|
-
require 'geonames_local/
|
15
|
-
require 'geonames_local/
|
16
|
-
|
17
|
-
module Geonames
|
18
|
-
Opt = {}
|
19
|
-
Cache = {:dump => [], :zip => [], :roads => [], :zones => []}
|
20
|
-
Codes = YAML.load(File.read(File.join(File.dirname(__FILE__), 'geonames_local', 'config', 'codes.yml')))
|
21
|
-
VERSION = File.read(File.join(File.dirname(__FILE__), '..', 'VERSION'))
|
10
|
+
require 'geonames_local/data/shp'
|
11
|
+
require 'geonames_local/data/dump'
|
12
|
+
require 'geonames_local/data/export'
|
22
13
|
|
23
|
-
def info(txt)
|
24
|
-
if Opt[:verbose]
|
25
|
-
puts(txt)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../lib/geonames_local/adapters/mongodb')
|
3
|
+
|
4
|
+
describe Mongodb do
|
5
|
+
|
6
|
+
SPECDB = "geonames_spec"
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
Mongodb.new({:dbname => SPECDB}).purge
|
10
|
+
@mong = Mongodb.new({:dbname => SPECDB})
|
11
|
+
end
|
12
|
+
|
13
|
+
def mock_spot(name)
|
14
|
+
Spot.new("1\t#{name}\t#{name}\t\t-5.46874226086957\t-35.3565714695652\tA\tADM2\tBR\t22\t2407500\t6593\t\t12\t\t\t\tAmerica/Recife\t2006-12-17", :dump)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "Parsing Dump" do
|
18
|
+
before do
|
19
|
+
@mock_spot = mock("Spot")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should find all" do
|
23
|
+
@mong.all("cities").each { |c| p c["geom"]} #should eql([])
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should store something" do
|
27
|
+
@mock_spot.should_receive(:to_hash).and_return({"id" => 7, "name" => "Sao Tome", "geom" => [5,5]})
|
28
|
+
@mong.insert("cities", @mock_spot)
|
29
|
+
@mong.count("cities").should eql(1)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should store a spot" do
|
33
|
+
@mong.insert("cities", mock_spot("Loco"))
|
34
|
+
@mong.find("cities", 1)["name"].should eql("Loco")
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should store geom with sinusoidal projection" do
|
38
|
+
@mock_spot.should_receive(:to_hash).and_return({"id" => 8, "name" => "Sao Tome", "geom" => [5,8]})
|
39
|
+
@mong.insert("cities", @mock_spot)
|
40
|
+
@mong.find("cities", 8)["geom"][0].should be_close(4.95, 0.1)
|
41
|
+
@mong.find("cities", 8)["geom"][1].should eql(8)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should have some indexes" do
|
45
|
+
@mong.index_info("cities").to_a.length.should eql(3)
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "Finds" do
|
49
|
+
|
50
|
+
before(:all) do
|
51
|
+
@mong.insert("cities", {"id" => 9, "name" => "Sao Paulo", "geom" => [15,15]})
|
52
|
+
@mong.insert("cities", {"id" => 10, "name" => "Sao Tome", "geom" => [-7,-34]})
|
53
|
+
@mong.insert("cities", {"id" => 11, "name" => "Sao Benedito", "geom" => [-9,-39]})
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should make sure it's on the collection" do
|
57
|
+
@mong.count("cities").should eql(3)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should find geo" do
|
61
|
+
@mong.find_near("cities", -5, -35).first["name"].should eql("Sao Tome")
|
62
|
+
@mong.find_near("cities", -5, -35).first["geom"][0].should be_close(-5.80, 0.1)
|
63
|
+
@mong.find_near("cities", -5, -35).first["geom"][1].should eql(-34)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should find geo limited" do
|
67
|
+
@mong.find_near("cities", -5, -35, 1).length.should eql(1)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should find within box" do
|
71
|
+
@mong.find_within("cities", [[10, 10],[20, 20]]).length.should eql(1)
|
72
|
+
@mong.find_within("cities", [[10, 10],[20, 20]]).first["name"].should eql("Sao Paulo")
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should find within radius" do
|
76
|
+
@mong.find_within("cities", [[-6, -36], 2]).length.should eql(1)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should find within wider radius" do
|
80
|
+
@mong.find_within("cities", [[-6, -36], 5]).length.should eql(2)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should find within wider radius limited" do
|
84
|
+
@mong.find_within("cities", [[-6, -36], 5], 1).length.should eql(1)
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should find geoNear" do
|
88
|
+
@mong.near("cities", -5, -35).first["dis"].should be_close(1.97, 0.01)
|
89
|
+
@mong.near("cities", -5, -35).first["obj"]["name"].should eql("Sao Tome")
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should find geoNear" do
|
93
|
+
@mong.near("cities", -5, -35).first["dis"].should be_close(1.97, 0.01)
|
94
|
+
@mong.near("cities", -5, -35).first["obj"]["name"].should eql("Sao Tome")
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should find geoNear limited" do
|
98
|
+
@mong.near("cities", -5, -35, 1).length.should eql(1)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
File without changes
|
@@ -35,7 +35,7 @@ describe Spot do
|
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should parse spot kind" do
|
38
|
-
@spot.kind.should eql(:
|
38
|
+
@spot.kind.should eql(:city)
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should parse spot country" do
|
@@ -97,7 +97,7 @@ describe Spot do
|
|
97
97
|
end
|
98
98
|
|
99
99
|
it "should be kind of province" do
|
100
|
-
@spot.kind.should eql(:
|
100
|
+
@spot.kind.should eql(:province)
|
101
101
|
end
|
102
102
|
|
103
103
|
it "should parse geoid" do
|
@@ -132,7 +132,7 @@ describe Spot do
|
|
132
132
|
describe "Parsing Zip" do
|
133
133
|
|
134
134
|
before do
|
135
|
-
@spot =
|
135
|
+
@spot = Geonames::Spot.new("BR\t76375-000\tHidrolina\tGoias\t29\t\t5209804\t\t-14.7574\t-49.3596\t\n", :zip)
|
136
136
|
end
|
137
137
|
|
138
138
|
it "should parse zip oO" do
|
@@ -163,6 +163,39 @@ describe Spot do
|
|
163
163
|
|
164
164
|
end
|
165
165
|
|
166
|
+
describe "From Hash" do
|
167
|
+
|
168
|
+
before do
|
169
|
+
@spot = Spot.from_hash({"id" => 9, "name" => "Sao Rock", "geom" => [15,15], "kind" => "cities", "country" => "BR", "gid" => 13232, "tz" => "America/Foo", "ascii" => "Rock"})
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should be an spot" do
|
173
|
+
@spot.should be_instance_of Spot
|
174
|
+
end
|
175
|
+
|
176
|
+
it "should set the name" do
|
177
|
+
@spot.name.should eql("Sao Rock")
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should set the geom" do
|
181
|
+
@spot.geom.should be_instance_of(GeoRuby::SimpleFeatures::Point)
|
182
|
+
@spot.geom.x.should eql(15)
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should set the tz" do
|
186
|
+
@spot.tz.should eql("America/Foo")
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should set the ascii" do
|
190
|
+
@spot.ascii.should eql("Rock")
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should set the country abbr" do
|
194
|
+
@spot.country.should eql("BR")
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
166
199
|
end
|
167
200
|
|
168
201
|
# 6319037 Maxaranguape Maxaranguape -5.46874226086957 -35.3565714695652 A ADM2 BR 22 2407500 6593 12 America/Recife 2006-12-17
|
@@ -189,3 +222,4 @@ end
|
|
189
222
|
# "3165361\tToscana\tToscana\tTaskana,Toscan-a,Toscana,Toscane,Toscann-a,Toskana,Toskania,Toskanio,Toskansko,Toskánsko,Toskāna,Toszkana,Toszkána,Tuscany,Tuschena,Tuschèna,Tuscia,toseukana ju,tosukana zhou,tuo si ka na,twsqnh,Таскана,Тоскана,טוסקנה,تسکانہ,ტოსკანა,トスカーナ州,托斯卡纳,토스카나 주\t43.4166667\t11.0\tA\tADM1\tIT\t\t16\t\t\t\t3718210\t\t249\tEurope/Rome\t2010-01-17\n"
|
190
223
|
# "3169778\tRegione Puglia\tRegione Puglia\tApulia,Apulie,Apulien,Apulië,Pouilles,Puglia\t41.25\t16.25\tA\tADM1\tIT\t\t13\t\t\t\t4021957\t\t95\tEurope/Rome\t2009-03-11\n"
|
191
224
|
# "3170831\tRegione Piemonte\tRegione Piemonte\tPedemons,Pedemontium,Piamonte,Piedmont,Piemont,Piemonte,Piémont,Piëmont,Regione Piemonte\t45.0\t8.0\tA\tADM1\tIT\t\t12\t\t\t\t4294081\t\t185\tEurope/Rome\t2008-08-18\n"
|
225
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_ext_helper')
|
3
|
+
require "geo_ruby"
|
4
|
+
|
5
|
+
describe City do
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
Adapter.insert("cities", {"id" => 9, "name" => "Sao Paulo", "geom" => [15,15]})
|
9
|
+
Adapter.insert("cities", {"id" => 66, "name" => "Rock City", "geom" => [2,3]})
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:all) do
|
13
|
+
Mongodb.new({:dbname => "geonames"}).purge
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should set a collection name" do
|
17
|
+
City.collection.should eql("cities")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should find all cities" do
|
21
|
+
City.all.should_not be_empty
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should be a city instance" do
|
25
|
+
City.nearest(1,1).should be_instance_of(City)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should find city nearest point" do
|
29
|
+
City.nearest(1,1).name.should eql("Rock City")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should find by name" do
|
33
|
+
City.find_by_name("Rock")[0].name.should eql("Rock City")
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Marcos Piccinini
|
@@ -14,11 +14,11 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-20 00:00:00 -03:00
|
18
18
|
default_executable: geonames
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
21
|
+
name: nofxx-georuby
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
@@ -26,13 +26,13 @@ dependencies:
|
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
segments:
|
28
28
|
- 1
|
29
|
-
-
|
30
|
-
-
|
31
|
-
version: 1.
|
32
|
-
type: :
|
29
|
+
- 7
|
30
|
+
- 1
|
31
|
+
version: 1.7.1
|
32
|
+
type: :runtime
|
33
33
|
version_requirements: *id001
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
35
|
+
name: rspec
|
36
36
|
prerelease: false
|
37
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
@@ -40,10 +40,10 @@ dependencies:
|
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
segments:
|
42
42
|
- 1
|
43
|
-
-
|
44
|
-
-
|
45
|
-
version: 1.
|
46
|
-
type: :
|
43
|
+
- 2
|
44
|
+
- 9
|
45
|
+
version: 1.2.9
|
46
|
+
type: :development
|
47
47
|
version_requirements: *id002
|
48
48
|
description: Dump and feed a tokyo cabinet for local geonames search
|
49
49
|
email: x@nofxx.com
|
@@ -62,35 +62,41 @@ files:
|
|
62
62
|
- Rakefile
|
63
63
|
- VERSION
|
64
64
|
- bin/geonames
|
65
|
+
- geonames.yml
|
65
66
|
- geonames_local.gemspec
|
67
|
+
- lib/geonames_ext.rb
|
66
68
|
- lib/geonames_local.rb
|
67
69
|
- lib/geonames_local/adapters/mongodb.rb
|
68
70
|
- lib/geonames_local/adapters/postgres.rb
|
69
71
|
- lib/geonames_local/adapters/tokyo.rb
|
70
72
|
- lib/geonames_local/cli.rb
|
71
73
|
- lib/geonames_local/config/codes.yml
|
74
|
+
- lib/geonames_local/config/geonames.sql
|
72
75
|
- lib/geonames_local/config/geonames.yml
|
73
|
-
- lib/geonames_local/data/
|
74
|
-
- lib/geonames_local/data/
|
76
|
+
- lib/geonames_local/data/dump.rb
|
77
|
+
- lib/geonames_local/data/export.rb
|
75
78
|
- lib/geonames_local/data/shp.rb
|
76
|
-
- lib/geonames_local/dump.rb
|
77
|
-
- lib/geonames_local/export.rb
|
78
|
-
- lib/geonames_local/features/city.rb
|
79
|
-
- lib/geonames_local/features/country.rb
|
80
|
-
- lib/geonames_local/features/province.rb
|
81
79
|
- lib/geonames_local/features/road.rb
|
82
80
|
- lib/geonames_local/features/spot.rb
|
83
81
|
- lib/geonames_local/features/zone.rb
|
82
|
+
- lib/geonames_local/geonames.rb
|
83
|
+
- lib/geonames_local/model/city.rb
|
84
|
+
- lib/geonames_local/model/conn.rb
|
85
|
+
- lib/geonames_local/model/country.rb
|
86
|
+
- lib/geonames_local/model/province.rb
|
87
|
+
- spec/geonames_local/adapters/mongodb_spec.rb
|
88
|
+
- spec/geonames_local/adapters/postgres_spec.rb
|
89
|
+
- spec/geonames_local/adapters/tokyo_spec.rb
|
84
90
|
- spec/geonames_local/cli_spec.rb
|
85
91
|
- spec/geonames_local/data/cache_spec.rb
|
86
|
-
- spec/geonames_local/data/postgres_spec.rb
|
87
92
|
- spec/geonames_local/data/shp_spec.rb
|
88
|
-
- spec/geonames_local/data/tokyo_spec.rb
|
89
93
|
- spec/geonames_local/features/road_spec.rb
|
90
94
|
- spec/geonames_local/features/spot_spec.rb
|
91
95
|
- spec/geonames_local/features/zone_spec.rb
|
96
|
+
- spec/geonames_local/model/city_spec.rb
|
92
97
|
- spec/geonames_local_spec.rb
|
93
98
|
- spec/spec.opts
|
99
|
+
- spec/spec_ext_helper.rb
|
94
100
|
- spec/spec_helper.rb
|
95
101
|
- task/benchmark.rb
|
96
102
|
- task/benchmark_cabinet.rb
|
@@ -150,11 +156,14 @@ summary: Dump and feed a tokyo local geonames db
|
|
150
156
|
test_files:
|
151
157
|
- spec/spec_helper.rb
|
152
158
|
- spec/geonames_local/data/shp_spec.rb
|
153
|
-
- spec/geonames_local/data/postgres_spec.rb
|
154
|
-
- spec/geonames_local/data/tokyo_spec.rb
|
155
159
|
- spec/geonames_local/data/cache_spec.rb
|
160
|
+
- spec/geonames_local/model/city_spec.rb
|
156
161
|
- spec/geonames_local/cli_spec.rb
|
162
|
+
- spec/geonames_local/adapters/postgres_spec.rb
|
163
|
+
- spec/geonames_local/adapters/tokyo_spec.rb
|
164
|
+
- spec/geonames_local/adapters/mongodb_spec.rb
|
157
165
|
- spec/geonames_local/features/spot_spec.rb
|
158
166
|
- spec/geonames_local/features/zone_spec.rb
|
159
167
|
- spec/geonames_local/features/road_spec.rb
|
160
168
|
- spec/geonames_local_spec.rb
|
169
|
+
- spec/spec_ext_helper.rb
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Geonames
|
2
|
-
class Geoquery
|
3
|
-
R = 1
|
4
|
-
|
5
|
-
def self.point(tdb, x, y)
|
6
|
-
qry = TDBQRY::new(tdb)
|
7
|
-
qry.addcond("x", TDBQRY::QCNUMGE, minx.to_s())
|
8
|
-
qry.addcond("x", TDBQRY::QCNUMLE, maxx.to_s())
|
9
|
-
qry.addcond("y", TDBQRY::QCNUMGE, miny.to_s())
|
10
|
-
qry.addcond("y", TDBQRY::QCNUMLE, maxy.to_s())
|
11
|
-
qry.setorder("x", TDBQRY::QONUMASC)
|
12
|
-
qry.setlimit(80)
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
def self.area(tdb, minx, maxx, miny, maxy)
|
17
|
-
qry = TDBQRY::new(tdb)
|
18
|
-
qry.addcond("x", TDBQRY::QCNUMGE, minx.to_s())
|
19
|
-
qry.addcond("x", TDBQRY::QCNUMLE, maxx.to_s())
|
20
|
-
qry.addcond("y", TDBQRY::QCNUMGE, miny.to_s())
|
21
|
-
qry.addcond("y", TDBQRY::QCNUMLE, maxy.to_s())
|
22
|
-
qry.setorder("x", TDBQRY::QONUMASC)
|
23
|
-
|
24
|
-
res = qry.search
|
25
|
-
info res.length # number of results found
|
26
|
-
return res
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|