GeoRuby 1.3.3 → 1.3.4
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/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
|