rgeo 0.2.9 → 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.
Files changed (67) hide show
  1. data/History.rdoc +11 -0
  2. data/README.rdoc +3 -3
  3. data/Spatial_Programming_With_RGeo.rdoc +19 -8
  4. data/Version +1 -1
  5. data/ext/geos_c_impl/factory.c +1 -0
  6. data/ext/geos_c_impl/factory.h +1 -0
  7. data/ext/geos_c_impl/geometry.c +4 -5
  8. data/ext/geos_c_impl/geometry_collection.c +15 -0
  9. data/ext/geos_c_impl/line_string.c +10 -0
  10. data/ext/geos_c_impl/point.c +2 -0
  11. data/ext/geos_c_impl/polygon.c +4 -0
  12. data/lib/rgeo/cartesian/feature_classes.rb +23 -17
  13. data/lib/rgeo/cartesian/feature_methods.rb +20 -1
  14. data/lib/rgeo/feature.rb +1 -0
  15. data/lib/rgeo/feature/curve.rb +1 -2
  16. data/lib/rgeo/feature/geometry_collection.rb +1 -1
  17. data/lib/rgeo/feature/line.rb +1 -1
  18. data/lib/rgeo/feature/line_string.rb +1 -2
  19. data/lib/rgeo/feature/linear_ring.rb +1 -2
  20. data/lib/rgeo/feature/mixins.rb +198 -0
  21. data/lib/rgeo/feature/multi_curve.rb +1 -2
  22. data/lib/rgeo/feature/multi_line_string.rb +1 -2
  23. data/lib/rgeo/feature/multi_point.rb +1 -2
  24. data/lib/rgeo/feature/multi_polygon.rb +1 -2
  25. data/lib/rgeo/feature/multi_surface.rb +1 -2
  26. data/lib/rgeo/feature/point.rb +1 -2
  27. data/lib/rgeo/feature/polygon.rb +1 -3
  28. data/lib/rgeo/feature/surface.rb +1 -2
  29. data/lib/rgeo/feature/types.rb +27 -0
  30. data/lib/rgeo/geographic/projected_feature_classes.rb +31 -4
  31. data/lib/rgeo/geographic/projected_feature_methods.rb +2 -1
  32. data/lib/rgeo/geographic/spherical_feature_classes.rb +30 -3
  33. data/lib/rgeo/geos.rb +22 -0
  34. data/lib/rgeo/geos/factory.rb +11 -5
  35. data/lib/rgeo/geos/ffi_classes.rb +655 -0
  36. data/lib/rgeo/geos/ffi_factory.rb +503 -0
  37. data/lib/rgeo/geos/impl_additions.rb +1 -1
  38. data/lib/rgeo/geos/interface.rb +63 -8
  39. data/lib/rgeo/geos/zm_factory.rb +10 -4
  40. data/test/common/geometry_collection_tests.rb +1 -3
  41. data/test/coord_sys/tc_ogc_cs.rb +13 -2
  42. data/test/coord_sys/tc_proj4_srs_data.rb +1 -1
  43. data/test/{geos → geos_capi}/tc_factory.rb +2 -2
  44. data/test/{geos → geos_capi}/tc_geometry_collection.rb +2 -2
  45. data/test/{geos → geos_capi}/tc_line_string.rb +2 -2
  46. data/test/{geos → geos_capi}/tc_misc.rb +6 -2
  47. data/test/{geos → geos_capi}/tc_multi_line_string.rb +2 -2
  48. data/test/{geos → geos_capi}/tc_multi_point.rb +2 -2
  49. data/test/{geos → geos_capi}/tc_multi_polygon.rb +2 -2
  50. data/test/{geos → geos_capi}/tc_parsing_unparsing.rb +2 -2
  51. data/test/{geos → geos_capi}/tc_point.rb +2 -2
  52. data/test/{geos → geos_capi}/tc_polygon.rb +2 -2
  53. data/test/{geos → geos_capi}/tc_zmfactory.rb +2 -2
  54. data/test/geos_ffi/tc_factory.rb +91 -0
  55. data/test/geos_ffi/tc_geometry_collection.rb +62 -0
  56. data/test/geos_ffi/tc_line_string.rb +62 -0
  57. data/test/geos_ffi/tc_misc.rb +69 -0
  58. data/test/geos_ffi/tc_multi_line_string.rb +62 -0
  59. data/test/geos_ffi/tc_multi_point.rb +62 -0
  60. data/test/geos_ffi/tc_multi_polygon.rb +64 -0
  61. data/test/geos_ffi/tc_parsing_unparsing.rb +81 -0
  62. data/test/geos_ffi/tc_point.rb +87 -0
  63. data/test/geos_ffi/tc_polygon.rb +86 -0
  64. data/test/geos_ffi/tc_zmfactory.rb +86 -0
  65. data/test/tc_mixins.rb +188 -0
  66. data/test/tc_types.rb +77 -0
  67. metadata +54 -25
@@ -53,7 +53,7 @@ module RGeo
53
53
 
54
54
 
55
55
  # :stopdoc:
56
- if ::RGeo::Geos.supported?
56
+ if defined?(::RGeo::Geos::PointImpl)
57
57
  IMPL_CLASSES = {
58
58
  Feature::Point => PointImpl,
59
59
  Feature::LineString => LineStringImpl,
@@ -38,16 +38,48 @@ module RGeo
38
38
 
39
39
  module Geos
40
40
 
41
- @supported = nil
42
-
43
41
  class << self
44
42
 
45
43
 
46
- # Returns true if GEOS implementation is supported.
47
- # If this returns false, GEOS features are not available.
44
+ # Returns true if CAPI GEOS implementation is supported.
45
+
46
+ def capi_supported?
47
+ CAPI_SUPPORTED
48
+ end
49
+
50
+
51
+ # Returns true if FFI GEOS implementation is supported.
52
+
53
+ def ffi_supported?
54
+ FFI_SUPPORTED
55
+ end
56
+
57
+
58
+ # Returns true if any GEOS implementation is supported.
59
+ # If this returns false, GEOS features are not available at all.
48
60
 
49
61
  def supported?
50
- @supported.nil? ? (@supported = Factory.respond_to?(:_create)) : @supported
62
+ FFI_SUPPORTED || CAPI_SUPPORTED
63
+ end
64
+
65
+
66
+ # Returns true if the given feature is a CAPI GEOS feature, or if
67
+ # the given factory is a native GEOS factory.
68
+
69
+ def is_capi_geos?(object_)
70
+ Factory === object_ || GeometryImpl === object_ ||
71
+ ZMFactory === object_ && Factory === object_.z_factory ||
72
+ ZMGeometryImpl === object_ && GeometryImpl === object_.z_geometry
73
+ end
74
+
75
+
76
+ # Returns true if the given feature is an FFI GEOS feature, or if
77
+ # the given factory is an FFI GEOS factory.
78
+
79
+ def is_ffi_geos?(object_)
80
+ FFIFactory === object_ || FFIGeometryImpl === object_ ||
81
+ ZMFactory === object_ && FFIFactory === object_.z_factory ||
82
+ ZMGeometryImpl === object_ && FFIGeometryImpl === object_.z_geometry
51
83
  end
52
84
 
53
85
 
@@ -55,10 +87,25 @@ module RGeo
55
87
  # factory is a GEOS factory.
56
88
 
57
89
  def is_geos?(object_)
58
- supported? && (Factory === object_ || GeometryImpl === object_ || ZMFactory === object_ || ZMGeometryImpl === object_)
90
+ Factory === object_ || GeometryImpl === object_ ||
91
+ FFIFactory === object_ || FFIGeometryImpl === object_ ||
92
+ ZMFactory === object_ || ZMGeometryImpl === object_
59
93
  end
60
94
 
61
95
 
96
+ # The preferred native interface. This is the native interface
97
+ # used by default when a factory is created.
98
+ # Supported values are <tt>:capi</tt> and <tt>:ffi</tt>.
99
+ #
100
+ # This is set automatically when RGeo loads, to <tt>:capi</tt>
101
+ # if the CAPI interface is available, otheriwse to <tt>:ffi</tt>
102
+ # if FFI is available, otherwise to nil if no GEOS interface is
103
+ # available. You can override this setting if you want to prefer
104
+ # FFI over CAPI.
105
+
106
+ attr_accessor :preferred_native_interface
107
+
108
+
62
109
  # Returns a factory for the GEOS implementation.
63
110
  # Returns nil if the GEOS implementation is not supported.
64
111
  #
@@ -71,12 +118,17 @@ module RGeo
71
118
  #
72
119
  # Options include:
73
120
  #
74
- # [<tt>:lenient_multi_polygon_assertions</tt>]
121
+ # [<tt>:native_interface</tt>]
122
+ # Specifies which native interface to use. Possible values are
123
+ # <tt>:capi</tt> and <tt>:ffi</tt>. The default is the value
124
+ # of the preferred_native_interface.
125
+ # [<tt>:uses_lenient_multi_polygon_assertions</tt>]
75
126
  # If set to true, assertion checking on MultiPolygon is disabled.
76
127
  # This may speed up creation of MultiPolygon objects, at the
77
128
  # expense of not doing the proper checking for OGC MultiPolygon
78
129
  # compliance. See RGeo::Feature::MultiPolygon for details on
79
- # the MultiPolygon assertions. Default is false.
130
+ # the MultiPolygon assertions. Default is false. Also called
131
+ # <tt>:lenient_multi_polygon_assertions</tt>.
80
132
  # [<tt>:buffer_resolution</tt>]
81
133
  # The resolution of buffers around geometries created by this
82
134
  # factory. This controls the number of line segments used to
@@ -139,8 +191,11 @@ module RGeo
139
191
 
140
192
  def factory(opts_={})
141
193
  if supported?
194
+ native_interface_ = opts_[:native_interface] || Geos.preferred_native_interface
142
195
  if opts_[:has_z_coordinate] && opts_[:has_m_coordinate]
143
196
  ZMFactory.new(opts_)
197
+ elsif native_interface_ == :ffi
198
+ FFIFactory.new(opts_)
144
199
  else
145
200
  Factory.create(opts_)
146
201
  end
@@ -80,8 +80,14 @@ module RGeo
80
80
  :wkb_generator => opts_[:wkb_generator], :wkb_parser => opts_[:wkb_parser],
81
81
  :srid => srid_.to_i, :proj4 => proj4_, :coord_sys => coord_sys_,
82
82
  }
83
- @zfactory = Factory.create(config_.merge(:has_z_coordinate => true))
84
- @mfactory = Factory.create(config_.merge(:has_m_coordinate => true))
83
+ native_interface_ = opts_[:native_interface] || Geos.preferred_native_interface
84
+ if native_interface_ == :ffi
85
+ @zfactory = FFIFactory.new(config_.merge(:has_z_coordinate => true))
86
+ @mfactory = FFIFactory.new(config_.merge(:has_m_coordinate => true))
87
+ else
88
+ @zfactory = Factory.create(config_.merge(:has_z_coordinate => true))
89
+ @mfactory = Factory.create(config_.merge(:has_m_coordinate => true))
90
+ end
85
91
 
86
92
  wkt_generator_ = opts_[:wkt_generator]
87
93
  case wkt_generator_
@@ -117,7 +123,7 @@ module RGeo
117
123
  # Returns the SRID of geometries created by this factory.
118
124
 
119
125
  def srid
120
- @zfactory._srid
126
+ @zfactory.srid
121
127
  end
122
128
 
123
129
 
@@ -125,7 +131,7 @@ module RGeo
125
131
  # created by this factory
126
132
 
127
133
  def buffer_resolution
128
- @zfactory._buffer_resolution
134
+ @zfactory.buffer_resolution
129
135
  end
130
136
 
131
137
 
@@ -233,9 +233,7 @@ module RGeo
233
233
 
234
234
  def test_empty_collection_boundary
235
235
  empty_ = @factory.collection([])
236
- boundary_ = empty_.boundary
237
- assert_equal(Feature::GeometryCollection, boundary_.geometry_type)
238
- assert_equal(0, boundary_.num_geometries)
236
+ assert_nil(empty_.boundary)
239
237
  end
240
238
 
241
239
 
@@ -45,6 +45,17 @@ module RGeo
45
45
  class TestOgcCs < ::Test::Unit::TestCase # :nodoc:
46
46
 
47
47
 
48
+ # Handle differences in floating-point output.
49
+
50
+ def _lenient_regex_for(str_)
51
+ ::Regexp.new(str_.gsub(/(\d)\.(\d{10,})/) do |m_|
52
+ before_ = $1
53
+ after_ = $2[0,10]
54
+ "#{before_}.#{after_}\\d*"
55
+ end.gsub(/(\.|\[|\]|\(|\)|\$|\^|\||\+)/){ |m_| "\\#{$1}"})
56
+ end
57
+
58
+
48
59
  def test_axis_info_by_value
49
60
  obj_ = ::RGeo::CoordSys::CS::AxisInfo.create('N', ::RGeo::CoordSys::CS::AO_NORTH)
50
61
  assert_equal('N', obj_.name)
@@ -277,7 +288,7 @@ module RGeo
277
288
  assert_nil(obj_.get_axis(1))
278
289
  assert_equal('degree', obj_.get_units(0).name)
279
290
  assert_equal('degree', obj_.get_units(1).name)
280
- assert_equal('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', obj_.to_wkt)
291
+ assert_match(_lenient_regex_for('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]'), obj_.to_wkt)
281
292
  end
282
293
 
283
294
 
@@ -345,7 +356,7 @@ module RGeo
345
356
  assert_kind_of(::RGeo::CoordSys::CS::ProjectedCoordinateSystem, obj_.head)
346
357
  assert_kind_of(::RGeo::CoordSys::CS::VerticalCoordinateSystem, obj_.tail)
347
358
  assert_equal(3, obj_.dimension)
348
- assert_equal(input_, obj_.to_wkt)
359
+ assert_match(_lenient_regex_for(input_), obj_.to_wkt)
349
360
  end
350
361
 
351
362
 
@@ -73,4 +73,4 @@ module RGeo
73
73
 
74
74
  end
75
75
  end
76
- end
76
+ end if ::RGeo::CoordSys::Proj4.supported?
@@ -40,7 +40,7 @@ require 'rgeo'
40
40
 
41
41
  module RGeo
42
42
  module Tests # :nodoc:
43
- module Geos # :nodoc:
43
+ module GeosCAPI # :nodoc:
44
44
 
45
45
  class TestFactory < ::Test::Unit::TestCase # :nodoc:
46
46
 
@@ -88,4 +88,4 @@ module RGeo
88
88
 
89
89
  end
90
90
  end
91
- end if ::RGeo::Geos.supported?
91
+ end if ::RGeo::Geos.capi_supported?
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/geometry_collection_tests.rb', ::File.dirn
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestGeometryCollection < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -59,4 +59,4 @@ module RGeo
59
59
 
60
60
  end
61
61
  end
62
- end if ::RGeo::Geos.supported?
62
+ end if ::RGeo::Geos.capi_supported?
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/line_string_tests.rb', ::File.dirname(__FI
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestLineString < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -59,4 +59,4 @@ module RGeo
59
59
 
60
60
  end
61
61
  end
62
- end if ::RGeo::Geos.supported?
62
+ end if ::RGeo::Geos.capi_supported?
@@ -40,7 +40,7 @@ require 'rgeo'
40
40
 
41
41
  module RGeo
42
42
  module Tests # :nodoc:
43
- module Geos # :nodoc:
43
+ module GeosCAPI # :nodoc:
44
44
 
45
45
  class TestMisc < ::Test::Unit::TestCase # :nodoc:
46
46
 
@@ -69,4 +69,8 @@ module RGeo
69
69
 
70
70
  end
71
71
  end
72
- end if ::RGeo::Geos.supported?
72
+ end if ::RGeo::Geos.capi_supported?
73
+
74
+ unless ::RGeo::Geos.capi_supported?
75
+ puts "WARNING: GEOS CAPI support not available. Related tests skipped."
76
+ end
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/multi_line_string_tests.rb', ::File.dirnam
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestMultiLineString < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -59,4 +59,4 @@ module RGeo
59
59
 
60
60
  end
61
61
  end
62
- end if ::RGeo::Geos.supported?
62
+ end if ::RGeo::Geos.capi_supported?
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/multi_point_tests.rb', ::File.dirname(__FI
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestMultiPoint < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -59,4 +59,4 @@ module RGeo
59
59
 
60
60
  end
61
61
  end
62
- end if ::RGeo::Geos.supported?
62
+ end if ::RGeo::Geos.capi_supported?
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/multi_polygon_tests.rb', ::File.dirname(__
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestMultiPolygon < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -60,4 +60,4 @@ module RGeo
60
60
 
61
61
  end
62
62
  end
63
- end if ::RGeo::Geos.supported?
63
+ end if ::RGeo::Geos.capi_supported?
@@ -40,7 +40,7 @@ require 'rgeo'
40
40
 
41
41
  module RGeo
42
42
  module Tests # :nodoc:
43
- module Geos # :nodoc:
43
+ module GeosCAPI # :nodoc:
44
44
 
45
45
  class TestParsingUnparsing < ::Test::Unit::TestCase # :nodoc:
46
46
 
@@ -77,4 +77,4 @@ module RGeo
77
77
 
78
78
  end
79
79
  end
80
- end if ::RGeo::Geos.supported?
80
+ end if ::RGeo::Geos.capi_supported?
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/point_tests.rb', ::File.dirname(__FILE__))
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestPoint < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -83,4 +83,4 @@ module RGeo
83
83
 
84
84
  end
85
85
  end
86
- end if ::RGeo::Geos.supported?
86
+ end if ::RGeo::Geos.capi_supported?
@@ -42,7 +42,7 @@ require ::File.expand_path('../common/polygon_tests.rb', ::File.dirname(__FILE__
42
42
 
43
43
  module RGeo
44
44
  module Tests # :nodoc:
45
- module Geos # :nodoc:
45
+ module GeosCAPI # :nodoc:
46
46
 
47
47
  class TestPolygon < ::Test::Unit::TestCase # :nodoc:
48
48
 
@@ -83,4 +83,4 @@ module RGeo
83
83
 
84
84
  end
85
85
  end
86
- end if ::RGeo::Geos.supported?
86
+ end if ::RGeo::Geos.capi_supported?
@@ -40,7 +40,7 @@ require 'rgeo'
40
40
 
41
41
  module RGeo
42
42
  module Tests # :nodoc:
43
- module Geos # :nodoc:
43
+ module GeosCAPI # :nodoc:
44
44
 
45
45
  class TestZMFactory < ::Test::Unit::TestCase # :nodoc:
46
46
 
@@ -82,4 +82,4 @@ module RGeo
82
82
 
83
83
  end
84
84
  end
85
- end if ::RGeo::Geos.supported?
85
+ end if ::RGeo::Geos.capi_supported?
@@ -0,0 +1,91 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Tests for the GEOS factory
4
+ #
5
+ # -----------------------------------------------------------------------------
6
+ # Copyright 2010 Daniel Azuma
7
+ #
8
+ # All rights reserved.
9
+ #
10
+ # Redistribution and use in source and binary forms, with or without
11
+ # modification, are permitted provided that the following conditions are met:
12
+ #
13
+ # * Redistributions of source code must retain the above copyright notice,
14
+ # this list of conditions and the following disclaimer.
15
+ # * Redistributions in binary form must reproduce the above copyright notice,
16
+ # this list of conditions and the following disclaimer in the documentation
17
+ # and/or other materials provided with the distribution.
18
+ # * Neither the name of the copyright holder, nor the names of any other
19
+ # contributors to this software, may be used to endorse or promote products
20
+ # derived from this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
26
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ # POSSIBILITY OF SUCH DAMAGE.
33
+ # -----------------------------------------------------------------------------
34
+ ;
35
+
36
+
37
+ require 'test/unit'
38
+ require 'rgeo'
39
+
40
+
41
+ module RGeo
42
+ module Tests # :nodoc:
43
+ module GeosFFI # :nodoc:
44
+
45
+ class TestFactory < ::Test::Unit::TestCase # :nodoc:
46
+
47
+
48
+ def setup
49
+ @factory = ::RGeo::Geos.factory(:srid => 4326, :native_interface => :ffi)
50
+ end
51
+
52
+
53
+ def test_srid_preserved_through_factory
54
+ geom_ = @factory.point(-10, 20)
55
+ assert_equal(4326, geom_.srid)
56
+ factory_ = geom_.factory
57
+ assert_equal(4326, factory_.srid)
58
+ geom2_ = factory_.point(-20, 25)
59
+ assert_equal(4326, geom2_.srid)
60
+ end
61
+
62
+
63
+ def test_srid_preserved_through_geom_operations
64
+ geom1_ = @factory.point(-10, 20)
65
+ geom2_ = @factory.point(-20, 25)
66
+ geom3_ = geom1_.union(geom2_)
67
+ assert_equal(4326, geom3_.srid)
68
+ assert_equal(4326, geom3_.geometry_n(0).srid)
69
+ assert_equal(4326, geom3_.geometry_n(1).srid)
70
+ end
71
+
72
+
73
+ def test_srid_preserved_through_geom_functions
74
+ geom1_ = @factory.point(-10, 20)
75
+ geom2_ = geom1_.boundary
76
+ assert_equal(4326, geom2_.srid)
77
+ end
78
+
79
+
80
+ def test_srid_preserved_through_dup
81
+ geom1_ = @factory.point(-10, 20)
82
+ geom2_ = geom1_.clone
83
+ assert_equal(4326, geom2_.srid)
84
+ end
85
+
86
+
87
+ end
88
+
89
+ end
90
+ end
91
+ end if ::RGeo::Geos.ffi_supported?