spatial_adapter 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/VERSION +1 -1
- data/lib/spatial_adapter/adapters/mysql.rb +3 -7
- data/lib/spatial_adapter/adapters/postgis.rb +116 -36
- data/lib/spatial_adapter/schema_dumper.rb +2 -1
- data/lib/spatial_adapter/spatial_column.rb +11 -7
- data/spec/db/postgis_raw.rb +94 -0
- data/spec/models/common.rb +33 -0
- data/spec/mysql/connection_adapter_spec.rb +2 -2
- data/spec/postgis/connection_adapter_spec.rb +58 -14
- data/spec/postgis/migration_spec.rb +158 -26
- data/spec/postgis/models_spec.rb +125 -4
- data/spec/postgis/schema_dumper_spec.rb +25 -5
- data/spec/spec_helper.rb +2 -2
- metadata +1 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -3,7 +3,7 @@ require 'active_record/connection_adapters/mysql_adapter'
|
|
3
3
|
ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
|
4
4
|
include SpatialAdapter
|
5
5
|
|
6
|
-
def
|
6
|
+
def supports_geographic?
|
7
7
|
false
|
8
8
|
end
|
9
9
|
|
@@ -28,12 +28,8 @@ ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
|
|
28
28
|
columns = []
|
29
29
|
result = execute(sql, name)
|
30
30
|
result.each do |field|
|
31
|
-
|
32
|
-
|
33
|
-
columns << ActiveRecord::ConnectionAdapters::SpatialMysqlColumn.new(field[0], field[4], field[1], field[2] == "YES")
|
34
|
-
else
|
35
|
-
columns << ActiveRecord::ConnectionAdapters::MysqlColumn.new(field[0], field[4], field[1], field[2] == "YES")
|
36
|
-
end
|
31
|
+
klass = field[1] =~ /geometry|point|linestring|polygon|multipoint|multilinestring|multipolygon|geometrycollection/i ? ActiveRecord::ConnectionAdapters::SpatialMysqlColumn : ActiveRecord::ConnectionAdapters::MysqlColumn
|
32
|
+
columns << klass.new(field[0], field[4], field[1], field[2] == "YES")
|
37
33
|
end
|
38
34
|
result.free
|
39
35
|
columns
|
@@ -25,7 +25,7 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
25
25
|
!postgis_version.nil?
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def supports_geographic?
|
29
29
|
postgis_major_version > 1 || (postgis_major_version == 1 && postgis_minor_version >= 5)
|
30
30
|
end
|
31
31
|
|
@@ -49,9 +49,12 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
49
49
|
|
50
50
|
column_definitions(table_name).collect do |name, type, default, notnull|
|
51
51
|
case type
|
52
|
+
when /geography/i
|
53
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.create_from_geography(name, default, type, notnull == 'f')
|
52
54
|
when /geometry/i
|
53
55
|
raw_geom_info = raw_geom_infos[name]
|
54
56
|
if raw_geom_info.nil?
|
57
|
+
# This column isn't in the geometry_columns table, so we don't know anything else about it
|
55
58
|
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.create_simplified(name, default, notnull == "f")
|
56
59
|
else
|
57
60
|
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.new(name, default, raw_geom_info.type, notnull == "f", raw_geom_info.srid, raw_geom_info.with_z, raw_geom_info.with_m)
|
@@ -77,26 +80,28 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
77
80
|
create_sql << "#{quote_table_name(table_name)} ("
|
78
81
|
create_sql << table_definition.to_sql
|
79
82
|
create_sql << ") #{options[:options]}"
|
80
|
-
execute create_sql
|
81
83
|
|
82
84
|
# This is the additional portion for PostGIS
|
83
85
|
unless table_definition.geom_columns.nil?
|
84
86
|
table_definition.geom_columns.each do |geom_column|
|
85
|
-
|
87
|
+
geom_column.table_name = table_name
|
88
|
+
create_sql << "; " + geom_column.to_sql
|
86
89
|
end
|
87
90
|
end
|
91
|
+
|
92
|
+
execute create_sql
|
88
93
|
end
|
89
94
|
|
90
95
|
alias :original_remove_column :remove_column
|
91
|
-
def remove_column(table_name,
|
96
|
+
def remove_column(table_name, *column_names)
|
97
|
+
column_names = column_names.flatten
|
92
98
|
columns(table_name).each do |col|
|
93
|
-
if col.name
|
94
|
-
#
|
95
|
-
|
96
|
-
|
97
|
-
execute "SELECT DropGeometryColumn('#{table_name}','#{column_name}')"
|
99
|
+
if column_names.include?(col.name.to_sym)
|
100
|
+
# Geometry columns have to be removed using DropGeometryColumn
|
101
|
+
if col.type == :geometry && !col.geographic?
|
102
|
+
execute "SELECT DropGeometryColumn('#{table_name}','#{col.name}')"
|
98
103
|
else
|
99
|
-
original_remove_column(table_name,
|
104
|
+
original_remove_column(table_name, col.name)
|
100
105
|
end
|
101
106
|
end
|
102
107
|
end
|
@@ -104,9 +109,20 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
104
109
|
|
105
110
|
alias :original_add_column :add_column
|
106
111
|
def add_column(table_name, column_name, type, options = {})
|
107
|
-
unless geometry_data_types[type].nil?
|
108
|
-
geom_column = ActiveRecord::ConnectionAdapters::PostgreSQLColumnDefinition.new(self, column_name, type, nil, nil, options[:null], options[:srid] || -1 , options[:with_z] || false , options[:with_m] || false)
|
109
|
-
|
112
|
+
unless geometry_data_types[type].nil?
|
113
|
+
geom_column = ActiveRecord::ConnectionAdapters::PostgreSQLColumnDefinition.new(self, column_name, type, nil, nil, options[:null], options[:srid] || -1 , options[:with_z] || false , options[:with_m] || false, options[:geographic] || false)
|
114
|
+
if geom_column.geographic
|
115
|
+
default = options[:default]
|
116
|
+
notnull = options[:null] == false
|
117
|
+
|
118
|
+
execute("ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{geom_column.to_sql}")
|
119
|
+
|
120
|
+
change_column_default(table_name, column_name, default) if options_include_default?(options)
|
121
|
+
change_column_null(table_name, column_name, false, default) if notnull
|
122
|
+
else
|
123
|
+
geom_column.table_name = table_name
|
124
|
+
execute geom_column.to_sql
|
125
|
+
end
|
110
126
|
else
|
111
127
|
original_add_column(table_name, column_name, type, options)
|
112
128
|
end
|
@@ -228,14 +244,21 @@ module ActiveRecord
|
|
228
244
|
unless (@base.geometry_data_types[type.to_sym].nil? or
|
229
245
|
(options[:create_using_addgeometrycolumn] == false))
|
230
246
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
247
|
+
column = self[name] || PostgreSQLColumnDefinition.new(@base, name, type)
|
248
|
+
column.null = options[:null]
|
249
|
+
column.srid = options[:srid] || -1
|
250
|
+
column.with_z = options[:with_z] || false
|
251
|
+
column.with_m = options[:with_m] || false
|
252
|
+
column.geographic = options[:geographic] || false
|
253
|
+
|
254
|
+
if column.geographic
|
255
|
+
@columns << column unless @columns.include? column
|
256
|
+
else
|
257
|
+
# Hold this column for later
|
258
|
+
@geom_columns ||= []
|
259
|
+
@geom_columns << column
|
260
|
+
end
|
261
|
+
self
|
239
262
|
else
|
240
263
|
super(name, type, options)
|
241
264
|
end
|
@@ -243,20 +266,37 @@ module ActiveRecord
|
|
243
266
|
end
|
244
267
|
|
245
268
|
class PostgreSQLColumnDefinition < ColumnDefinition
|
246
|
-
attr_accessor :
|
269
|
+
attr_accessor :table_name
|
270
|
+
attr_accessor :srid, :with_z, :with_m, :geographic
|
247
271
|
attr_reader :spatial
|
248
272
|
|
249
|
-
def initialize(base = nil, name = nil, type=nil, limit=nil, default=nil, null=nil, srid=-1, with_z=false, with_m=false)
|
250
|
-
super(base, name, type, limit, default,null)
|
273
|
+
def initialize(base = nil, name = nil, type=nil, limit=nil, default=nil, null=nil, srid=-1, with_z=false, with_m=false, geographic=false)
|
274
|
+
super(base, name, type, limit, default, null)
|
275
|
+
@table_name = nil
|
251
276
|
@spatial = true
|
252
277
|
@srid = srid
|
253
278
|
@with_z = with_z
|
254
279
|
@with_m = with_m
|
280
|
+
@geographic = geographic
|
255
281
|
end
|
256
282
|
|
257
|
-
def
|
258
|
-
if
|
259
|
-
type_sql =
|
283
|
+
def sql_type
|
284
|
+
if geographic
|
285
|
+
type_sql = base.geometry_data_types[type.to_sym][:name]
|
286
|
+
type_sql += "Z" if with_z
|
287
|
+
type_sql += "M" if with_m
|
288
|
+
# SRID is not yet supported (defaults to 4326)
|
289
|
+
#type_sql += ", #{srid}" if (srid && srid != -1)
|
290
|
+
type_sql = "geography(#{type_sql})"
|
291
|
+
type_sql
|
292
|
+
else
|
293
|
+
super
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
def to_sql
|
298
|
+
if spatial && !geographic
|
299
|
+
type_sql = base.geometry_data_types[type.to_sym][:name]
|
260
300
|
type_sql += "M" if with_m and !with_z
|
261
301
|
if with_m and with_z
|
262
302
|
dimension = 4
|
@@ -265,7 +305,7 @@ module ActiveRecord
|
|
265
305
|
else
|
266
306
|
dimension = 2
|
267
307
|
end
|
268
|
-
|
308
|
+
|
269
309
|
column_sql = "SELECT AddGeometryColumn('#{table_name}','#{name}',#{srid},'#{type_sql}',#{dimension})"
|
270
310
|
column_sql += ";ALTER TABLE #{table_name} ALTER #{name} SET NOT NULL" if null == false
|
271
311
|
column_sql
|
@@ -273,12 +313,6 @@ module ActiveRecord
|
|
273
313
|
super
|
274
314
|
end
|
275
315
|
end
|
276
|
-
|
277
|
-
private
|
278
|
-
|
279
|
-
def type_to_sql(name, limit=nil)
|
280
|
-
base.type_to_sql(name, limit) rescue name
|
281
|
-
end
|
282
316
|
end
|
283
317
|
end
|
284
318
|
end
|
@@ -288,14 +322,60 @@ module ActiveRecord
|
|
288
322
|
class SpatialPostgreSQLColumn < PostgreSQLColumn
|
289
323
|
include SpatialAdapter::SpatialColumn
|
290
324
|
|
325
|
+
def initialize(name, default, sql_type = nil, null = true, srid=-1, with_z=false, with_m=false, geographic = false)
|
326
|
+
super(name, default, sql_type, null, srid, with_z, with_m)
|
327
|
+
@geographic = geographic
|
328
|
+
end
|
329
|
+
|
330
|
+
def geographic?
|
331
|
+
@geographic
|
332
|
+
end
|
333
|
+
|
291
334
|
#Transforms a string to a geometry. PostGIS returns a HewEWKB string.
|
292
335
|
def self.string_to_geometry(string)
|
293
336
|
return string unless string.is_a?(String)
|
294
337
|
GeoRuby::SimpleFeatures::Geometry.from_hex_ewkb(string) rescue nil
|
295
338
|
end
|
296
339
|
|
297
|
-
def self.create_simplified(name,default,null = true)
|
298
|
-
new(name,default,"geometry",null
|
340
|
+
def self.create_simplified(name, default, null = true)
|
341
|
+
new(name, default, "geometry", null)
|
342
|
+
end
|
343
|
+
|
344
|
+
def self.create_from_geography(name, default, sql_type, null = true)
|
345
|
+
params = extract_geography_params(sql_type)
|
346
|
+
new(name, default, sql_type, null, params[:srid], params[:with_z], params[:with_m], true)
|
347
|
+
end
|
348
|
+
|
349
|
+
private
|
350
|
+
|
351
|
+
# Add detection of PostGIS-specific geography columns
|
352
|
+
def geometry_simplified_type(sql_type)
|
353
|
+
case sql_type
|
354
|
+
when /geography\(point/i then :point
|
355
|
+
when /geography\(linestring/i then :line_string
|
356
|
+
when /geography\(polygon/i then :polygon
|
357
|
+
when /geography\(multipoint/i then :multi_point
|
358
|
+
when /geography\(multilinestring/i then :multi_line_string
|
359
|
+
when /geography\(multipolygon/i then :multi_polygon
|
360
|
+
when /geography\(geometrycollection/i then :geometry_collection
|
361
|
+
when /geography/i then :geometry
|
362
|
+
else
|
363
|
+
super
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
def self.extract_geography_params(sql_type)
|
368
|
+
params = {
|
369
|
+
:srid => 0,
|
370
|
+
:with_z => false,
|
371
|
+
:with_m => false
|
372
|
+
}
|
373
|
+
if sql_type =~ /geography(?:\((?:\w+?)(Z)?(M)?(?:,(\d+))?\))?/i
|
374
|
+
params[:with_z] = $1 == 'Z'
|
375
|
+
params[:with_m] = $2 == 'M'
|
376
|
+
params[:srid] = $3.to_i
|
377
|
+
end
|
378
|
+
params
|
299
379
|
end
|
300
380
|
end
|
301
381
|
end
|
@@ -2,7 +2,7 @@ ActiveRecord::SchemaDumper.ignore_tables << "spatial_ref_sys" << "geometry_colum
|
|
2
2
|
|
3
3
|
ActiveRecord::SchemaDumper.class_eval do
|
4
4
|
# These are the valid options for a column specification (spatial options added)
|
5
|
-
VALID_COLUMN_SPEC_KEYS = [:name, :limit, :precision, :scale, :default, :null, :srid, :with_z, :with_m]
|
5
|
+
VALID_COLUMN_SPEC_KEYS = [:name, :limit, :precision, :scale, :default, :null, :srid, :with_z, :with_m, :geographic]
|
6
6
|
|
7
7
|
def table(table, stream)
|
8
8
|
columns = @connection.columns(table)
|
@@ -129,6 +129,7 @@ ActiveRecord::SchemaDumper.class_eval do
|
|
129
129
|
spec[:srid] = column.srid.inspect if column.srid != -1
|
130
130
|
spec[:with_z] = 'true' if column.with_z
|
131
131
|
spec[:with_m] = 'true' if column.with_m
|
132
|
+
spec[:geographic] = 'true' if column.geographic?
|
132
133
|
end
|
133
134
|
spec
|
134
135
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module SpatialAdapter
|
2
2
|
module SpatialColumn
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :geometry_type, :srid, :with_z, :with_m
|
4
4
|
|
5
|
-
def initialize(name, default, sql_type = nil, null = true,srid=-1,with_z=false,with_m=false)
|
5
|
+
def initialize(name, default, sql_type = nil, null = true, srid=-1, with_z=false, with_m=false)
|
6
6
|
super(name, default, sql_type, null)
|
7
7
|
@geometry_type = geometry_simplified_type(@sql_type)
|
8
8
|
@srid = srid
|
@@ -10,6 +10,10 @@ module SpatialAdapter
|
|
10
10
|
@with_m = with_m
|
11
11
|
end
|
12
12
|
|
13
|
+
def geographic?
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
13
17
|
# Redefines type_cast to add support for geometries
|
14
18
|
# alias_method :type_cast_without_spatial, :type_cast
|
15
19
|
def type_cast(value)
|
@@ -43,17 +47,17 @@ module SpatialAdapter
|
|
43
47
|
|
44
48
|
private
|
45
49
|
|
46
|
-
#Redefines the simplified_type method to
|
50
|
+
#Redefines the simplified_type method to spatial columns
|
47
51
|
def simplified_type(field_type)
|
48
52
|
case field_type
|
49
|
-
when /geometry|point|linestring|polygon|multipoint|multilinestring|multipolygon|geometrycollection/i then :geometry
|
53
|
+
when /geography|geometry|point|linestring|polygon|multipoint|multilinestring|multipolygon|geometrycollection/i then :geometry
|
50
54
|
else super
|
51
55
|
end
|
52
56
|
end
|
53
57
|
|
54
|
-
#less simlpified geometric type to be use in migrations
|
55
|
-
def geometry_simplified_type(
|
56
|
-
case
|
58
|
+
# less simlpified geometric type to be use in migrations
|
59
|
+
def geometry_simplified_type(sql_type)
|
60
|
+
case sql_type
|
57
61
|
when /^point$/i then :point
|
58
62
|
when /^linestring$/i then :line_string
|
59
63
|
when /^polygon$/i then :polygon
|
data/spec/db/postgis_raw.rb
CHANGED
@@ -93,4 +93,98 @@ ActiveRecord::Schema.define() do
|
|
93
93
|
);
|
94
94
|
select AddGeometryColumn('point4_models', 'geom', 4326, 'POINT', 4);
|
95
95
|
SQL
|
96
|
+
|
97
|
+
if ActiveRecord::Base.connection.supports_geographic?
|
98
|
+
execute <<-SQL
|
99
|
+
drop table if exists geography_point_models;
|
100
|
+
create table geography_point_models
|
101
|
+
(
|
102
|
+
id serial primary key,
|
103
|
+
extra varchar(255),
|
104
|
+
geom geography(POINT)
|
105
|
+
);
|
106
|
+
create index index_geography_point_models_on_geom on geography_point_models using gist (geom);
|
107
|
+
create index index_geography_point_models_on_extra on geography_point_models (extra);
|
108
|
+
|
109
|
+
drop table if exists geography_line_string_models;
|
110
|
+
create table geography_line_string_models
|
111
|
+
(
|
112
|
+
id serial primary key,
|
113
|
+
extra varchar(255),
|
114
|
+
geom geography(LINESTRING)
|
115
|
+
);
|
116
|
+
|
117
|
+
drop table if exists geography_polygon_models;
|
118
|
+
create table geography_polygon_models
|
119
|
+
(
|
120
|
+
id serial primary key,
|
121
|
+
extra varchar(255),
|
122
|
+
geom geography(POLYGON)
|
123
|
+
);
|
124
|
+
|
125
|
+
drop table if exists geography_multi_point_models;
|
126
|
+
create table geography_multi_point_models
|
127
|
+
(
|
128
|
+
id serial primary key,
|
129
|
+
extra varchar(255),
|
130
|
+
geom geography(MULTIPOINT)
|
131
|
+
);
|
132
|
+
|
133
|
+
drop table if exists geography_multi_line_string_models;
|
134
|
+
create table geography_multi_line_string_models
|
135
|
+
(
|
136
|
+
id serial primary key,
|
137
|
+
extra varchar(255),
|
138
|
+
geom geography(MULTILINESTRING)
|
139
|
+
);
|
140
|
+
|
141
|
+
drop table if exists geography_multi_polygon_models;
|
142
|
+
create table geography_multi_polygon_models
|
143
|
+
(
|
144
|
+
id serial primary key,
|
145
|
+
extra varchar(255),
|
146
|
+
geom geography(MULTIPOLYGON)
|
147
|
+
);
|
148
|
+
|
149
|
+
drop table if exists geography_geometry_collection_models;
|
150
|
+
create table geography_geometry_collection_models
|
151
|
+
(
|
152
|
+
id serial primary key,
|
153
|
+
extra varchar(255),
|
154
|
+
geom geography(GEOMETRYCOLLECTION)
|
155
|
+
);
|
156
|
+
|
157
|
+
drop table if exists geography_models;
|
158
|
+
create table geography_models
|
159
|
+
(
|
160
|
+
id serial primary key,
|
161
|
+
extra varchar(255),
|
162
|
+
geom geography
|
163
|
+
);
|
164
|
+
|
165
|
+
drop table if exists geography_pointz_models;
|
166
|
+
create table geography_pointz_models
|
167
|
+
(
|
168
|
+
id serial primary key,
|
169
|
+
extra varchar(255),
|
170
|
+
geom geography(POINTZ)
|
171
|
+
);
|
172
|
+
|
173
|
+
drop table if exists geography_pointm_models;
|
174
|
+
create table geography_pointm_models
|
175
|
+
(
|
176
|
+
id serial primary key,
|
177
|
+
extra varchar(255),
|
178
|
+
geom geography(POINTM)
|
179
|
+
);
|
180
|
+
|
181
|
+
drop table if exists geography_point4_models;
|
182
|
+
create table geography_point4_models
|
183
|
+
(
|
184
|
+
id serial primary key,
|
185
|
+
extra varchar(255),
|
186
|
+
geom geography(POINTZM)
|
187
|
+
);
|
188
|
+
SQL
|
189
|
+
end
|
96
190
|
end
|
data/spec/models/common.rb
CHANGED
@@ -30,3 +30,36 @@ end
|
|
30
30
|
|
31
31
|
class Point4Model < ActiveRecord::Base
|
32
32
|
end
|
33
|
+
|
34
|
+
class GeographyPointModel < ActiveRecord::Base
|
35
|
+
end
|
36
|
+
|
37
|
+
class GeographyLineStringModel < ActiveRecord::Base
|
38
|
+
end
|
39
|
+
|
40
|
+
class GeographyPolygonModel < ActiveRecord::Base
|
41
|
+
end
|
42
|
+
|
43
|
+
class GeographyMultiPointModel < ActiveRecord::Base
|
44
|
+
end
|
45
|
+
|
46
|
+
class GeographyMultiLineStringModel < ActiveRecord::Base
|
47
|
+
end
|
48
|
+
|
49
|
+
class GeographyMultiPolygonModel < ActiveRecord::Base
|
50
|
+
end
|
51
|
+
|
52
|
+
class GeographyGeometryCollectionModel < ActiveRecord::Base
|
53
|
+
end
|
54
|
+
|
55
|
+
class GeographyModel < ActiveRecord::Base
|
56
|
+
end
|
57
|
+
|
58
|
+
class GeographyPointzModel < ActiveRecord::Base
|
59
|
+
end
|
60
|
+
|
61
|
+
class GeographyPointmModel < ActiveRecord::Base
|
62
|
+
end
|
63
|
+
|
64
|
+
class GeographyPoint4Model < ActiveRecord::Base
|
65
|
+
end
|
@@ -8,9 +8,9 @@ describe "Modified MysqlAdapter" do
|
|
8
8
|
@connection = ActiveRecord::Base.connection
|
9
9
|
end
|
10
10
|
|
11
|
-
describe '#
|
11
|
+
describe '#supports_geographic?' do
|
12
12
|
it "should be false" do
|
13
|
-
@connection.
|
13
|
+
@connection.supports_geographic?.should == false
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -56,27 +56,39 @@ describe "Modified PostgreSQLAdapter" do
|
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
|
-
describe '#
|
59
|
+
describe '#supports_geographic?' do
|
60
60
|
it "should be true for PostGIS version 1.5.0" do
|
61
61
|
@connection.stub!(:postgis_version).and_return('1.5.0')
|
62
|
-
@connection.
|
62
|
+
@connection.supports_geographic?.should == true
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should be true for PostGIS newer than 1.5.0" do
|
66
66
|
@connection.stub!(:postgis_version).and_return('1.5.1')
|
67
|
-
@connection.
|
67
|
+
@connection.supports_geographic?.should == true
|
68
68
|
end
|
69
69
|
|
70
70
|
it "should be true for PostGIS older than 1.5.0" do
|
71
71
|
@connection.stub!(:postgis_version).and_return('1.4.0')
|
72
|
-
@connection.
|
72
|
+
@connection.supports_geographic?.should == false
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
76
|
describe "#columns" do
|
77
77
|
describe "type" do
|
78
|
-
it "should be SpatialPostgreSQLColumn if column is a
|
79
|
-
PointModel.columns.select{|c| c.name == 'geom'}.first
|
78
|
+
it "should be a regular SpatialPostgreSQLColumn if column is a geometry data type" do
|
79
|
+
column = PointModel.columns.select{|c| c.name == 'geom'}.first
|
80
|
+
column.should be_a(ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn)
|
81
|
+
column.type.should == :geometry
|
82
|
+
column.geometry_type.should == :point
|
83
|
+
column.should_not be_geographic
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should be a geographic SpatialPostgreSQLColumn if column is a geography data type" do
|
87
|
+
column = GeographyPointModel.columns.select{|c| c.name == 'geom'}.first
|
88
|
+
column.should be_a(ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn)
|
89
|
+
column.type.should == :geometry
|
90
|
+
column.geometry_type.should == :point
|
91
|
+
column.should be_geographic
|
80
92
|
end
|
81
93
|
|
82
94
|
it "should be PostgreSQLColumn if column is not a spatial data type" do
|
@@ -85,37 +97,69 @@ describe "Modified PostgreSQLAdapter" do
|
|
85
97
|
end
|
86
98
|
|
87
99
|
describe "@geometry_type" do
|
88
|
-
it "should be :point for columns restricted to POINT types" do
|
100
|
+
it "should be :point for geometry columns restricted to POINT types" do
|
89
101
|
PointModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :point
|
90
102
|
end
|
91
103
|
|
92
|
-
it "should be :line_string for columns restricted to LINESTRING types" do
|
104
|
+
it "should be :line_string for geometry columns restricted to LINESTRING types" do
|
93
105
|
LineStringModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :line_string
|
94
106
|
end
|
95
107
|
|
96
|
-
it "should be :polygon for columns restricted to POLYGON types" do
|
108
|
+
it "should be :polygon for geometry columns restricted to POLYGON types" do
|
97
109
|
PolygonModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :polygon
|
98
110
|
end
|
99
111
|
|
100
|
-
it "should be :multi_point for columns restricted to MULTIPOINT types" do
|
112
|
+
it "should be :multi_point for geometry columns restricted to MULTIPOINT types" do
|
101
113
|
MultiPointModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :multi_point
|
102
114
|
end
|
103
115
|
|
104
|
-
it "should be :multi_line_string for columns restricted to MULTILINESTRING types" do
|
116
|
+
it "should be :multi_line_string for geometry columns restricted to MULTILINESTRING types" do
|
105
117
|
MultiLineStringModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :multi_line_string
|
106
118
|
end
|
107
119
|
|
108
|
-
it "should be :multi_polygon for columns restricted to MULTIPOLYGON types" do
|
120
|
+
it "should be :multi_polygon for geometry columns restricted to MULTIPOLYGON types" do
|
109
121
|
MultiPolygonModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :multi_polygon
|
110
122
|
end
|
111
123
|
|
112
|
-
it "should be :geometry_collection for columns restricted to GEOMETRYCOLLECTION types" do
|
124
|
+
it "should be :geometry_collection for geometry columns restricted to GEOMETRYCOLLECTION types" do
|
113
125
|
GeometryCollectionModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :geometry_collection
|
114
126
|
end
|
115
127
|
|
116
|
-
it "should be :geometry for columns not restricted to a type" do
|
128
|
+
it "should be :geometry for geometry columns not restricted to a type" do
|
117
129
|
GeometryModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :geometry
|
118
130
|
end
|
131
|
+
|
132
|
+
it "should be :point for geography columns restricted to POINT types" do
|
133
|
+
GeographyPointModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :point
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should be :line_string for geography columns restricted to LINESTRING types" do
|
137
|
+
GeographyLineStringModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :line_string
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should be :polygon for geography columns restricted to POLYGON types" do
|
141
|
+
GeographyPolygonModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :polygon
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should be :multi_point for geography columns restricted to MULTIPOINT types" do
|
145
|
+
GeographyMultiPointModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :multi_point
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should be :multi_line_string for geography columns restricted to MULTILINESTRING types" do
|
149
|
+
GeographyMultiLineStringModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :multi_line_string
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should be :multi_polygon for geography columns restricted to MULTIPOLYGON types" do
|
153
|
+
GeographyMultiPolygonModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :multi_polygon
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should be :geometry_collection for geography columns restricted to GEOMETRYCOLLECTION types" do
|
157
|
+
GeographyGeometryCollectionModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :geometry_collection
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should be :geometry for geography columns not restricted to a type" do
|
161
|
+
GeographyModel.columns.select{|c| c.name == 'geom'}.first.geometry_type.should == :geometry
|
162
|
+
end
|
119
163
|
end
|
120
164
|
end
|
121
165
|
|
@@ -22,17 +22,38 @@ describe "Spatially-enabled Migrations" do
|
|
22
22
|
t.send(type, :geom)
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
27
27
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
28
|
-
geom_column.geometry_type.should == type
|
29
28
|
geom_column.type.should == :geometry
|
29
|
+
geom_column.geometry_type.should == type
|
30
|
+
geom_column.should_not be_geographic
|
30
31
|
geom_column.with_z.should == false
|
31
32
|
geom_column.with_m.should == false
|
32
33
|
geom_column.srid.should == -1
|
33
34
|
end
|
35
|
+
|
36
|
+
it "should create #{type.to_s} geographic columns" do
|
37
|
+
ActiveRecord::Schema.define do
|
38
|
+
create_table :migrated_geometry_models, :force => true do |t|
|
39
|
+
t.integer :extra
|
40
|
+
t.column :geom, type, :geographic => true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
45
|
+
|
46
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
47
|
+
geom_column.type.should == :geometry
|
48
|
+
geom_column.geometry_type.should == type
|
49
|
+
geom_column.should be_geographic
|
50
|
+
geom_column.with_z.should == false
|
51
|
+
geom_column.with_m.should == false
|
52
|
+
#geom_column.srid.should == 4326 # SRID is currently irrelevant for geography columns
|
53
|
+
end
|
34
54
|
end
|
35
55
|
|
56
|
+
|
36
57
|
it "should create 3d (xyz) geometry columns" do
|
37
58
|
ActiveRecord::Schema.define do
|
38
59
|
create_table :migrated_geometry_models, :force => true do |t|
|
@@ -84,19 +105,70 @@ describe "Spatially-enabled Migrations" do
|
|
84
105
|
geom_column.srid.should == -1
|
85
106
|
end
|
86
107
|
|
87
|
-
|
88
|
-
|
108
|
+
it "should create 3d (xyz) geographic columns" do
|
109
|
+
ActiveRecord::Schema.define do
|
110
|
+
create_table :migrated_geometry_models, :force => true do |t|
|
111
|
+
t.integer :extra
|
112
|
+
t.point :geom, :with_z => true, :geographic => true
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
117
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
118
|
+
geom_column.should be_geographic
|
119
|
+
geom_column.with_z.should == true
|
120
|
+
geom_column.with_m.should == false
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
it "should create 3d (xym) geographic columns" do
|
125
|
+
ActiveRecord::Schema.define do
|
126
|
+
create_table :migrated_geometry_models, :force => true do |t|
|
127
|
+
t.integer :extra
|
128
|
+
t.point :geom, :with_m => true, :geographic => true
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
133
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
134
|
+
geom_column.geometry_type.should == :point
|
135
|
+
geom_column.type.should == :geometry
|
136
|
+
geom_column.should be_geographic
|
137
|
+
geom_column.with_z.should == false
|
138
|
+
geom_column.with_m.should == true
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
it "should create 4d (xyzm) geographic columns" do
|
143
|
+
ActiveRecord::Schema.define do
|
144
|
+
create_table :migrated_geometry_models, :force => true do |t|
|
145
|
+
t.integer :extra
|
146
|
+
t.point :geom, :with_z => true, :with_m => true, :geographic => true
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
151
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
152
|
+
geom_column.geometry_type.should == :point
|
153
|
+
geom_column.should be_geographic
|
154
|
+
geom_column.type.should == :geometry
|
155
|
+
geom_column.with_z.should == true
|
156
|
+
geom_column.with_m.should == true
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
it "should create geometry columns with specified SRID" do
|
89
161
|
ActiveRecord::Schema.define do
|
90
162
|
create_table :migrated_geometry_models, :force => true do |t|
|
91
163
|
t.integer :extra
|
92
164
|
t.geometry :geom, :srid => 4326
|
93
165
|
end
|
94
166
|
end
|
95
|
-
|
167
|
+
|
96
168
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
97
169
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
98
|
-
geom_column.geometry_type.should == :geometry
|
99
170
|
geom_column.type.should == :geometry
|
171
|
+
geom_column.geometry_type.should == :geometry
|
100
172
|
geom_column.with_z.should == false
|
101
173
|
geom_column.with_m.should == false
|
102
174
|
geom_column.srid.should == 4326
|
@@ -115,70 +187,116 @@ describe "Spatially-enabled Migrations" do
|
|
115
187
|
after :each do
|
116
188
|
@connection.drop_table "migrated_geometry_models"
|
117
189
|
end
|
118
|
-
|
190
|
+
|
119
191
|
SpatialAdapter.geometry_data_types.keys.each do |type|
|
120
192
|
it "should add #{type.to_s} columns" do
|
121
193
|
ActiveRecord::Schema.define do
|
122
194
|
add_column :migrated_geometry_models, :geom, type
|
123
195
|
end
|
124
|
-
|
196
|
+
|
125
197
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
126
198
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
127
|
-
geom_column.geometry_type.should == type
|
128
199
|
geom_column.type.should == :geometry
|
200
|
+
geom_column.geometry_type.should == type
|
129
201
|
geom_column.with_z.should == false
|
130
202
|
geom_column.with_m.should == false
|
131
203
|
geom_column.srid.should == -1
|
132
204
|
end
|
133
205
|
end
|
134
|
-
|
206
|
+
|
135
207
|
it "should add 3d (xyz) geometry columns" do
|
136
208
|
ActiveRecord::Schema.define do
|
137
209
|
add_column :migrated_geometry_models, :geom, :point, :with_z => true
|
138
210
|
end
|
139
|
-
|
211
|
+
|
140
212
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
141
213
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
214
|
+
geom_column.type.should == :geometry
|
215
|
+
geom_column.geometry_type.should == :point
|
142
216
|
geom_column.with_z.should == true
|
143
217
|
geom_column.with_m.should == false
|
144
218
|
geom_column.srid.should == -1
|
145
219
|
end
|
146
|
-
|
147
|
-
|
220
|
+
|
221
|
+
|
148
222
|
it "should add 3d (xym) geometry columns" do
|
149
223
|
ActiveRecord::Schema.define do
|
150
224
|
add_column :migrated_geometry_models, :geom, :point, :with_m => true
|
151
225
|
end
|
152
|
-
|
226
|
+
|
153
227
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
154
228
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
155
|
-
geom_column.geometry_type.should == :point
|
156
229
|
geom_column.type.should == :geometry
|
230
|
+
geom_column.geometry_type.should == :point
|
157
231
|
geom_column.with_z.should == false
|
158
232
|
geom_column.with_m.should == true
|
159
233
|
geom_column.srid.should == -1
|
160
234
|
end
|
161
|
-
|
162
|
-
|
235
|
+
|
236
|
+
|
163
237
|
it "should add 4d (xyzm) geometry columns" do
|
164
238
|
ActiveRecord::Schema.define do
|
165
239
|
add_column :migrated_geometry_models, :geom, :point, :with_z => true, :with_m => true
|
166
240
|
end
|
167
|
-
|
241
|
+
|
168
242
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
169
243
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
170
|
-
geom_column.geometry_type.should == :point
|
171
244
|
geom_column.type.should == :geometry
|
245
|
+
geom_column.geometry_type.should == :point
|
172
246
|
geom_column.with_z.should == true
|
173
247
|
geom_column.with_m.should == true
|
174
248
|
geom_column.srid.should == -1
|
175
249
|
end
|
250
|
+
|
251
|
+
it "should add 3d (xyz) geography columns" do
|
252
|
+
ActiveRecord::Schema.define do
|
253
|
+
add_column :migrated_geometry_models, :geom, :point, :with_z => true, :geographic => true
|
254
|
+
end
|
255
|
+
|
256
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
257
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
258
|
+
geom_column.type.should == :geometry
|
259
|
+
geom_column.should be_geographic
|
260
|
+
geom_column.geometry_type.should == :point
|
261
|
+
geom_column.with_z.should == true
|
262
|
+
geom_column.with_m.should == false
|
263
|
+
end
|
264
|
+
|
265
|
+
|
266
|
+
it "should add 3d (xym) geography columns" do
|
267
|
+
ActiveRecord::Schema.define do
|
268
|
+
add_column :migrated_geometry_models, :geom, :point, :with_m => true, :geographic => true
|
269
|
+
end
|
270
|
+
|
271
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
272
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
273
|
+
geom_column.type.should == :geometry
|
274
|
+
geom_column.should be_geographic
|
275
|
+
geom_column.geometry_type.should == :point
|
276
|
+
geom_column.with_z.should == false
|
277
|
+
geom_column.with_m.should == true
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
it "should add 4d (xyzm) geography columns" do
|
282
|
+
ActiveRecord::Schema.define do
|
283
|
+
add_column :migrated_geometry_models, :geom, :point, :with_z => true, :with_m => true, :geographic => true
|
284
|
+
end
|
285
|
+
|
286
|
+
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
287
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
288
|
+
geom_column.type.should == :geometry
|
289
|
+
geom_column.should be_geographic
|
290
|
+
geom_column.geometry_type.should == :point
|
291
|
+
geom_column.with_z.should == true
|
292
|
+
geom_column.with_m.should == true
|
293
|
+
end
|
176
294
|
|
177
295
|
it "should add GEOMETRY columns with specified SRID" do
|
178
296
|
ActiveRecord::Schema.define do
|
179
297
|
add_column :migrated_geometry_models, :geom, :geometry, :srid => 4326
|
180
298
|
end
|
181
|
-
|
299
|
+
|
182
300
|
geom_column = @connection.columns(:migrated_geometry_models).select{|c| c.name == 'geom'}.first
|
183
301
|
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
184
302
|
geom_column.geometry_type.should == :geometry
|
@@ -190,13 +308,10 @@ describe "Spatially-enabled Migrations" do
|
|
190
308
|
end
|
191
309
|
|
192
310
|
describe "removing columns" do
|
193
|
-
before :each do
|
194
|
-
end
|
195
|
-
|
196
311
|
after :each do
|
197
312
|
@connection.drop_table "migrated_geometry_models"
|
198
313
|
end
|
199
|
-
|
314
|
+
|
200
315
|
SpatialAdapter.geometry_data_types.keys.each do |type|
|
201
316
|
it "should remove #{type.to_s} columns using DropGeometryColumn" do
|
202
317
|
ActiveRecord::Schema.define do
|
@@ -205,7 +320,7 @@ describe "Spatially-enabled Migrations" do
|
|
205
320
|
t.send(type, :geom)
|
206
321
|
end
|
207
322
|
end
|
208
|
-
|
323
|
+
|
209
324
|
@connection.should_receive(:execute).with(/DropGeometryColumn(.*migrated_geometry_models.*geom)/)
|
210
325
|
ActiveRecord::Schema.define do
|
211
326
|
remove_column :migrated_geometry_models, :geom
|
@@ -213,6 +328,23 @@ describe "Spatially-enabled Migrations" do
|
|
213
328
|
@connection.should_receive(:execute).with(anything())
|
214
329
|
end
|
215
330
|
end
|
331
|
+
|
332
|
+
|
333
|
+
SpatialAdapter.geometry_data_types.keys.each do |type|
|
334
|
+
it "should remove #{type.to_s} geography columns using ALTER TABLE DROP COLUMN" do
|
335
|
+
ActiveRecord::Schema.define do
|
336
|
+
create_table :migrated_geometry_models, :force => true do |t|
|
337
|
+
t.integer :extra
|
338
|
+
t.send(type, :geom, :geographic => true)
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
@connection.should_receive(:execute).with(/alter table.*migrated_geometry_models.*drop.*geom/i)
|
343
|
+
ActiveRecord::Schema.define do
|
344
|
+
remove_column :migrated_geometry_models, :geom
|
345
|
+
end
|
346
|
+
@connection.should_receive(:execute).with(anything())
|
347
|
+
end
|
348
|
+
end
|
216
349
|
end
|
217
|
-
|
218
350
|
end
|
data/spec/postgis/models_spec.rb
CHANGED
@@ -74,6 +74,72 @@ describe "Spatially-enabled Models" do
|
|
74
74
|
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.point4.as_hex_ewkb))
|
75
75
|
model.save.should == true
|
76
76
|
end
|
77
|
+
|
78
|
+
it 'should save Point geography objects' do
|
79
|
+
model = GeographyPointModel.new(:extra => 'test', :geom => GeometryFactory.point)
|
80
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.point.as_hex_ewkb))
|
81
|
+
model.save.should == true
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should save LineString geography objects' do
|
85
|
+
model = GeographyLineStringModel.new(:extra => 'test', :geom => GeometryFactory.line_string)
|
86
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.line_string.as_hex_ewkb))
|
87
|
+
model.save.should == true
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should save Polygon geography objects' do
|
91
|
+
model = GeographyPolygonModel.new(:extra => 'test', :geom => GeometryFactory.polygon)
|
92
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.polygon.as_hex_ewkb))
|
93
|
+
model.save.should == true
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should save MultiPoint geography objects' do
|
97
|
+
model = GeographyMultiPointModel.new(:extra => 'test', :geom => GeometryFactory.multi_point)
|
98
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.multi_point.as_hex_ewkb))
|
99
|
+
model.save.should == true
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'should save MultiLineString geography objects' do
|
103
|
+
model = GeographyMultiLineStringModel.new(:extra => 'test', :geom => GeometryFactory.multi_line_string)
|
104
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.multi_line_string.as_hex_ewkb))
|
105
|
+
model.save.should == true
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should save MultiPolygon geography objects' do
|
109
|
+
model = GeographyMultiPolygonModel.new(:extra => 'test', :geom => GeometryFactory.multi_polygon)
|
110
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.multi_polygon.as_hex_ewkb))
|
111
|
+
model.save.should == true
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'should save GeometryCollection geography objects' do
|
115
|
+
model = GeographyGeometryCollectionModel.new(:extra => 'test', :geom => GeometryFactory.geometry_collection)
|
116
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.geometry_collection.as_hex_ewkb))
|
117
|
+
model.save.should == true
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should save Geography objects' do
|
121
|
+
model = GeographyModel.new(:extra => 'test', :geom => GeometryFactory.point)
|
122
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.point.as_hex_ewkb))
|
123
|
+
model.save.should == true
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should save 3D Point (with Z coord) geography objects' do
|
127
|
+
model = GeographyPointzModel.new(:extra => 'test', :geom => GeometryFactory.pointz)
|
128
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.pointz.as_hex_ewkb))
|
129
|
+
model.save.should == true
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should save 3D Point (with M coord) geography objects' do
|
133
|
+
model = GeographyPointmModel.new(:extra => 'test', :geom => GeometryFactory.pointm)
|
134
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.pointm.as_hex_ewkb))
|
135
|
+
model.save.should == true
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should save 4D Point geography objects' do
|
139
|
+
model = GeographyPoint4Model.new(:extra => 'test', :geom => GeometryFactory.point4)
|
140
|
+
@connection.should_receive(:select_value).with(Regexp.new(GeometryFactory.point4.as_hex_ewkb))
|
141
|
+
model.save.should == true
|
142
|
+
end
|
77
143
|
end
|
78
144
|
|
79
145
|
describe "finding records" do
|
@@ -123,13 +189,68 @@ describe "Spatially-enabled Models" do
|
|
123
189
|
end
|
124
190
|
|
125
191
|
it 'should retrieve 3D Point (with M coord) objects' do
|
126
|
-
model =
|
127
|
-
|
192
|
+
model = GeographyPointmModel.create(:extra => 'test', :geom => GeometryFactory.pointm)
|
193
|
+
GeographyPointmModel.find(model.id).geom.should == GeometryFactory.pointm
|
128
194
|
end
|
129
195
|
|
130
196
|
it 'should retrieve 4D Point objects' do
|
131
|
-
model =
|
132
|
-
|
197
|
+
model = GeographyPoint4Model.create(:extra => 'test', :geom => GeometryFactory.point4)
|
198
|
+
GeographyPoint4Model.find(model.id).geom.should == GeometryFactory.point4
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'should retrieve Point geography objects' do
|
202
|
+
model = GeographyPointModel.create(:extra => 'test', :geom => GeometryFactory.point)
|
203
|
+
GeographyPointModel.find(model.id).geom.should == GeometryFactory.point
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'should retrieve LineString geography objects' do
|
207
|
+
model = GeographyLineStringModel.create(:extra => 'test', :geom => GeometryFactory.line_string)
|
208
|
+
GeographyLineStringModel.find(model.id).geom.should == GeometryFactory.line_string
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'should retrieve Polygon geography objects' do
|
212
|
+
model = GeographyPolygonModel.create(:extra => 'test', :geom => GeometryFactory.polygon)
|
213
|
+
GeographyPolygonModel.find(model.id).geom.should == GeometryFactory.polygon
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'should retrieve MultiPoint geography objects' do
|
217
|
+
model = GeographyMultiPointModel.create(:extra => 'test', :geom => GeometryFactory.multi_point)
|
218
|
+
GeographyMultiPointModel.find(model.id).geom.should == GeometryFactory.multi_point
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'should retrieve MultiLineString geography objects' do
|
222
|
+
model = GeographyMultiLineStringModel.create(:extra => 'test', :geom => GeometryFactory.multi_line_string)
|
223
|
+
GeographyMultiLineStringModel.find(model.id).geom.should == GeometryFactory.multi_line_string
|
224
|
+
end
|
225
|
+
|
226
|
+
it 'should retrieve MultiPolygon geography objects' do
|
227
|
+
model = GeographyMultiPolygonModel.create(:extra => 'test', :geom => GeometryFactory.multi_polygon)
|
228
|
+
GeographyMultiPolygonModel.find(model.id).geom.should == GeometryFactory.multi_polygon
|
229
|
+
end
|
230
|
+
|
231
|
+
it 'should retrieve GeometryCollection geography objects' do
|
232
|
+
model = GeographyGeometryCollectionModel.create(:extra => 'test', :geom => GeometryFactory.geometry_collection)
|
233
|
+
GeographyGeometryCollectionModel.find(model.id).geom.should == GeometryFactory.geometry_collection
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'should retrieve Geometry geography objects' do
|
237
|
+
model = GeographyModel.create(:extra => 'test', :geom => GeometryFactory.point)
|
238
|
+
GeographyModel.find(model.id).geom.should == GeometryFactory.point
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'should retrieve 3D Point (with Z coord) geography objects' do
|
242
|
+
model = GeographyPointzModel.create(:extra => 'test', :geom => GeometryFactory.pointz)
|
243
|
+
GeographyPointzModel.find(model.id).geom.should == GeometryFactory.pointz
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'should retrieve 3D Point (with M coord) geography objects' do
|
247
|
+
model = GeographyPointmModel.create(:extra => 'test', :geom => GeometryFactory.pointm)
|
248
|
+
GeographyPointmModel.find(model.id).geom.should == GeometryFactory.pointm
|
249
|
+
end
|
250
|
+
|
251
|
+
it 'should retrieve 4D Point geography objects' do
|
252
|
+
model = GeographyPoint4Model.create(:extra => 'test', :geom => GeometryFactory.point4)
|
253
|
+
GeographyPoint4Model.find(model.id).geom.should == GeometryFactory.point4
|
133
254
|
end
|
134
255
|
end
|
135
256
|
end
|
@@ -12,14 +12,20 @@ describe "Spatially-enabled Schema Dumps" do
|
|
12
12
|
t.point :geom, :with_m => true, :with_z => true, :srid => 4326
|
13
13
|
end
|
14
14
|
add_index :migrated_geometry_models, :geom, :spatial => true, :name => 'test_spatial_index'
|
15
|
+
|
16
|
+
create_table :migrated_geography_models, :force => true do |t|
|
17
|
+
t.integer :extra
|
18
|
+
t.point :geom, :with_m => true, :with_z => true, :geographic => true
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
File.open('schema.rb', "w") do |file|
|
18
23
|
ActiveRecord::SchemaDumper.dump(@connection, file)
|
19
24
|
end
|
20
25
|
|
21
|
-
# Drop the original
|
22
|
-
@connection.
|
26
|
+
# Drop the original tables
|
27
|
+
@connection.drop_table "migrated_geometry_models"
|
28
|
+
@connection.drop_table "migrated_geography_models"
|
23
29
|
|
24
30
|
# Load the dumped schema
|
25
31
|
load('schema.rb')
|
@@ -29,11 +35,12 @@ describe "Spatially-enabled Schema Dumps" do
|
|
29
35
|
# delete the schema file
|
30
36
|
File.delete('schema.rb')
|
31
37
|
|
32
|
-
# Drop the new
|
33
|
-
@connection.
|
38
|
+
# Drop the new tables
|
39
|
+
@connection.drop_table "migrated_geometry_models"
|
40
|
+
@connection.drop_table "migrated_geography_models"
|
34
41
|
end
|
35
42
|
|
36
|
-
it "should preserve spatial attributes of tables" do
|
43
|
+
it "should preserve spatial attributes of geometry tables" do
|
37
44
|
columns = @connection.columns("migrated_geometry_models")
|
38
45
|
|
39
46
|
columns.should have(3).items
|
@@ -46,6 +53,19 @@ describe "Spatially-enabled Schema Dumps" do
|
|
46
53
|
geom_column.srid.should == 4326
|
47
54
|
end
|
48
55
|
|
56
|
+
it "should preserve spatial attributes of geography tables" do
|
57
|
+
columns = @connection.columns("migrated_geography_models")
|
58
|
+
|
59
|
+
columns.should have(3).items
|
60
|
+
geom_column = columns.select{|c| c.name == 'geom'}.first
|
61
|
+
geom_column.should be_a(SpatialAdapter::SpatialColumn)
|
62
|
+
geom_column.geometry_type.should == :point
|
63
|
+
geom_column.type.should == :geometry
|
64
|
+
geom_column.with_z.should == true
|
65
|
+
geom_column.with_m.should == true
|
66
|
+
geom_column.should be_geographic
|
67
|
+
end
|
68
|
+
|
49
69
|
it "should preserve spatial indexes" do
|
50
70
|
indexes = @connection.indexes("migrated_geometry_models")
|
51
71
|
|
data/spec/spec_helper.rb
CHANGED
@@ -43,11 +43,11 @@ class GeometryFactory
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def multi_point
|
46
|
-
MultiPoint.from_coordinates([[12.4,-
|
46
|
+
MultiPoint.from_coordinates([[12.4,-23.3],[-65.1,23.4],[23.55555555,23]], 4326)
|
47
47
|
end
|
48
48
|
|
49
49
|
def multi_line_string
|
50
|
-
MultiLineString.from_line_strings([LineString.from_coordinates([[1.5,45.2],[-54.12312,-0.012]]),LineString.from_coordinates([[1.5,45.2],[-54.12312,-0.012],[45.123,
|
50
|
+
MultiLineString.from_line_strings([LineString.from_coordinates([[1.5,45.2],[-54.12312,-0.012]]),LineString.from_coordinates([[1.5,45.2],[-54.12312,-0.012],[45.123,23.3]])], 4326)
|
51
51
|
end
|
52
52
|
|
53
53
|
def multi_polygon
|