geonames_local 0.2.1 → 0.3.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 +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
|