geos-extensions 0.0.6 → 0.0.7

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/Rakefile CHANGED
@@ -12,7 +12,7 @@ begin
12
12
  require 'jeweler'
13
13
  Jeweler::Tasks.new do |gem|
14
14
  gem.name = "geos-extensions"
15
- gem.version = "0.0.6"
15
+ gem.version = "0.0.7"
16
16
  gem.summary = "Extensions for the GEOS library."
17
17
  gem.description = gem.summary
18
18
  gem.email = "code@zoocasa.com"
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{geos-extensions}
8
- s.version = "0.0.6"
8
+ s.version = "0.0.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["J Smith"]
12
- s.date = %q{2011-03-17}
12
+ s.date = %q{2011-03-21}
13
13
  s.description = %q{Extensions for the GEOS library.}
14
14
  s.email = %q{code@zoocasa.com}
15
15
  s.extra_rdoc_files = [
@@ -23,10 +23,46 @@ module Geos
23
23
  # * st_within
24
24
  # * st_dwithin
25
25
  #
26
- # The first argument to each method is can be a Geos::Geometry-based
26
+ # The first argument to each of these methods can be a Geos::Geometry-based
27
27
  # object or anything readable by Geos.read along with an optional
28
28
  # options Hash.
29
29
  #
30
+ # For ordering, we have the following:
31
+ #
32
+ # The following scopes take no arguments:
33
+ #
34
+ # * order_by_ndims
35
+ # * order_by_npoints
36
+ # * order_by_nrings
37
+ # * order_by_numgeometries
38
+ # * order_by_numinteriorring
39
+ # * order_by_numinteriorrings
40
+ # * order_by_numpoints
41
+ # * order_by_length3d
42
+ # * order_by_length
43
+ # * order_by_length2d
44
+ # * order_by_perimeter
45
+ # * order_by_perimeter2d
46
+ # * order_by_perimeter3d
47
+ #
48
+ # These next scopes allow you to specify a geometry argument for
49
+ # measurement:
50
+ #
51
+ # * order_by_distance
52
+ # * order_by_distance_sphere
53
+ # * order_by_maxdistance
54
+ # * order_by_hausdorffdistance (additionally allows you to set the
55
+ # densify_frac argument)
56
+ # * order_by_distance_spheroid (requires an additional SPHEROID
57
+ # string to calculate against)
58
+ #
59
+ # These next scopes allow you to specify a SPHEROID string to calculate
60
+ # against:
61
+ #
62
+ # * order_by_length2d_spheroid
63
+ # * order_by_length3d_spheroid
64
+ # * order_by_length_spheroid
65
+ #
30
66
  # == Options
31
67
  #
32
68
  # * :column - the column to compare against. The default is 'the_geom'.
@@ -35,6 +71,8 @@ module Geos
35
71
  # * :wkb_options - in order to facilitate some conversions, geometries
36
72
  # are converted to WKB. The default is `{:include_srid => true}` to
37
73
  # force the geometry to use PostGIS's Extended WKB.
74
+ # * :desc - the order_by scopes have an additional :desc option to alllow
75
+ # for DESC ordering.
38
76
  #
39
77
  # == SRID Detection
40
78
  #
@@ -71,108 +109,251 @@ module Geos
71
109
  within
72
110
  }.freeze
73
111
 
74
- def self.included(base)
75
- RELATIONSHIPS.each do |relationship|
76
- src, line = <<-EOF, __LINE__ + 1
77
- #{SCOPE_METHOD} :st_#{relationship}, lambda { |*args|
78
- raise ArgumentError.new("wrong number of arguments (\#{args.length} for 1-2)") unless
79
- args.length.between?(1, 2)
112
+ ZERO_ARGUMENT_MEASUREMENTS = %w{
113
+ ndims
114
+ npoints
115
+ nrings
116
+ numgeometries
117
+ numinteriorring
118
+ numinteriorrings
119
+ numpoints
120
+ length3d
121
+ length
122
+ length2d
123
+ perimeter
124
+ perimeter2d
125
+ perimeter3d
126
+ }
80
127
 
81
- options = {
82
- :column => 'the_geom',
83
- :use_index => true
84
- }.merge(args.extract_options!)
128
+ ONE_GEOMETRY_ARGUMENT_MEASUREMENTS = %w{
129
+ distance
130
+ distance_sphere
131
+ maxdistance
132
+ }
85
133
 
86
- column_name = self.connection.quote_table_name(options[:column])
87
- column_srid = self.srid_for(options[:column])
134
+ ONE_ARGUMENT_MEASUREMENTS = %w{
135
+ length2d_spheroid
136
+ length3d_spheroid
137
+ length_spheroid
138
+ }
88
139
 
89
- geom = if args.first.is_a?(String) && args.first =~ /^SRID=default;/
90
- args.first.sub(/default/, column_srid.to_s)
91
- else
92
- args.first
140
+ def self.included(base)
141
+ base.class_eval do
142
+ class << self
143
+ protected
144
+ def set_srid_or_transform(column_srid, geom_srid, geos)
145
+ sql = if column_srid != geom_srid
146
+ if column_srid == -1 || geom_srid == -1
147
+ %{ST_SetSRID(?, #{column_srid})}
148
+ else
149
+ %{ST_Transform(?, #{column_srid})}
150
+ end
151
+ else
152
+ %{?}
153
+ end
154
+
155
+ sanitize_sql([ sql, geos.to_ewkb ])
93
156
  end
94
157
 
95
- geos = Geos.read(geom)
158
+ def read_geos(geom, column_srid)
159
+ if geom.is_a?(String) && geom =~ /^SRID=default;/
160
+ geom = geom.sub(/default/, column_srid.to_s)
161
+ end
162
+ Geos.read(geom)
163
+ end
96
164
 
97
- geom_srid = if geos.srid == 0
98
- -1
99
- else
100
- geos.srid
165
+ def read_geom_srid(geos)
166
+ if geos.srid == 0
167
+ -1
168
+ else
169
+ geos.srid
170
+ end
101
171
  end
102
172
 
103
- function = if options[:use_index]
104
- "ST_#{relationship}"
105
- else
106
- "_ST_#{relationship}"
173
+ def default_options(options)
174
+ {
175
+ :column => 'the_geom',
176
+ :use_index => true
177
+ }.merge(options || {})
107
178
  end
108
179
 
109
- conditions = if column_srid != geom_srid
110
- if column_srid == -1 || geom_srid == -1
111
- %{\#{function}(\#{column_name}, ST_SetSRID(?, \#{column_srid}))}
180
+ def function_name(function, use_index)
181
+ if use_index
182
+ "ST_#{function}"
112
183
  else
113
- %{\#{function}(\#{column_name}, ST_Transform(?, \#{column_srid}))}
184
+ "_ST_#{function}"
185
+ end
186
+ end
187
+
188
+ def build_function_call(function, geom = nil, options = {}, function_options = {})
189
+ options = default_options(options)
190
+
191
+ function_options = {
192
+ :additional_args => 0
193
+ }.merge(function_options)
194
+
195
+ ''.tap do |ret|
196
+ column_name = self.connection.quote_table_name(options[:column])
197
+ ret << "#{function_name(function, options[:use_index])}(#{self.quoted_table_name}.#{column_name}"
198
+
199
+ if geom
200
+ column_srid = self.srid_for(options[:column])
201
+
202
+ geos = read_geos(geom, column_srid)
203
+ geom_srid = read_geom_srid(geos)
204
+
205
+ ret << %{, #{self.set_srid_or_transform(column_srid, geom_srid, geos)}}
206
+ end
207
+
208
+ ret << ', ?' * function_options[:additional_args]
209
+ ret << %{)#{options[:append]}}
114
210
  end
115
- else
116
- %{\#{function}(\#{column_name}, ?)}
117
211
  end
118
212
 
213
+ def additional_ordering(options = nil)
214
+ options ||= {}
215
+
216
+ ''.tap do |ret|
217
+ if options[:desc]
218
+ ret << ' DESC'
219
+ end
220
+
221
+ if options[:nulls]
222
+ ret << " NULLS #{options[:nulls].to_s.upcase}"
223
+ end
224
+ end
225
+ end
226
+
227
+ def assert_arguments_length(args, min, max)
228
+ raise ArgumentError.new("wrong number of arguments (#{args.length} for #{min}-#{max})") unless
229
+ args.length.between?(min, max)
230
+ end
231
+ end
232
+ end
233
+
234
+ RELATIONSHIPS.each do |relationship|
235
+ src, line = <<-EOF, __LINE__ + 1
236
+ #{SCOPE_METHOD} :st_#{relationship}, lambda { |*args|
237
+ assert_arguments_length(args, 1, 2)
238
+
119
239
  {
120
- :conditions => [
121
- conditions,
122
- geos.to_ewkb
123
- ]
240
+ :conditions => build_function_call(
241
+ '#{relationship}',
242
+ *args
243
+ )
124
244
  }
125
245
  }
126
246
  EOF
127
247
  base.class_eval(src, __FILE__, line)
128
248
  end
129
249
 
130
- src, line = <<-EOF, __LINE__ + 1
131
- #{SCOPE_METHOD} :st_dwithin, lambda { |*args|
132
- raise ArgumentError.new("wrong number of arguments (\#{args.length} for 2-3)") unless
133
- args.length.between?(2, 3)
134
-
135
- options = {
136
- :column => 'the_geom',
137
- :use_index => true
138
- }.merge(args.extract_options!)
139
-
140
- geom, distance = Geos.read(args.first), args[1]
141
-
142
- column_name = ::ActiveRecord::Base.connection.quote_table_name(options[:column])
143
- column_srid = self.srid_for(options[:column])
144
- geom_srid = if geom.srid == 0
145
- -1
146
- else
147
- geom.srid
148
- end
149
-
150
- function = if options[:use_index]
151
- 'ST_dwithin'
152
- else
153
- '_ST_dwithin'
154
- end
155
-
156
- conditions = if column_srid != geom_srid
157
- if column_srid == -1 || geom_srid == -1
158
- %{\#{function}(\#{column_name}, ST_SetSRID(?, \#{column_srid}), ?)}
159
- else
160
- %{\#{function}(\#{column_name}, ST_Transform(?, \#{column_srid}), ?)}
161
- end
162
- else
163
- %{\#{function}(\#{column_name}, ?, ?)}
164
- end
250
+ base.class_eval do
251
+ send(SCOPE_METHOD, :st_dwithin, lambda { |*args|
252
+ assert_arguments_length(args, 2, 3)
253
+ geom, distance, options = args
165
254
 
166
255
  {
167
256
  :conditions => [
168
- conditions,
169
- geom.to_ewkb,
257
+ build_function_call('dwithin', geom, options, :additional_args => 1),
170
258
  distance
171
259
  ]
172
260
  }
173
- }
174
- EOF
175
- base.class_eval(src, __FILE__, line)
261
+ })
262
+ end
263
+
264
+ ZERO_ARGUMENT_MEASUREMENTS.each do |measurement|
265
+ src, line = <<-EOF, __LINE__ + 1
266
+ #{SCOPE_METHOD} :order_by_#{measurement}, lambda { |*args|
267
+ assert_arguments_length(args, 0, 1)
268
+ options = args[0]
269
+
270
+ function_call = build_function_call('#{measurement}', nil, options)
271
+ function_call << additional_ordering(options)
272
+
273
+ {
274
+ :order => function_call
275
+ }
276
+ }
277
+ EOF
278
+ base.class_eval(src, __FILE__, line)
279
+ end
280
+
281
+ ONE_GEOMETRY_ARGUMENT_MEASUREMENTS.each do |measurement|
282
+ src, line = <<-EOF, __LINE__ + 1
283
+ #{SCOPE_METHOD} :order_by_#{measurement}, lambda { |*args|
284
+ assert_arguments_length(args, 1, 2)
285
+ geom, options = args
286
+
287
+ function_call = build_function_call('#{measurement}', geom, options)
288
+ function_call << additional_ordering(options)
289
+
290
+ {
291
+ :order => function_call
292
+ }
293
+ }
294
+ EOF
295
+ base.class_eval(src, __FILE__, line)
296
+ end
297
+
298
+ ONE_ARGUMENT_MEASUREMENTS.each do |measurement|
299
+ src, line = <<-EOF, __LINE__ + 1
300
+ #{SCOPE_METHOD} :order_by_#{measurement}, lambda { |*args|
301
+ assert_arguments_length(args, 1, 2)
302
+ argument, options = args
303
+
304
+ function_call = build_function_call('#{measurement}', nil, options, :additional_args => 1)
305
+ function_call << additional_ordering(options)
306
+
307
+ {
308
+ :order => sanitize_sql([ function_call, argument ])
309
+ }
310
+ }
311
+ EOF
312
+ base.class_eval(src, __FILE__, line)
313
+ end
314
+
315
+ base.class_eval do
316
+ send(SCOPE_METHOD, :order_by_hausdorffdistance, lambda { |*args|
317
+ assert_arguments_length(args, 1, 3)
318
+ options = args.extract_options!
319
+ geom, densify_frac = args
320
+
321
+ function_call = build_function_call(
322
+ 'hausdorffdistance',
323
+ geom,
324
+ options,
325
+ :additional_args => (densify_frac.present? ? 1 : 0)
326
+ )
327
+ function_call << additional_ordering(options)
328
+
329
+ {
330
+ :order => sanitize_sql([
331
+ function_call,
332
+ densify_frac
333
+ ])
334
+ }
335
+ })
336
+
337
+ send(SCOPE_METHOD, :order_by_distance_spheroid, lambda { |*args|
338
+ assert_arguments_length(args, 2, 3)
339
+ geom, spheroid, options = args
340
+
341
+ function_call = build_function_call(
342
+ 'distance_spheroid',
343
+ geom,
344
+ options,
345
+ :additional_args => 1
346
+ )
347
+ function_call << additional_ordering(options)
348
+
349
+ {
350
+ :order => sanitize_sql([
351
+ function_call,
352
+ spheroid
353
+ ])
354
+ }
355
+ })
356
+ end
176
357
  end
177
358
  end
178
359
  end
@@ -196,9 +196,17 @@ module Geos
196
196
  # option to create a PostGIS-style EWKT output.
197
197
  def to_wkt(options = {})
198
198
  writer = WktWriter.new
199
+
200
+ # Older versions of the Geos library don't allow for options here.
201
+ args = if WktWriter.instance_method(:write).arity < -1
202
+ [ options ]
203
+ else
204
+ []
205
+ end
206
+
199
207
  ret = ''
200
208
  ret << "SRID=#{self.srid};" if options[:include_srid]
201
- ret << writer.write(self, options)
209
+ ret << writer.write(self, *args)
202
210
  ret
203
211
  end
204
212
 
@@ -84,5 +84,179 @@ if ENV['TEST_ACTIVERECORD']
84
84
  assert_equal([1, 2, 3], Foo.st_disjoint('SRID=4269; POINT(100 100)', :column => :the_other_geom).all.collect(&:id).sort)
85
85
  assert_equal([3], Foo.st_contains('SRID=4269; POINT(7 7)', :column => :the_other_geom).all.collect(&:id).sort)
86
86
  end
87
+
88
+ def test_order_by_distance
89
+ assert_equal([3, 1, 2], Foo.order_by_distance('POINT(1 1)').all.collect(&:id))
90
+ end
91
+
92
+ def test_order_by_distance_desc
93
+ assert_equal([2, 1, 3], Foo.order_by_distance('POINT(1 1)', :desc => true).all.collect(&:id))
94
+ end
95
+
96
+ def test_order_by_distance_sphere
97
+ assert_equal([3, 1, 2], Foo.order_by_distance_sphere('POINT(1 1)').all.collect(&:id))
98
+ end
99
+
100
+ def test_order_by_distance_sphere_desc
101
+ assert_equal([2, 1, 3], Foo.order_by_distance_sphere('POINT(1 1)', :desc => true).all.collect(&:id))
102
+ end
103
+
104
+ def test_order_by_maxdistance
105
+ assert_equal([1, 3, 2], Foo.order_by_maxdistance('POINT(1 1)').all.collect(&:id))
106
+ end
107
+
108
+ def test_order_by_maxdistance_desc
109
+ assert_equal([2, 3, 1], Foo.order_by_maxdistance('POINT(1 1)', :desc => true).all.collect(&:id))
110
+ end
111
+
112
+ def test_order_by_ndims
113
+ assert_equal([1, 2, 3], Foo.order_by_ndims.order('id').all.collect(&:id))
114
+ end
115
+
116
+ def test_order_by_ndims_desc
117
+ assert_equal([1, 2, 3], Foo.order_by_ndims(:desc => true).order('id').all.collect(&:id))
118
+ end
119
+
120
+ def test_order_by_npoints
121
+ assert_equal([1, 2, 3], Foo.order_by_npoints.order('id').all.collect(&:id))
122
+ end
123
+
124
+ def test_order_by_npoints_desc
125
+ assert_equal([3, 1, 2], Foo.order_by_npoints(:desc => true).order('id').all.collect(&:id))
126
+ end
127
+
128
+ def test_order_by_nrings
129
+ assert_equal([1, 2, 3], Foo.order_by_nrings.order('id').all.collect(&:id))
130
+ end
131
+
132
+ def test_order_by_nrings_desc
133
+ assert_equal([3, 1, 2], Foo.order_by_nrings(:desc => true).order('id').all.collect(&:id))
134
+ end
135
+
136
+ def test_order_by_numgeometries
137
+ assert_equal([1, 2, 3], Foo.order_by_numgeometries.order('id').all.collect(&:id))
138
+ end
139
+
140
+ def test_order_by_numgeometries_desc
141
+ assert_equal([1, 2, 3], Foo.order_by_numgeometries(:desc => true).order('id').all.collect(&:id))
142
+ end
143
+
144
+ def test_order_by_numinteriorring
145
+ assert_equal([3, 1, 2], Foo.order_by_numinteriorring.order('id').all.collect(&:id))
146
+ end
147
+
148
+ def test_order_by_numinteriorring_desc
149
+ assert_equal([1, 2, 3], Foo.order_by_numinteriorring(:desc => true).order('id').all.collect(&:id))
150
+ end
151
+
152
+ def test_order_by_numinteriorrings
153
+ assert_equal([3, 1, 2], Foo.order_by_numinteriorrings.order('id').all.collect(&:id))
154
+ end
155
+
156
+ def test_order_by_numinteriorrings_desc
157
+ assert_equal([1, 2, 3], Foo.order_by_numinteriorrings(:desc => true).order('id').all.collect(&:id))
158
+ end
159
+
160
+ def test_order_by_numpoints
161
+ assert_equal([1, 2, 3], Foo.order_by_numpoints.order('id').all.collect(&:id))
162
+ end
163
+
164
+ def test_order_by_numpoints_desc
165
+ assert_equal([1, 2, 3], Foo.order_by_numpoints(:desc => true).order('id').all.collect(&:id))
166
+ end
167
+
168
+ def test_order_by_length3d
169
+ assert_equal([1, 2, 3], Foo.order_by_length3d.order('id').all.collect(&:id))
170
+ end
171
+
172
+ def test_order_by_length3d_desc
173
+ assert_equal([1, 2, 3], Foo.order_by_length3d(:desc => true).order('id').all.collect(&:id))
174
+ end
175
+
176
+ def test_order_by_length
177
+ assert_equal([1, 2, 3], Foo.order_by_length.order('id').all.collect(&:id))
178
+ end
179
+
180
+ def test_order_by_length_desc
181
+ assert_equal([1, 2, 3], Foo.order_by_length(:desc => true).order('id').all.collect(&:id))
182
+ end
183
+
184
+ def test_order_by_length2d
185
+ assert_equal([1, 2, 3], Foo.order_by_length2d.order('id').all.collect(&:id))
186
+ end
187
+
188
+ def test_order_by_length2d_desc
189
+ assert_equal([1, 2, 3], Foo.order_by_length2d(:desc => true).order('id').all.collect(&:id))
190
+ end
191
+
192
+ def test_order_by_length3d_spheroid
193
+ assert_equal([1, 2, 3], Foo.order_by_length3d_spheroid('SPHEROID["WGS 84", 6378137, 298.257223563]').order('id').all.collect(&:id))
194
+ end
195
+
196
+ def test_order_by_length3d_spheroid_desc
197
+ assert_equal([1, 2, 3], Foo.order_by_length3d_spheroid('SPHEROID["WGS 84", 6378137, 298.257223563]', :desc => true).order('id').all.collect(&:id))
198
+ end
199
+
200
+
201
+ def test_order_by_length2d_spheroid
202
+ assert_equal([1, 2, 3], Foo.order_by_length3d_spheroid('SPHEROID["WGS 84", 6378137, 298.257223563]').order('id').all.collect(&:id))
203
+ end
204
+
205
+ def test_order_by_length2d_spheroid_desc
206
+ assert_equal([1, 2, 3], Foo.order_by_length3d_spheroid('SPHEROID["WGS 84", 6378137, 298.257223563]', :desc => true).order('id').all.collect(&:id))
207
+ end
208
+
209
+ def test_order_by_length_spheroid
210
+ assert_equal([1, 2, 3], Foo.order_by_length3d_spheroid('SPHEROID["WGS 84", 6378137, 298.257223563]').order('id').all.collect(&:id))
211
+ end
212
+
213
+ def test_order_by_length_spheroid_desc
214
+ assert_equal([1, 2, 3], Foo.order_by_length3d_spheroid('SPHEROID["WGS 84", 6378137, 298.257223563]', :desc => true).order('id').all.collect(&:id))
215
+ end
216
+
217
+ def test_order_by_perimeter
218
+ assert_equal([1, 2, 3], Foo.order_by_perimeter.order('id').all.collect(&:id))
219
+ end
220
+
221
+ def test_order_by_perimeter_desc
222
+ assert_equal([3, 1, 2], Foo.order_by_perimeter(:desc => true).order('id').all.collect(&:id))
223
+ end
224
+
225
+ def test_order_by_perimeter2d
226
+ assert_equal([1, 2, 3], Foo.order_by_perimeter2d.order('id').all.collect(&:id))
227
+ end
228
+
229
+ def test_order_by_perimeter2d_desc
230
+ assert_equal([3, 1, 2], Foo.order_by_perimeter2d(:desc => true).order('id').all.collect(&:id))
231
+ end
232
+
233
+ def test_order_by_perimeter3d
234
+ assert_equal([1, 2, 3], Foo.order_by_perimeter3d.order('id').all.collect(&:id))
235
+ end
236
+
237
+ def test_order_by_perimeter3d_desc
238
+ assert_equal([3, 1, 2], Foo.order_by_perimeter3d(:desc => true).order('id').all.collect(&:id))
239
+ end
240
+
241
+ def test_order_by_hausdorffdistance
242
+ assert_equal([1, 3, 2], Foo.order_by_hausdorffdistance('POINT(1 1)').all.collect(&:id))
243
+ end
244
+
245
+ def test_order_by_hausdorffdistance_desc
246
+ assert_equal([2, 3, 1], Foo.order_by_hausdorffdistance('POINT(1 1)', :desc => true).all.collect(&:id))
247
+ end
248
+
249
+ def test_order_by_hausdorffdistance_with_densify_frac
250
+ assert_equal([1, 3, 2], Foo.order_by_hausdorffdistance('POINT(1 1)', 0.314).all.collect(&:id))
251
+ end
252
+
253
+
254
+ def test_order_by_distance_spheroid
255
+ assert_equal([2, 3, 1], Foo.order_by_distance_spheroid('POINT(10 10)', 'SPHEROID["WGS 84", 6378137, 298.257223563]').order('id').all.collect(&:id))
256
+ end
257
+
258
+ def test_order_by_distance_spheroid_desc
259
+ assert_equal([1, 3, 2], Foo.order_by_distance_spheroid('POINT(10 10)', 'SPHEROID["WGS 84", 6378137, 298.257223563]', :desc => true).order('id').all.collect(&:id))
260
+ end
87
261
  end
88
262
  end
data/test/writer_test.rb CHANGED
@@ -283,5 +283,19 @@ class GeosWriterTests < Test::Unit::TestCase
283
283
  out.read
284
284
  )
285
285
  end
286
+
287
+ def test_to_wkt_handles_binary_geos_arity
288
+ if @point.to_wkt(:rounding_precision => 0) =~ /^POINT\s*\((\d+(\.\d+)?)\s*(\d+(\.\d+)?)\)$/
289
+ lng, lat = $1.to_f, $3.to_f
290
+ end
291
+
292
+ if defined?(Geos::FFIGeos)
293
+ assert_equal(lng, 10.0, 0.000001)
294
+ assert_equal(lat, 10.0, 0.000001)
295
+ else
296
+ assert_equal(lng, 10.00, 0.000001)
297
+ assert_equal(lat, 10.01, 0.000001)
298
+ end
299
+ end
286
300
  end
287
301
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geos-extensions
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
9
+ - 7
10
+ version: 0.0.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - J Smith
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-17 00:00:00 -04:00
18
+ date: 2011-03-21 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies: []
21
21