GeoRuby 1.3.3 → 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/geo_ruby/simple_features/geometry.rb +1 -3
- data/rakefile.rb +1 -1
- data/tools/lib/spatial_adapter/lib/mysql_spatial_adapter.rb +1 -1
- data/tools/lib/spatial_adapter/lib/post_gis_adapter.rb +58 -45
- data/tools/lib/spatial_adapter/rakefile.rb +1 -0
- data/tools/lib/spatial_adapter/test/find_postgis_test.rb +3 -2
- data/tools/lib/spatial_adapter/test/fixture_mysql_test.rb +23 -0
- data/tools/lib/spatial_adapter/test/fixture_postgis_test.rb +23 -0
- data/tools/lib/spatial_adapter/test/migration_mysql_test.rb +4 -4
- data/tools/lib/spatial_adapter/test/migration_postgis_test.rb +31 -0
- metadata +4 -2
@@ -73,9 +73,7 @@ module GeoRuby#:nodoc:
|
|
73
73
|
|
74
74
|
#Outputs the geometry as a HexEWKB string. It is almost the same as a WKB string, except that each byte of a WKB string is replaced by its hexadecimal 2-character representation in a HexEWKB string.
|
75
75
|
def as_hex_ewkb(allow_srid=true,allow_z=true,allow_m=true)
|
76
|
-
|
77
|
-
as_ewkb(allow_srid,allow_z,allow_m).each_byte {|char| str << sprintf("%02x",char).upcase}
|
78
|
-
str
|
76
|
+
as_ewkb(allow_srid, allow_z, allow_m).unpack('H*').join('').upcase
|
79
77
|
end
|
80
78
|
#Outputs the geometry as a strict HexWKB string
|
81
79
|
def as_hex_wkb
|
data/rakefile.rb
CHANGED
@@ -24,7 +24,7 @@ spec = Gem::Specification::new do |s|
|
|
24
24
|
s.platform = Gem::Platform::RUBY
|
25
25
|
|
26
26
|
s.name = 'GeoRuby'
|
27
|
-
s.version = "1.3.
|
27
|
+
s.version = "1.3.4"
|
28
28
|
s.summary = "Ruby data holder for OGC Simple Features"
|
29
29
|
s.description = <<EOF
|
30
30
|
GeoRuby is intended as a holder for data returned from PostGIS and MySQL Spatial queries. The data model roughly follows the OGC "Simple Features for SQL" specification (see www.opengis.org/docs/99-049.pdf), although without any kind of advanced functionalities (such as geometric operators or reprojections)
|
@@ -7,7 +7,7 @@ include GeoRuby::SimpleFeatures
|
|
7
7
|
#add a method to_yaml to the Geometry class which will transform a geometry in a form suitable to be used in a YAML file (such as in a fixture)
|
8
8
|
GeoRuby::SimpleFeatures::Geometry.class_eval do
|
9
9
|
def to_fixture_format
|
10
|
-
"!binary | #{[(255.chr * 4) + as_wkb].pack('m')}"
|
10
|
+
"!binary | #{[(255.chr * 4) + as_wkb].pack('m').gsub(/\s+/,"")}"
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -100,6 +100,16 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
+
alias :original_tables :tables
|
104
|
+
def tables(name = nil) #:nodoc:
|
105
|
+
schemas = schema_search_path.split(/,/).map { |p| quote(p.strip) }.join(',')
|
106
|
+
original_tables(name) + query(<<-SQL, name).map { |row| row[0] }
|
107
|
+
SELECT viewname
|
108
|
+
FROM pg_views
|
109
|
+
WHERE schemaname IN (#{schemas})
|
110
|
+
SQL
|
111
|
+
end
|
112
|
+
|
103
113
|
def create_table(name, options = {})
|
104
114
|
table_definition = ActiveRecord::ConnectionAdapters::PostgreSQLTableDefinition.new(self)
|
105
115
|
table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false
|
@@ -125,11 +135,12 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
125
135
|
end
|
126
136
|
|
127
137
|
alias :original_remove_column :remove_column
|
128
|
-
def remove_column(table_name,column_name)
|
138
|
+
def remove_column(table_name,column_name, options = {})
|
129
139
|
columns(table_name).each do |col|
|
130
140
|
if col.name == column_name.to_s
|
131
141
|
#check if the column is geometric
|
132
|
-
unless geometry_data_types[col.type].nil?
|
142
|
+
unless geometry_data_types[col.type].nil? or
|
143
|
+
(options[:remove_using_dropgeometrycolumn] == false)
|
133
144
|
execute "SELECT DropGeometryColumn('#{table_name}','#{column_name}')"
|
134
145
|
else
|
135
146
|
original_remove_column(table_name,column_name)
|
@@ -140,7 +151,7 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
140
151
|
|
141
152
|
alias :original_add_column :add_column
|
142
153
|
def add_column(table_name, column_name, type, options = {})
|
143
|
-
unless geometry_data_types[type].nil?
|
154
|
+
unless geometry_data_types[type].nil? or (options[:create_using_addgeometrycolumn] == false)
|
144
155
|
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)
|
145
156
|
execute geom_column.to_sql(table_name)
|
146
157
|
else
|
@@ -201,12 +212,20 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
201
212
|
raw_geom_infos = column_spatial_info(table_name)
|
202
213
|
|
203
214
|
column_definitions(table_name).collect do |name, type, default, notnull|
|
204
|
-
if type =~ /geometry/i
|
215
|
+
if type =~ /geometry/i
|
205
216
|
raw_geom_info = raw_geom_infos[name]
|
206
217
|
if ActiveRecord::VERSION::STRING >= "2.0.0"
|
207
|
-
|
218
|
+
if raw_geom_info.nil?
|
219
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.create_simplified(name,default,notnull == "f")
|
220
|
+
else
|
221
|
+
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)
|
222
|
+
end
|
208
223
|
else
|
209
|
-
|
224
|
+
if raw_geom_info.nil?
|
225
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.create_simplified(name,default_value(default),notnull == "f")
|
226
|
+
else
|
227
|
+
ActiveRecord::ConnectionAdapters::SpatialPostgreSQLColumn.new(name, default_value(default), raw_geom_info.type, notnull == "f", raw_geom_info.srid, raw_geom_info.with_z, raw_geom_info.with_m)
|
228
|
+
end
|
210
229
|
end
|
211
230
|
else
|
212
231
|
if ActiveRecord::VERSION::STRING >= "2.0.0"
|
@@ -218,54 +237,41 @@ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
|
|
218
237
|
end
|
219
238
|
end
|
220
239
|
end
|
221
|
-
|
222
|
-
#
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
240
|
+
|
241
|
+
# For version of Rails where exists disable_referential_integrity
|
242
|
+
if self.instance_methods.include? "disable_referential_integrity"
|
243
|
+
#Pete Deffendol's patch
|
244
|
+
alias :original_disable_referential_integrity :disable_referential_integrity
|
245
|
+
def disable_referential_integrity(&block) #:nodoc:
|
246
|
+
ignore_tables = %w{ geometry_columns spatial_ref_sys }
|
247
|
+
execute(tables.select { |name| !ignore_tables.include?(name) }.collect { |name| "ALTER TABLE #{quote_table_name(name)} DISABLE TRIGGER ALL" }.join(";"))
|
248
|
+
yield
|
249
|
+
ensure
|
250
|
+
execute(tables.select { |name| !ignore_tables.include?(name)}.collect { |name| "ALTER TABLE #{quote_table_name(name)} ENABLE TRIGGER ALL" }.join(";"))
|
251
|
+
end
|
230
252
|
end
|
231
253
|
|
232
254
|
private
|
233
255
|
|
234
256
|
def column_spatial_info(table_name)
|
235
257
|
constr = query <<-end_sql
|
236
|
-
|
237
|
-
FROM pg_constraint
|
238
|
-
WHERE conrelid = '#{table_name}'::regclass
|
239
|
-
AND contype = 'c'
|
258
|
+
SELECT * FROM geometry_columns WHERE f_table_name = '#{table_name}'
|
240
259
|
end_sql
|
241
260
|
|
242
261
|
raw_geom_infos = {}
|
243
262
|
constr.each do |constr_def_a|
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
raw_geom_infos[column_name] = raw_geom_info
|
257
|
-
elsif constr_def =~ /ndims\(["']?([^"')]+)["']?\)\s*=\s*(\d+)/i
|
258
|
-
column_name,dimension = $1,$2
|
259
|
-
raw_geom_info = raw_geom_infos[column_name] || ActiveRecord::ConnectionAdapters::RawGeomInfo.new
|
260
|
-
raw_geom_info.dimension = dimension.to_i
|
261
|
-
raw_geom_infos[column_name] = raw_geom_info
|
262
|
-
elsif constr_def =~ /srid\(["']?([^"')]+)["']?\)\s*=\s*(-?\d+)/i
|
263
|
-
column_name,srid = $1,$2
|
264
|
-
raw_geom_info = raw_geom_infos[column_name] || ActiveRecord::ConnectionAdapters::RawGeomInfo.new
|
265
|
-
raw_geom_info.srid = srid.to_i
|
266
|
-
raw_geom_infos[column_name] = raw_geom_info
|
267
|
-
end #if constr_def
|
268
|
-
end #constr.each
|
263
|
+
raw_geom_infos[constr_def_a[3]] ||= ActiveRecord::ConnectionAdapters::RawGeomInfo.new
|
264
|
+
raw_geom_infos[constr_def_a[3]].type = constr_def_a[6]
|
265
|
+
raw_geom_infos[constr_def_a[3]].dimension = constr_def_a[4].to_i
|
266
|
+
raw_geom_infos[constr_def_a[3]].srid = constr_def_a[5].to_i
|
267
|
+
|
268
|
+
if raw_geom_infos[constr_def_a[3]].type[-1] == ?M
|
269
|
+
raw_geom_infos[constr_def_a[3]].with_m = true
|
270
|
+
raw_geom_infos[constr_def_a[3]].type.chop!
|
271
|
+
else
|
272
|
+
raw_geom_infos[constr_def_a[3]].with_m = false
|
273
|
+
end
|
274
|
+
end
|
269
275
|
|
270
276
|
raw_geom_infos.each_value do |raw_geom_info|
|
271
277
|
#check the presence of z and m
|
@@ -311,7 +317,9 @@ module ActiveRecord
|
|
311
317
|
attr_reader :geom_columns
|
312
318
|
|
313
319
|
def column(name, type, options = {})
|
314
|
-
unless @base.geometry_data_types[type.to_sym].nil?
|
320
|
+
unless (@base.geometry_data_types[type.to_sym].nil? or
|
321
|
+
(options[:create_using_addgeometrycolumn] == false))
|
322
|
+
|
315
323
|
geom_column = PostgreSQLColumnDefinition.new(@base,name, type)
|
316
324
|
geom_column.null = options[:null]
|
317
325
|
geom_column.srid = options[:srid] || -1
|
@@ -392,6 +400,11 @@ module ActiveRecord
|
|
392
400
|
return string unless string.is_a?(String)
|
393
401
|
GeoRuby::SimpleFeatures::Geometry.from_hex_ewkb(string) rescue nil
|
394
402
|
end
|
403
|
+
|
404
|
+
def self.create_simplified(name,default,null = true)
|
405
|
+
new(name,default,"geometry",null,nil,nil,nil)
|
406
|
+
end
|
407
|
+
|
395
408
|
end
|
396
409
|
end
|
397
410
|
end
|
@@ -11,8 +11,9 @@ class FindPostgisTest < Test::Unit::TestCase
|
|
11
11
|
def setup
|
12
12
|
ActiveRecord::Schema.define() do
|
13
13
|
create_table "parks", :force => true do |t|
|
14
|
-
t.
|
15
|
-
t.
|
14
|
+
t.column "data" , :string, :limit => 100
|
15
|
+
t.column "value", :integer
|
16
|
+
t.column "geom", :point,:null=>false,:srid=>123
|
16
17
|
end
|
17
18
|
add_index "parks","geom",:spatial=>true,:name => "example_spatial_index"
|
18
19
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'common/common_mysql'
|
5
|
+
|
6
|
+
|
7
|
+
class FixtureMysqlTest < Test::Unit::TestCase
|
8
|
+
def test_long_fixture
|
9
|
+
assert(1,Polygon.from_coordinates([[[144.857742,13.598263],
|
10
|
+
[144.862362,13.589922],[144.865169,13.587336],[144.862927,13.587665],
|
11
|
+
[144.861292,13.587321],[144.857597,13.585299],[144.847845,13.573858],
|
12
|
+
[144.846225,13.571014],[144.843605,13.566047],[144.842157,13.563831],
|
13
|
+
[144.841202,13.561991],[144.838305,13.556465],[144.834645,13.549919],
|
14
|
+
[144.834352,13.549395],[144.833825,13.548454],[144.831839,13.544451],
|
15
|
+
[144.830845,13.54081],[144.821543,13.545695],[144.8097993,13.55186285],
|
16
|
+
[144.814753,13.55755],[144.816744,13.56176944],[144.818862,13.566258],
|
17
|
+
[144.819402,13.568565],[144.822373,13.572223],
|
18
|
+
[144.8242032,13.57381149],[144.82634,13.575666],[144.83416,13.590365],
|
19
|
+
[144.83514,13.595657],[144.834284,13.59652],[144.834024,13.598031],
|
20
|
+
[144.83719,13.598061],[144.857742,13.598263]]]).to_fixture_format.split(/\s+/))
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'common/common_postgis'
|
5
|
+
|
6
|
+
|
7
|
+
class FixturePostgisTest < Test::Unit::TestCase
|
8
|
+
def test_long_fixture
|
9
|
+
assert(1,Polygon.from_coordinates([[[144.857742,13.598263],
|
10
|
+
[144.862362,13.589922],[144.865169,13.587336],[144.862927,13.587665],
|
11
|
+
[144.861292,13.587321],[144.857597,13.585299],[144.847845,13.573858],
|
12
|
+
[144.846225,13.571014],[144.843605,13.566047],[144.842157,13.563831],
|
13
|
+
[144.841202,13.561991],[144.838305,13.556465],[144.834645,13.549919],
|
14
|
+
[144.834352,13.549395],[144.833825,13.548454],[144.831839,13.544451],
|
15
|
+
[144.830845,13.54081],[144.821543,13.545695],[144.8097993,13.55186285],
|
16
|
+
[144.814753,13.55755],[144.816744,13.56176944],[144.818862,13.566258],
|
17
|
+
[144.819402,13.568565],[144.822373,13.572223],
|
18
|
+
[144.8242032,13.57381149],[144.82634,13.575666],[144.83416,13.590365],
|
19
|
+
[144.83514,13.595657],[144.834284,13.59652],[144.834024,13.598031],
|
20
|
+
[144.83719,13.598061],[144.857742,13.598263]]]).to_fixture_format.split(/\s+/))
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -147,7 +147,7 @@ class MigrationMysqlTest < Test::Unit::TestCase
|
|
147
147
|
t.column "City", :string, :limit => 50
|
148
148
|
t.column "StateProvince", :string, :limit => 50
|
149
149
|
t.column "PostalCode", :string, :limit => 30
|
150
|
-
t.column "Geocode", :
|
150
|
+
t.column "Geocode", :geometry, :null => false #:geometry ok too : col.geometry_type test to change below
|
151
151
|
end
|
152
152
|
end
|
153
153
|
|
@@ -166,7 +166,7 @@ class MigrationMysqlTest < Test::Unit::TestCase
|
|
166
166
|
ActiveRecord::Schema.define() do
|
167
167
|
add_index "cx_geographiclocation", ["addressline1"], :name => "ix_cx_geographiclocation_addressline1"
|
168
168
|
add_index "cx_geographiclocation", ["countryid"], :name => "ix_cx_geographiclocation_countryid"
|
169
|
-
add_index "cx_geographiclocation", "Geocode", :spatial=>true
|
169
|
+
add_index "cx_geographiclocation", ["Geocode"], :spatial=>true
|
170
170
|
end
|
171
171
|
|
172
172
|
#test index
|
@@ -174,7 +174,7 @@ class MigrationMysqlTest < Test::Unit::TestCase
|
|
174
174
|
assert(connection.indexes("cx_geographiclocation")[2].spatial)
|
175
175
|
|
176
176
|
#insertion points
|
177
|
-
1.upto(
|
177
|
+
1.upto(10000) do |i|
|
178
178
|
pt = CxGeographiclocation.new("CountryID" => i, "AddressLine1" =>"Bouyoul", "Geocode" => Point.from_x_y(-180 + rand(360) + rand(),-90 + rand(180) + rand())) #insert floats
|
179
179
|
assert(pt.save)
|
180
180
|
end
|
@@ -193,7 +193,7 @@ class MigrationMysqlTest < Test::Unit::TestCase
|
|
193
193
|
pts = CxGeographiclocation.find_all_by_Geocode([[-181 + rand(),-91 + rand()],[181 + rand(),91 + rand()]]) #selects all : range limits are float
|
194
194
|
assert(pts)
|
195
195
|
assert(pts.is_a?(Array))
|
196
|
-
assert_equal(
|
196
|
+
assert_equal(10000,pts.length)
|
197
197
|
assert_equal("Bouyoul",pts[0].attributes["AddressLine1"])
|
198
198
|
|
199
199
|
end
|
@@ -6,6 +6,9 @@ require 'common/common_postgis'
|
|
6
6
|
class Park < ActiveRecord::Base
|
7
7
|
end
|
8
8
|
|
9
|
+
class Viewpark < ActiveRecord::Base
|
10
|
+
end
|
11
|
+
|
9
12
|
|
10
13
|
class MigrationPostgisTest < Test::Unit::TestCase
|
11
14
|
|
@@ -140,6 +143,34 @@ class MigrationPostgisTest < Test::Unit::TestCase
|
|
140
143
|
end
|
141
144
|
|
142
145
|
|
146
|
+
def test_view
|
147
|
+
ActiveRecord::Schema.define do
|
148
|
+
create_table "parks", :force => true do |t|
|
149
|
+
t.column "data" , :string, :limit => 100
|
150
|
+
t.column "value", :integer
|
151
|
+
t.column "geom", :point,:null=>false
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
pt = Park.new(:data => "Test", :geom => Point.from_x_y(1.2,4.5))
|
156
|
+
assert(pt.save)
|
157
|
+
|
158
|
+
ActiveRecord::Base.connection.execute('CREATE VIEW viewparks as SELECT * from parks')
|
159
|
+
#if not ActiveRecord::Base.connection.execute("select * from geometry_columns where f_table_name = 'viewparks' and f_geometry_column = 'geom'") #do not add if already there
|
160
|
+
#mark the geom column in the view as geometric
|
161
|
+
#ActiveRecord::Base.connection.execute("insert into geometry_columns values ('','public','viewparks','geom',2,-1,'POINT')")
|
162
|
+
#end
|
163
|
+
|
164
|
+
pt = Viewpark.find(:first)
|
165
|
+
assert(pt)
|
166
|
+
assert_equal("Test",pt.data)
|
167
|
+
assert_equal(Point.from_x_y(1.2,4.5),pt.geom)
|
168
|
+
|
169
|
+
ActiveRecord::Base.connection.execute('DROP VIEW viewparks')
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
|
143
174
|
def test_dump
|
144
175
|
#Force the creation of a table
|
145
176
|
ActiveRecord::Schema.define do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: GeoRuby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guilhem Vellut
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-03-20 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -75,6 +75,8 @@ files:
|
|
75
75
|
- tools/lib/spatial_adapter/test/common/common_postgis.rb
|
76
76
|
- tools/lib/spatial_adapter/test/find_mysql_test.rb
|
77
77
|
- tools/lib/spatial_adapter/test/find_postgis_test.rb
|
78
|
+
- tools/lib/spatial_adapter/test/fixture_mysql_test.rb
|
79
|
+
- tools/lib/spatial_adapter/test/fixture_postgis_test.rb
|
78
80
|
- tools/lib/spatial_adapter/test/migration_mysql_test.rb
|
79
81
|
- tools/lib/spatial_adapter/test/migration_postgis_test.rb
|
80
82
|
- tools/lib/spatial_adapter/test/models/models_mysql.rb
|