rgeo 0.1.15 → 0.1.16

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/History.rdoc CHANGED
@@ -1,3 +1,12 @@
1
+ === 0.1.16 / 2010-11-18
2
+
3
+ * Test coverage for WKB generator and parser; fixed a few bugs.
4
+ * Eliminated the hard dependency on the JSON gem, and allow configuration of GeoJSON with an alternate JSON parser such as YAJL or ActiveSupport.
5
+ * API CHANGE: geo factory is now a hash option in GeoJSON, and is now optional.
6
+ * GeoJSON now handles Z and M coordinates, according to the capabilities of the geo factory.
7
+ * GeoJSON feature objects can now handle null geometry and null properties, per the spec.
8
+ * Factory::cast now optionally lets you pass the parameters as a hash.
9
+
1
10
  === 0.1.15 / 2010-11-08
2
11
 
3
12
  * Cleanup, fixes, documentation, and partial test coverage in the WKT/WKB implementations.
data/README.rdoc CHANGED
@@ -76,6 +76,7 @@ yet complete. These include:
76
76
  * Some operations on SimpleCartesian and SimpleSpherical.
77
77
  * Rails (ActiveRecord or ActiveModel) integration.
78
78
  * Other third-party integration, including possibly SimpleGeo.
79
+ * Support for bbox and crs elements of GeoJSON.
79
80
  * Support for additional formats such as ESRI shapefiles.
80
81
  * JRuby support via JTS integration.
81
82
  * Rubinius support for Geos integration.
data/Version CHANGED
@@ -1 +1 @@
1
- 0.1.15
1
+ 0.1.16
@@ -90,14 +90,14 @@ module RGeo
90
90
  # See ::RGeo::Features::Factory#parse_wkt
91
91
 
92
92
  def parse_wkt(str_)
93
- ::RGeo::WKRep::WKTParser.new(:default_factory => self).parse(str_)
93
+ WKRep::WKTParser.new(:default_factory => self).parse(str_)
94
94
  end
95
95
 
96
96
 
97
97
  # See ::RGeo::Features::Factory#parse_wkb
98
98
 
99
99
  def parse_wkb(str_)
100
- ::RGeo::WKRep::WKBParser.new(:default_factory => self).parse(str_)
100
+ WKRep::WKBParser.new(:default_factory => self).parse(str_)
101
101
  end
102
102
 
103
103
 
@@ -44,13 +44,14 @@ module RGeo
44
44
  # methods as a standard way to create features.
45
45
  #
46
46
  # If the implementation is unable to create the given feature,
47
- # it should return nil.
47
+ # it should generally return nil. Implementations may also choose to
48
+ # raise an exception on failure.
48
49
  #
49
50
  # Some implementations may extend this interface to provide facilities
50
- # for creating additional objects according to the features handled
51
- # by that implementation. Examples might include higher-dimensional
52
- # coordinates or additional subclasses not explicitly required by the
53
- # Simple Features Specification.
51
+ # for creating additional objects according to the capabilities
52
+ # provided by that implementation. Examples might include
53
+ # higher-dimensional coordinates or additional subclasses not
54
+ # explicitly required by the Simple Features Specification.
54
55
  #
55
56
  # Factory is defined as a module and is provided primarily for the
56
57
  # sake of documentation. Implementations need not necessarily include
@@ -101,13 +101,28 @@ module RGeo
101
101
 
102
102
  # Cast the given object according to the given parameters.
103
103
  #
104
- # You may optionally pass a factory, a feature type, and the value
105
- # <tt>:force_new</tt> as the parameters. The given object will be
106
- # casted into the given factory and feature type, if possible.
104
+ # You may optionally pass a factory, a feature type, the value
105
+ # <tt>:force_new</tt>, and the value <tt>:keep_subtype</tt> as the
106
+ # parameters. You may also pass the parameters as a hash, with the
107
+ # keys <tt>:factory</tt>, <tt>:type</tt>, <tt>:force_new</tt> and
108
+ # <tt>:keep_subtype</tt>.
109
+ #
110
+ # The given object will be casted into the given factory and
111
+ # feature type, if possible.
107
112
  # If the cast is not possible to accomplish, nil is returned.
108
113
  # If the factory or type is not provided, or is the same as the
109
114
  # object's current attribute, that attribute is not modified.
110
115
  #
116
+ # Normally, casting to a particular type always casts strictly to
117
+ # that type, even if the old type is a subtype of the new type.
118
+ # You can cause cast to retain the subtype by passing
119
+ # <tt>:keep_subtype</tt> as one of the parameters. For example,
120
+ # casting a LinearRing to a LineString will normally yield a
121
+ # LineString. However, if you specify <tt>:keep_subtype</tt>, the
122
+ # casted object will remain a LinearRing. You cannot cast to a
123
+ # non-instantiable type (such as Curve) without specifying
124
+ # <tt>:keep_subtype</tt>.
125
+ #
111
126
  # Normally, if neither the factory nor the type are set to be
112
127
  # modified, the original object is returned. However, you may cause
113
128
  # cast to return a duplicate of the original object by passing
@@ -135,6 +150,11 @@ module RGeo
135
150
  force_new_ = param_
136
151
  when :keep_subtype
137
152
  keep_subtype_ = param_
153
+ when ::Hash
154
+ nfactory_ = param_[:factory] || nfactory_
155
+ ntype_ = param_[:type] || ntype_
156
+ force_new_ = param_[:force_new] if param_.include?(:force_new)
157
+ keep_subtype_ = param_[:keep_subtype] if param_.include?(:keep_subtype)
138
158
  end
139
159
  end
140
160
 
@@ -34,9 +34,6 @@
34
34
  ;
35
35
 
36
36
 
37
- require 'json'
38
-
39
-
40
37
  module RGeo
41
38
 
42
39
  module GeoJSON
@@ -51,14 +48,62 @@ module RGeo
51
48
 
52
49
 
53
50
  # Create a new coder settings object. The geo factory is passed as
54
- # a required argument. The entity factory is optional. To provide
55
- # one, pass an option with key <tt>:entity_factory</tt>. It defaults
56
- # to the default RGeo::GeoJSON::EntityFactory, which generates
57
- # objects of type RGeo::GeoJSON::Feature or RGeo::GeoJSON::FeatureCollection.
58
-
59
- def initialize(geo_factory_, opts_={})
60
- @geo_factory = geo_factory_
51
+ # a required argument.
52
+ #
53
+ # Options include:
54
+ #
55
+ # <tt>:geo_factory</tt>::
56
+ # Specifies the geo factory to use to create geometry objects.
57
+ # Defaults to the preferred cartesian factory.
58
+ # <tt>:entity_factory</tt>::
59
+ # Specifies an entity factory, which lets you override the types
60
+ # of GeoJSON entities that are created. It defaults to the default
61
+ # RGeo::GeoJSON::EntityFactory, which generates objects of type
62
+ # RGeo::GeoJSON::Feature or RGeo::GeoJSON::FeatureCollection.
63
+ # See RGeo::GeoJSON::EntityFactory for more information.
64
+ # <tt>:json_parser</tt>::
65
+ # Specifies a JSON parser to use when decoding a String or IO
66
+ # object. The value may be a Proc object taking the string as the
67
+ # sole argument and returning the JSON hash, or it may be one of
68
+ # the special values <tt>:json</tt>, <tt>:yajl</tt>, or
69
+ # <tt>:active_support</tt>. Setting one of those special values
70
+ # will require the corresponding library to be available. The
71
+ # default is <tt>:json</tt>, which is present in the standard
72
+ # library in Ruby 1.9, but requires the "json" gem in Ruby 1.8.
73
+ # If the specified parser is not available, then decode will not
74
+ # accept a String or IO object; it will require a Hash.
75
+
76
+ def initialize(opts_={})
77
+ @geo_factory = opts_[:geo_factory] || ::RGeo::Cartesian.preferred_factory
61
78
  @entity_factory = opts_[:entity_factory] || EntityFactory.instance
79
+ @json_parser = opts_[:json_parser] || :json
80
+ case @json_parser
81
+ when :json
82
+ begin
83
+ require 'json'
84
+ @json_parser = ::Proc.new{ |str_| ::JSON.parse(str_) }
85
+ rescue ::LoadError
86
+ end
87
+ when :yajl
88
+ begin
89
+ require 'yajl'
90
+ @json_parser = ::Proc.new{ |str_| ::Yajl::Parser.new.parse(str_) }
91
+ rescue ::LoadError
92
+ end
93
+ when :active_support
94
+ begin
95
+ require 'active_support/json'
96
+ @json_parser = ::Proc.new{ |str_| ::ActiveSupport::JSON.decode(str_) }
97
+ rescue ::LoadError
98
+ end
99
+ when ::Proc
100
+ # Leave as is
101
+ else
102
+ raise ::ArgumentError, "Unrecognzied json_parser: #{@json_parser.inspect}"
103
+ end
104
+ @num_coordinates = 2
105
+ @num_coordinates += 1 if @geo_factory.has_capability?(:z_coordinate)
106
+ @num_coordinates += 1 if @geo_factory.has_capability?(:m_coordinate)
62
107
  end
63
108
 
64
109
 
@@ -82,13 +127,14 @@ module RGeo
82
127
 
83
128
  # Decode an object from GeoJSON. The input may be a JSON hash, a
84
129
  # String, or an IO object from which to read the JSON string.
130
+ # If an error occurs, nil is returned.
85
131
 
86
132
  def decode(input_)
87
133
  if input_.kind_of?(::IO)
88
134
  input_ = input_.read rescue nil
89
135
  end
90
136
  if input_.kind_of?(::String)
91
- input_ = ::JSON.parse(input_) rescue nil
137
+ input_ = @json_parser.call(input_) rescue nil
92
138
  end
93
139
  unless input_.kind_of?(::Hash)
94
140
  return nil
@@ -139,42 +185,57 @@ module RGeo
139
185
  end
140
186
 
141
187
 
142
- def _encode_geometry(object_) # :nodoc:
188
+ def _encode_geometry(object_, point_encoder_=nil) # :nodoc:
189
+ unless point_encoder_
190
+ if object_.factory.has_capability?(:z_coordinate)
191
+ if object_.factory.has_capability?(:m_coordinate)
192
+ point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y, p_.z, p_.m] }
193
+ else
194
+ point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y, p_.z] }
195
+ end
196
+ else
197
+ if object_.factory.has_capability?(:m_coordinate)
198
+ point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y, p_.m] }
199
+ else
200
+ point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y] }
201
+ end
202
+ end
203
+ end
143
204
  case object_
144
205
  when Features::Point
145
206
  {
146
207
  'type' => 'Point',
147
- 'coordinates' => [object_.x, object_.y],
208
+ 'coordinates' => point_encoder_.call(object_),
148
209
  }
149
210
  when Features::LineString
150
211
  {
151
212
  'type' => 'LineString',
152
- 'coordinates' => object_.points.map{ |p_| [p_.x, p_.y] },
213
+ 'coordinates' => object_.points.map(&point_encoder_),
153
214
  }
154
215
  when Features::Polygon
155
216
  {
156
217
  'type' => 'Polygon',
157
- 'coordinates' => [object_.exterior_ring.points.map{ |p_| [p_.x, p_.y] }] + object_.interior_rings.map{ |r_| r_.points.map{ |p_| [p_.x, p_.y] } }
218
+ 'coordinates' => [object_.exterior_ring.points.map(&point_encoder_)] + object_.interior_rings.map{ |r_| r_.points.map(&point_encoder_) }
158
219
  }
159
220
  when Features::MultiPoint
160
221
  {
161
222
  'type' => 'MultiPoint',
162
- 'coordinates' => object_.map{ |p_| [p_.x, p_.y] },
223
+ 'coordinates' => object_.map(&point_encoder_),
163
224
  }
164
225
  when Features::MultiLineString
165
226
  {
166
227
  'type' => 'MultiLineString',
167
- 'coordinates' => object_.map{ |ls_| ls_.points.map{ |p_| [p_.x, p_.y] } },
228
+ 'coordinates' => object_.map{ |ls_| ls_.points.map(&point_encoder_) },
168
229
  }
169
230
  when Features::MultiPolygon
170
231
  {
171
232
  'type' => 'MultiPolygon',
172
- 'coordinates' => object_.map{ |poly_| [poly_.exterior_ring.points.map{ |p_| [p_.x, p_.y] }] + poly_.interior_rings.map{ |r_| r_.points.map{ |p_| [p_.x, p_.y] } } },
233
+ 'coordinates' => object_.map{ |poly_| [poly_.exterior_ring.points.map(&point_encoder_)] + poly_.interior_rings.map{ |r_| r_.points.map(&point_encoder_) } },
173
234
  }
174
235
  when Features::GeometryCollection
175
236
  {
176
237
  'type' => 'GeometryCollection',
177
- 'geometries' => object_.map{ |geom_| _encode_geometry(geom_) },
238
+ 'geometries' => object_.map{ |geom_| _encode_geometry(geom_, point_encoder_) },
178
239
  }
179
240
  else
180
241
  nil
@@ -183,12 +244,12 @@ module RGeo
183
244
 
184
245
 
185
246
  def _decode_feature(input_) # :nodoc:
186
- geometry_ = _decode_geometry(input_['geometry'])
247
+ geometry_ = input_['geometry']
187
248
  if geometry_
188
- @entity_factory.feature(geometry_, input_['id'], input_['properties'])
189
- else
190
- nil
249
+ geometry_ = _decode_geometry(geometry_)
250
+ return nil unless geometry_
191
251
  end
252
+ @entity_factory.feature(geometry_, input_['id'], input_['properties'])
192
253
  end
193
254
 
194
255
 
@@ -228,7 +289,7 @@ module RGeo
228
289
 
229
290
  def _decode_point_coords(point_coords_) # :nodoc:
230
291
  return nil unless point_coords_.kind_of?(::Array)
231
- @geo_factory.point(point_coords_[0].to_f, point_coords_[1].to_f) rescue nil
292
+ @geo_factory.point(*(point_coords_[0...@num_coordinates].map{ |c_| c_.to_f })) rescue nil
232
293
  end
233
294
 
234
295
 
@@ -63,7 +63,7 @@ module RGeo
63
63
 
64
64
 
65
65
  def inspect # :nodoc:
66
- "#<#{self.class}:0x#{object_id.to_s(16)} id=#{@id.inspect} geom=#{@geometry.as_text.inspect}>"
66
+ "#<#{self.class}:0x#{object_id.to_s(16)} id=#{@id.inspect} geom=#{@geometry ? @geometry.as_text.inspect : 'nil'}>"
67
67
  end
68
68
 
69
69
  def to_s # :nodoc:
@@ -95,7 +95,7 @@ module RGeo
95
95
  end
96
96
 
97
97
 
98
- # Returns the geometry contained in this feature.
98
+ # Returns the geometry contained in this feature, which may be nil.
99
99
 
100
100
  def geometry
101
101
  @geometry
@@ -208,10 +208,11 @@ module RGeo
208
208
 
209
209
 
210
210
  # Create and return a new feature, given geometry, ID, and
211
- # properties hash.
211
+ # properties hash. Note that, per the GeoJSON spec, geometry and/or
212
+ # properties may be nil.
212
213
 
213
- def feature(geometry_, id_=nil, properties_={})
214
- Feature.new(geometry_, id_, properties_)
214
+ def feature(geometry_, id_=nil, properties_=nil)
215
+ Feature.new(geometry_, id_, properties_ || {})
215
216
  end
216
217
 
217
218
 
@@ -53,23 +53,39 @@ module RGeo
53
53
  # RGeo::GeoJSON::FeatureCollection.
54
54
 
55
55
  def encode(object_, opts_={})
56
- Coder.new(nil, opts_).encode(object_)
56
+ Coder.new(opts_).encode(object_)
57
57
  end
58
58
 
59
59
 
60
60
  # High-level convenience routine for decoding an object from GeoJSON.
61
61
  # The input may be a JSON hash, a String, or an IO object from which
62
- # to read the JSON string. You must also provide the
63
- # RGeo::Features::Factory to use to create geometric objects.
62
+ # to read the JSON string.
64
63
  #
65
- # The only option supported is <tt>:entity_factory</tt>, which lets
66
- # you override the types of GeoJSON entities that can be created.
67
- # See RGeo::GeoJSON::EntityFactory for more information. By default,
68
- # decode generates objects of type RGeo::GeoJSON::Feature and
69
- # RGeo::GeoJSON::FeatureCollection.
64
+ # Options include:
65
+ #
66
+ # <tt>:geo_factory</tt>::
67
+ # Specifies the geo factory to use to create geometry objects.
68
+ # Defaults to the preferred cartesian factory.
69
+ # <tt>:entity_factory</tt>::
70
+ # Specifies an entity factory, which lets you override the types
71
+ # of GeoJSON entities that are created. It defaults to the default
72
+ # RGeo::GeoJSON::EntityFactory, which generates objects of type
73
+ # RGeo::GeoJSON::Feature or RGeo::GeoJSON::FeatureCollection.
74
+ # See RGeo::GeoJSON::EntityFactory for more information.
75
+ # <tt>:json_parser</tt>::
76
+ # Specifies a JSON parser to use when decoding a String or IO
77
+ # object. The value may be a Proc object taking the string as the
78
+ # sole argument and returning the JSON hash, or it may be one of
79
+ # the special values <tt>:json</tt>, <tt>:yajl</tt>, or
80
+ # <tt>:active_support</tt>. Setting one of those special values
81
+ # will require the corresponding library to be available. The
82
+ # default is <tt>:json</tt>, which is present in the standard
83
+ # library in Ruby 1.9, but requires the "json" gem in Ruby 1.8.
84
+ # If the specified parser is not available, then decode will not
85
+ # accept a String or IO object; it will require a Hash.
70
86
 
71
- def decode(input_, geo_factory_, opts_={})
72
- Coder.new(geo_factory_, opts_).decode(input_)
87
+ def decode(input_, opts_={})
88
+ Coder.new(opts_).decode(input_)
73
89
  end
74
90
 
75
91
 
@@ -77,14 +93,32 @@ module RGeo
77
93
  # that encapsulates encoding and decoding settings (principally the
78
94
  # RGeo::Features::Factory and the RGeo::GeoJSON::EntityFactory to be
79
95
  # used).
80
- # The geo factory is a required argument. The entity factory is
81
- # optional. To provide one, pass an option with key
82
- # <tt>:entity_factory</tt>. It defaults to the default
83
- # RGeo::GeoJSON::EntityFactory, which generates objects of type
84
- # RGeo::GeoJSON::Feature or RGeo::GeoJSON::FeatureCollection.
96
+ #
97
+ # The geo factory is a required argument. Other options include:
98
+ #
99
+ # <tt>:geo_factory</tt>::
100
+ # Specifies the geo factory to use to create geometry objects.
101
+ # Defaults to the preferred cartesian factory.
102
+ # <tt>:entity_factory</tt>::
103
+ # Specifies an entity factory, which lets you override the types
104
+ # of GeoJSON entities that are created. It defaults to the default
105
+ # RGeo::GeoJSON::EntityFactory, which generates objects of type
106
+ # RGeo::GeoJSON::Feature or RGeo::GeoJSON::FeatureCollection.
107
+ # See RGeo::GeoJSON::EntityFactory for more information.
108
+ # <tt>:json_parser</tt>::
109
+ # Specifies a JSON parser to use when decoding a String or IO
110
+ # object. The value may be a Proc object taking the string as the
111
+ # sole argument and returning the JSON hash, or it may be one of
112
+ # the special values <tt>:json</tt>, <tt>:yajl</tt>, or
113
+ # <tt>:active_support</tt>. Setting one of those special values
114
+ # will require the corresponding library to be available. The
115
+ # default is <tt>:json</tt>, which is present in the standard
116
+ # library in Ruby 1.9, but requires the "json" gem in Ruby 1.8.
117
+ # If the specified parser is not available, then decode will not
118
+ # accept a String or IO object; it will require a Hash.
85
119
 
86
- def coder(geo_factory_, opts_={})
87
- Coder.new(geo_factory_, opts_)
120
+ def coder(opts_={})
121
+ Coder.new(opts_)
88
122
  end
89
123
 
90
124
 
@@ -177,7 +177,7 @@ module RGeo
177
177
  type_code_ |= 0x80000000 if @cur_has_z
178
178
  type_code_ |= 0x40000000 if @cur_has_m
179
179
  if @emit_ewkb_srid && toplevel_
180
- type_code |= 0x20000000
180
+ type_code_ |= 0x20000000
181
181
  emit_srid_ = true
182
182
  end
183
183
  elsif @type_format == :wkb12
data/tests/tc_geojson.rb CHANGED
@@ -45,7 +45,10 @@ module RGeo
45
45
 
46
46
 
47
47
  def setup
48
- @geo_factory = ::RGeo::Geos.factory(:srid => 4326)
48
+ @geo_factory = ::RGeo::Cartesian.simple_factory(:srid => 4326)
49
+ @geo_factory_z = ::RGeo::Cartesian.simple_factory(:srid => 4326, :support_z_coordinate => true)
50
+ @geo_factory_m = ::RGeo::Cartesian.simple_factory(:srid => 4326, :support_m_coordinate => true)
51
+ @geo_factory_zm = ::RGeo::Cartesian.simple_factory(:srid => 4326, :support_z_coordinate => true, :support_m_coordinate => true)
49
52
  @entity_factory = ::RGeo::GeoJSON::EntityFactory.instance
50
53
  end
51
54
 
@@ -57,7 +60,40 @@ module RGeo
57
60
  'coordinates' => [10.0, 20.0],
58
61
  }
59
62
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
60
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
63
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
64
+ end
65
+
66
+
67
+ def test_point_z
68
+ object_ = @geo_factory_z.point(10, 20, -1)
69
+ json_ = {
70
+ 'type' => 'Point',
71
+ 'coordinates' => [10.0, 20.0, -1.0],
72
+ }
73
+ assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
74
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory_z).eql?(object_))
75
+ end
76
+
77
+
78
+ def test_point_m
79
+ object_ = @geo_factory_m.point(10, 20, -1)
80
+ json_ = {
81
+ 'type' => 'Point',
82
+ 'coordinates' => [10.0, 20.0, -1.0],
83
+ }
84
+ assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
85
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory_m).eql?(object_))
86
+ end
87
+
88
+
89
+ def test_point_zm
90
+ object_ = @geo_factory_zm.point(10, 20, -1, -2)
91
+ json_ = {
92
+ 'type' => 'Point',
93
+ 'coordinates' => [10.0, 20.0, -1.0, -2.0],
94
+ }
95
+ assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
96
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory_zm).eql?(object_))
61
97
  end
62
98
 
63
99
 
@@ -68,7 +104,7 @@ module RGeo
68
104
  'coordinates' => [[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0]],
69
105
  }
70
106
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
71
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
107
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
72
108
  end
73
109
 
74
110
 
@@ -79,7 +115,7 @@ module RGeo
79
115
  'coordinates' => [[[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0], [10.0, 20.0]]],
80
116
  }
81
117
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
82
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
118
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
83
119
  end
84
120
 
85
121
 
@@ -90,7 +126,7 @@ module RGeo
90
126
  'coordinates' => [[[0.0, 0.0], [10.0, 0.0], [10.0, 10.0], [0.0, 10.0], [0.0, 0.0]], [[4.0, 4.0], [6.0, 5.0], [4.0, 6.0], [4.0, 4.0]]],
91
127
  }
92
128
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
93
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
129
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
94
130
  end
95
131
 
96
132
 
@@ -101,7 +137,7 @@ module RGeo
101
137
  'coordinates' => [[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0]],
102
138
  }
103
139
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
104
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
140
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
105
141
  end
106
142
 
107
143
 
@@ -112,7 +148,7 @@ module RGeo
112
148
  'coordinates' => [[[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0]], [[1.0, 2.0], [3.0, 4.0]]],
113
149
  }
114
150
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
115
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
151
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
116
152
  end
117
153
 
118
154
 
@@ -123,7 +159,7 @@ module RGeo
123
159
  'coordinates' => [[[[0.0, 0.0], [10.0, 0.0], [10.0, 10.0], [0.0, 10.0], [0.0, 0.0]], [[4.0, 4.0], [6.0, 5.0], [4.0, 6.0], [4.0, 4.0]]], [[[-10.0, -10.0], [-15.0, -10.0], [-10.0, -15.0], [-10.0, -10.0]]]]
124
160
  }
125
161
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
126
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
162
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
127
163
  end
128
164
 
129
165
 
@@ -152,7 +188,7 @@ module RGeo
152
188
  ],
153
189
  }
154
190
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
155
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
191
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
156
192
  end
157
193
 
158
194
 
@@ -167,7 +203,20 @@ module RGeo
167
203
  'properties' => {},
168
204
  }
169
205
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
170
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
206
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
207
+ end
208
+
209
+
210
+ def test_feature_nulls
211
+ json_ = {
212
+ 'type' => 'Feature',
213
+ 'geometry' => nil,
214
+ 'properties' => nil,
215
+ }
216
+ obj_ = ::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory)
217
+ assert_not_nil(obj_)
218
+ assert_nil(obj_.geometry)
219
+ assert_equal({}, obj_.properties)
171
220
  end
172
221
 
173
222
 
@@ -183,7 +232,7 @@ module RGeo
183
232
  'properties' => {'prop1' => 'foo', 'prop2' => 'bar'},
184
233
  }
185
234
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
186
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
235
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
187
236
  end
188
237
 
189
238
 
@@ -220,7 +269,7 @@ module RGeo
220
269
  ]
221
270
  }
222
271
  assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
223
- assert(::RGeo::GeoJSON.decode(json_, @geo_factory).eql?(object_))
272
+ assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
224
273
  end
225
274
 
226
275
 
@@ -0,0 +1,249 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Tests for WKT generator
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 WKRep # :nodoc:
44
+
45
+ class TestWKBGenerator < ::Test::Unit::TestCase # :nodoc:
46
+
47
+
48
+ def setup
49
+ @factory = ::RGeo::Cartesian.simple_factory(:srid => 1000)
50
+ @factoryz = ::RGeo::Cartesian.simple_factory(:srid => 1000, :support_z_coordinate => true)
51
+ @factorym = ::RGeo::Cartesian.simple_factory(:srid => 1000, :support_m_coordinate => true)
52
+ @factoryzm = ::RGeo::Cartesian.simple_factory(:srid => 1000, :support_z_coordinate => true, :support_m_coordinate => true)
53
+ end
54
+
55
+
56
+ def test_point_basic_xdr
57
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
58
+ obj_ = @factory.point(1, 2)
59
+ assert_equal('00000000013ff00000000000004000000000000000', generator_.generate(obj_))
60
+ end
61
+
62
+
63
+ def test_point_basic_ndr
64
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :little_endian => true)
65
+ obj_ = @factory.point(1, 2)
66
+ assert_equal('0101000000000000000000f03f0000000000000040', generator_.generate(obj_))
67
+ end
68
+
69
+
70
+ def test_point_2d_ewkb
71
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb)
72
+ obj_ = @factory.point(1, 2)
73
+ assert_equal('00000000013ff00000000000004000000000000000', generator_.generate(obj_))
74
+ end
75
+
76
+
77
+ def test_point_2d_wkb12
78
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :wkb12)
79
+ obj_ = @factory.point(1, 2)
80
+ assert_equal('00000000013ff00000000000004000000000000000', generator_.generate(obj_))
81
+ end
82
+
83
+
84
+ def test_point_2d_ewkb_with_srid
85
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb, :emit_ewkb_srid => true)
86
+ obj_ = @factory.point(1, 2)
87
+ assert_equal('0020000001000003e83ff00000000000004000000000000000', generator_.generate(obj_))
88
+ end
89
+
90
+
91
+ def test_point_with_ewkb_z
92
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb)
93
+ obj_ = @factoryz.point(1, 2, 3)
94
+ assert_equal('00800000013ff000000000000040000000000000004008000000000000', generator_.generate(obj_))
95
+ end
96
+
97
+
98
+ def test_point_with_ewkb_m
99
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb)
100
+ obj_ = @factorym.point(1, 2, 3)
101
+ assert_equal('00400000013ff000000000000040000000000000004008000000000000', generator_.generate(obj_))
102
+ end
103
+
104
+
105
+ def test_point_with_ewkb_zm
106
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb)
107
+ obj_ = @factoryzm.point(1, 2, 3, 4)
108
+ assert_equal('00c00000013ff0000000000000400000000000000040080000000000004010000000000000', generator_.generate(obj_))
109
+ end
110
+
111
+
112
+ def test_point_with_wkb12_z
113
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :wkb12)
114
+ obj_ = @factoryz.point(1, 2, 3)
115
+ assert_equal('00000003e93ff000000000000040000000000000004008000000000000', generator_.generate(obj_))
116
+ end
117
+
118
+
119
+ def test_point_with_wkb12_m
120
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :wkb12)
121
+ obj_ = @factorym.point(1, 2, 3)
122
+ assert_equal('00000007d13ff000000000000040000000000000004008000000000000', generator_.generate(obj_))
123
+ end
124
+
125
+
126
+ def test_point_with_wkb12_zm
127
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :wkb12)
128
+ obj_ = @factoryzm.point(1, 2, 3, 4)
129
+ assert_equal('0000000bb93ff0000000000000400000000000000040080000000000004010000000000000', generator_.generate(obj_))
130
+ end
131
+
132
+
133
+ def test_linestring_basic
134
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
135
+ obj_ = @factory.line_string([@factory.point(1, 2), @factory.point(3, 4), @factory.point(5, 6)])
136
+ assert_equal('0000000002000000033ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000', generator_.generate(obj_))
137
+ end
138
+
139
+
140
+ def test_linestring_with_ewkb_z
141
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb)
142
+ obj_ = @factoryz.line_string([@factoryz.point(1, 2, 3), @factoryz.point(4, 5, 6)])
143
+ assert_equal('0080000002000000023ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000', generator_.generate(obj_))
144
+ end
145
+
146
+
147
+ def test_linestring_with_ewkb_z_and_srid
148
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb, :emit_ewkb_srid => true)
149
+ obj_ = @factoryz.line_string([@factoryz.point(1, 2, 3), @factoryz.point(4, 5, 6)])
150
+ assert_equal('00a0000002000003e8000000023ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000', generator_.generate(obj_))
151
+ end
152
+
153
+
154
+ def test_linestring_with_wkb12_m
155
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :wkb12)
156
+ obj_ = @factorym.line_string([@factorym.point(1, 2, 3), @factorym.point(4, 5, 6)])
157
+ assert_equal('00000007d2000000023ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000', generator_.generate(obj_))
158
+ end
159
+
160
+
161
+ def test_linestring_empty
162
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
163
+ obj_ = @factory.line_string([])
164
+ assert_equal('000000000200000000', generator_.generate(obj_))
165
+ end
166
+
167
+
168
+ def test_polygon_basic
169
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
170
+ obj_ = @factory.polygon(@factory.linear_ring([@factory.point(1, 2), @factory.point(3, 4), @factory.point(6, 5), @factory.point(1, 2)]))
171
+ assert_equal('000000000300000001000000043ff0000000000000400000000000000040080000000000004010000000000000401800000000000040140000000000003ff00000000000004000000000000000', generator_.generate(obj_))
172
+ end
173
+
174
+
175
+ def test_polygon_empty
176
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
177
+ obj_ = @factory.polygon(@factory.linear_ring([]))
178
+ assert_equal('000000000300000000', generator_.generate(obj_))
179
+ end
180
+
181
+
182
+ def test_multipoint_basic
183
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
184
+ obj_ = @factory.multi_point([@factory.point(1, 2), @factory.point(3, 4)])
185
+ assert_equal('00000000040000000200000000013ff00000000000004000000000000000000000000140080000000000004010000000000000', generator_.generate(obj_))
186
+ end
187
+
188
+
189
+ def test_multipoint_with_ewkb_z
190
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true, :type_format => :ewkb)
191
+ obj_ = @factoryz.multi_point([@factoryz.point(1, 2, 5), @factoryz.point(3, 4, 6)])
192
+ assert_equal('00800000040000000200800000013ff0000000000000400000000000000040140000000000000080000001400800000000000040100000000000004018000000000000', generator_.generate(obj_))
193
+ end
194
+
195
+
196
+ def test_multipoint_empty
197
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
198
+ obj_ = @factory.multi_point([])
199
+ assert_equal('000000000400000000', generator_.generate(obj_))
200
+ end
201
+
202
+
203
+ def test_multilinestring_basic
204
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
205
+ obj_ = @factory.multi_line_string([@factory.line_string([@factory.point(1, 2), @factory.point(3, 4), @factory.point(5, 6)]), @factory.line_string([@factory.point(-1, -2), @factory.point(-3, -4)])])
206
+ assert_equal('0000000005000000020000000002000000033ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000000000000200000002bff0000000000000c000000000000000c008000000000000c010000000000000', generator_.generate(obj_))
207
+ end
208
+
209
+
210
+ def test_multilinestring_empty
211
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
212
+ obj_ = @factory.multi_line_string([])
213
+ assert_equal('000000000500000000', generator_.generate(obj_))
214
+ end
215
+
216
+
217
+ def test_multipolygon_basic
218
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
219
+ obj_ = @factory.multi_polygon([@factory.polygon(@factory.linear_ring([@factory.point(1, 2), @factory.point(3, 4), @factory.point(6, 5), @factory.point(1, 2)])), @factory.polygon(@factory.linear_ring([]))])
220
+ assert_equal('000000000600000002000000000300000001000000043ff0000000000000400000000000000040080000000000004010000000000000401800000000000040140000000000003ff00000000000004000000000000000000000000300000000', generator_.generate(obj_))
221
+ end
222
+
223
+
224
+ def test_multipolygon_empty
225
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
226
+ obj_ = @factory.multi_polygon([])
227
+ assert_equal('000000000600000000', generator_.generate(obj_))
228
+ end
229
+
230
+
231
+ def test_collection_basic
232
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
233
+ obj_ = @factory.collection([@factory.line_string([@factory.point(1, 2), @factory.point(3, 4), @factory.point(5, 6)]), @factory.point(-1, -2)])
234
+ assert_equal('0000000007000000020000000002000000033ff0000000000000400000000000000040080000000000004010000000000000401400000000000040180000000000000000000001bff0000000000000c000000000000000', generator_.generate(obj_))
235
+ end
236
+
237
+
238
+ def test_collection_empty
239
+ generator_ = ::RGeo::WKRep::WKBGenerator.new(:hex_format => true)
240
+ obj_ = @factory.collection([])
241
+ assert_equal('000000000700000000', generator_.generate(obj_))
242
+ end
243
+
244
+
245
+ end
246
+
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,353 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Tests for WKT parser
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 WKRep # :nodoc:
44
+
45
+ class TestWKBParser < ::Test::Unit::TestCase # :nodoc:
46
+
47
+
48
+ def test_point_2d_xdr
49
+ parser_ = ::RGeo::WKRep::WKBParser.new
50
+ obj_ = parser_.parse_hex('00000000013ff00000000000004000000000000000')
51
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
52
+ assert_equal(1, obj_.x)
53
+ assert_equal(2, obj_.y)
54
+ end
55
+
56
+
57
+ def test_point_2d_ndr
58
+ parser_ = ::RGeo::WKRep::WKBParser.new
59
+ obj_ = parser_.parse_hex('0101000000000000000000f03f0000000000000040')
60
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
61
+ assert_equal(1, obj_.x)
62
+ assert_equal(2, obj_.y)
63
+ end
64
+
65
+
66
+ def test_point_with_ewkb_z
67
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
68
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
69
+ obj_ = parser_.parse_hex('00800000013ff000000000000040000000000000004008000000000000')
70
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
71
+ assert_equal(3, obj_.z)
72
+ assert_nil(obj_.m)
73
+ end
74
+
75
+
76
+ def test_point_with_ewkb_m
77
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_m_coordinate => true)
78
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
79
+ obj_ = parser_.parse_hex('00400000013ff000000000000040000000000000004008000000000000')
80
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
81
+ assert_equal(3, obj_.m)
82
+ assert_nil(obj_.z)
83
+ end
84
+
85
+
86
+ def test_point_with_ewkb_zm
87
+ factory_ = ::RGeo::Cartesian.simple_factory(:support_z_coordinate => true, :support_m_coordinate => true)
88
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
89
+ obj_ = parser_.parse_hex('00c00000013ff0000000000000400000000000000040080000000000004010000000000000')
90
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
91
+ assert_equal(3, obj_.z)
92
+ assert_equal(4, obj_.m)
93
+ end
94
+
95
+
96
+ def test_point_with_wkb12_z
97
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
98
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_wkb12 => true)
99
+ obj_ = parser_.parse_hex('00000003e93ff000000000000040000000000000004008000000000000')
100
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
101
+ assert_equal(3, obj_.z)
102
+ assert_nil(obj_.m)
103
+ end
104
+
105
+
106
+ def test_point_with_wkb12_m
107
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_m_coordinate => true)
108
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_wkb12 => true)
109
+ obj_ = parser_.parse_hex('00000007d13ff000000000000040000000000000004008000000000000')
110
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
111
+ assert_equal(3, obj_.m)
112
+ assert_nil(obj_.z)
113
+ end
114
+
115
+
116
+ def test_point_with_wkb12_zm
117
+ factory_ = ::RGeo::Cartesian.simple_factory(:support_z_coordinate => true, :support_m_coordinate => true)
118
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_wkb12 => true)
119
+ obj_ = parser_.parse_hex('0000000bb93ff0000000000000400000000000000040080000000000004010000000000000')
120
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
121
+ assert_equal(3, obj_.z)
122
+ assert_equal(4, obj_.m)
123
+ end
124
+
125
+
126
+ def test_point_with_wkb12_z_without_wkb12_support
127
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
128
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_)
129
+ assert_raise(::RGeo::Errors::ParseError) do
130
+ obj_ = parser_.parse_hex('00000003e93ff000000000000040000000000000004008000000000000')
131
+ end
132
+ end
133
+
134
+
135
+ def test_point_with_wkb12_z_without_enough_data
136
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
137
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_wkb12 => true)
138
+ assert_raise(::RGeo::Errors::ParseError) do
139
+ obj_ = parser_.parse_hex('00000003e93ff00000000000004000000000000000')
140
+ end
141
+ end
142
+
143
+
144
+ def test_point_with_ewkb_z_and_srid
145
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
146
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
147
+ parser_.set_factory_from_srid do |srid_|
148
+ ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true, :srid => srid_)
149
+ end
150
+ obj_ = parser_.parse_hex('00a0000001000003e83ff000000000000040000000000000004008000000000000')
151
+ assert_equal(::RGeo::Features::Point, obj_.geometry_type)
152
+ assert_equal(3, obj_.z)
153
+ assert_nil(obj_.m)
154
+ assert_equal(1000, obj_.srid)
155
+ end
156
+
157
+
158
+ def test_linestring_basic
159
+ parser_ = ::RGeo::WKRep::WKBParser.new
160
+ obj_ = parser_.parse_hex('0000000002000000033ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000')
161
+ assert_equal(::RGeo::Features::LineString, obj_.geometry_type)
162
+ assert_equal(3, obj_.num_points)
163
+ assert_equal(1, obj_.point_n(0).x)
164
+ assert_equal(6, obj_.point_n(2).y)
165
+ end
166
+
167
+
168
+ def test_linestring_with_ewkb_z
169
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
170
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
171
+ obj_ = parser_.parse_hex('0080000002000000023ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000')
172
+ assert_equal(::RGeo::Features::LineString, obj_.geometry_type)
173
+ assert_equal(2, obj_.num_points)
174
+ assert_equal(1, obj_.point_n(0).x)
175
+ assert_equal(6, obj_.point_n(1).z)
176
+ end
177
+
178
+
179
+ def test_linestring_with_ewkb_z_and_srid
180
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
181
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
182
+ parser_.set_factory_from_srid do |srid_|
183
+ ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true, :srid => srid_)
184
+ end
185
+ obj_ = parser_.parse_hex('00a0000002000003e8000000023ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000')
186
+ assert_equal(::RGeo::Features::LineString, obj_.geometry_type)
187
+ assert_equal(2, obj_.num_points)
188
+ assert_equal(1, obj_.point_n(0).x)
189
+ assert_equal(6, obj_.point_n(1).z)
190
+ assert_equal(1000, obj_.srid)
191
+ end
192
+
193
+
194
+ def test_linestring_with_wkb12_z
195
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
196
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_wkb12 => true)
197
+ obj_ = parser_.parse_hex('00000003ea000000023ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000')
198
+ assert_equal(::RGeo::Features::LineString, obj_.geometry_type)
199
+ assert_equal(2, obj_.num_points)
200
+ assert_equal(1, obj_.point_n(0).x)
201
+ assert_equal(6, obj_.point_n(1).z)
202
+ end
203
+
204
+
205
+ def test_linestring_empty
206
+ parser_ = ::RGeo::WKRep::WKBParser.new
207
+ obj_ = parser_.parse_hex('000000000200000000')
208
+ assert_equal(::RGeo::Features::LineString, obj_.geometry_type)
209
+ assert_equal(0, obj_.num_points)
210
+ end
211
+
212
+
213
+ def test_polygon_basic
214
+ parser_ = ::RGeo::WKRep::WKBParser.new
215
+ obj_ = parser_.parse_hex('000000000300000001000000043ff0000000000000400000000000000040080000000000004010000000000000401800000000000040140000000000003ff00000000000004000000000000000')
216
+ assert_equal(::RGeo::Features::Polygon, obj_.geometry_type)
217
+ assert_equal(4, obj_.exterior_ring.num_points)
218
+ assert_equal(1, obj_.exterior_ring.point_n(0).x)
219
+ assert_equal(5, obj_.exterior_ring.point_n(2).y)
220
+ end
221
+
222
+
223
+ def test_polygon_empty
224
+ parser_ = ::RGeo::WKRep::WKBParser.new
225
+ obj_ = parser_.parse_hex('000000000300000000')
226
+ assert_equal(::RGeo::Features::Polygon, obj_.geometry_type)
227
+ assert_equal(0, obj_.exterior_ring.num_points)
228
+ end
229
+
230
+
231
+ def test_multipoint_basic
232
+ parser_ = ::RGeo::WKRep::WKBParser.new
233
+ obj_ = parser_.parse_hex('00000000040000000200000000013ff00000000000004000000000000000000000000140080000000000004010000000000000')
234
+ assert_equal(::RGeo::Features::MultiPoint, obj_.geometry_type)
235
+ assert_equal(2, obj_.num_geometries)
236
+ assert_equal(1, obj_[0].x)
237
+ assert_equal(4, obj_[1].y)
238
+ end
239
+
240
+
241
+ def test_multipoint_mixed_byte_order
242
+ parser_ = ::RGeo::WKRep::WKBParser.new
243
+ obj_ = parser_.parse_hex('0000000004000000020101000000000000000000f03f0000000000000040000000000140080000000000004010000000000000')
244
+ assert_equal(::RGeo::Features::MultiPoint, obj_.geometry_type)
245
+ assert_equal(2, obj_.num_geometries)
246
+ assert_equal(1, obj_[0].x)
247
+ assert_equal(4, obj_[1].y)
248
+ end
249
+
250
+
251
+ def test_multipoint_with_ewkb_z
252
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
253
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
254
+ obj_ = parser_.parse_hex('00800000040000000200800000013ff0000000000000400000000000000040140000000000000080000001400800000000000040100000000000004018000000000000')
255
+ assert_equal(::RGeo::Features::MultiPoint, obj_.geometry_type)
256
+ assert_equal(2, obj_.num_geometries)
257
+ assert_equal(1, obj_[0].x)
258
+ assert_equal(5, obj_[0].z)
259
+ assert_equal(4, obj_[1].y)
260
+ assert_equal(6, obj_[1].z)
261
+ assert_nil(obj_[0].m)
262
+ end
263
+
264
+
265
+ def test_multipoint_ewkb_with_mixed_z
266
+ factory_ = ::RGeo::Cartesian.preferred_factory(:support_z_coordinate => true)
267
+ parser_ = ::RGeo::WKRep::WKBParser.new(:default_factory => factory_, :support_ewkb => true)
268
+ assert_raise(::RGeo::Errors::ParseError) do
269
+ obj_ = parser_.parse_hex('00800000040000000200800000013ff000000000000040000000000000004014000000000000000000000140080000000000004010000000000000')
270
+ end
271
+ end
272
+
273
+
274
+ def test_multipoint_empty
275
+ parser_ = ::RGeo::WKRep::WKBParser.new
276
+ obj_ = parser_.parse_hex('000000000400000000')
277
+ assert_equal(::RGeo::Features::MultiPoint, obj_.geometry_type)
278
+ assert_equal(0, obj_.num_geometries)
279
+ end
280
+
281
+
282
+ def test_multilinestring_basic
283
+ parser_ = ::RGeo::WKRep::WKBParser.new
284
+ obj_ = parser_.parse_hex('0000000005000000020000000002000000033ff000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000000000000200000002bff0000000000000c000000000000000c008000000000000c010000000000000')
285
+ assert_equal(::RGeo::Features::MultiLineString, obj_.geometry_type)
286
+ assert_equal(2, obj_.num_geometries)
287
+ assert_equal(1, obj_[0].point_n(0).x)
288
+ assert_equal(-4, obj_[1].point_n(1).y)
289
+ end
290
+
291
+
292
+ def test_multilinestring_wrong_element_type
293
+ parser_ = ::RGeo::WKRep::WKBParser.new
294
+ assert_raise(::RGeo::Errors::ParseError) do
295
+ obj_ = parser_.parse_hex('0000000005000000020000000002000000033ff00000000000004000000000000000400800000000000040100000000000004014000000000000401800000000000000000000013ff00000000000004000000000000000')
296
+ end
297
+ end
298
+
299
+
300
+ def test_multilinestring_empty
301
+ parser_ = ::RGeo::WKRep::WKBParser.new
302
+ obj_ = parser_.parse_hex('000000000500000000')
303
+ assert_equal(::RGeo::Features::MultiLineString, obj_.geometry_type)
304
+ assert_equal(0, obj_.num_geometries)
305
+ end
306
+
307
+
308
+ def test_multipolygon_basic
309
+ parser_ = ::RGeo::WKRep::WKBParser.new
310
+ obj_ = parser_.parse_hex('000000000600000002000000000300000001000000043ff0000000000000400000000000000040080000000000004010000000000000401800000000000040140000000000003ff00000000000004000000000000000000000000300000000')
311
+ assert_equal(::RGeo::Features::MultiPolygon, obj_.geometry_type)
312
+ assert_equal(2, obj_.num_geometries)
313
+ assert_equal(4, obj_[0].exterior_ring.num_points)
314
+ assert_equal(1, obj_[0].exterior_ring.point_n(0).x)
315
+ assert_equal(5, obj_[0].exterior_ring.point_n(2).y)
316
+ assert_equal(0, obj_[1].exterior_ring.num_points)
317
+ end
318
+
319
+
320
+ def test_multipolygon_empty
321
+ parser_ = ::RGeo::WKRep::WKBParser.new
322
+ obj_ = parser_.parse_hex('000000000600000000')
323
+ assert_equal(::RGeo::Features::MultiPolygon, obj_.geometry_type)
324
+ assert_equal(0, obj_.num_geometries)
325
+ end
326
+
327
+
328
+ def test_collection_basic
329
+ parser_ = ::RGeo::WKRep::WKBParser.new
330
+ obj_ = parser_.parse_hex('0000000007000000020000000002000000033ff0000000000000400000000000000040080000000000004010000000000000401400000000000040180000000000000000000001bff0000000000000c000000000000000')
331
+ assert_equal(::RGeo::Features::GeometryCollection, obj_.geometry_type)
332
+ assert_equal(2, obj_.num_geometries)
333
+ assert_equal(::RGeo::Features::LineString, obj_[0].geometry_type)
334
+ assert_equal(1, obj_[0].point_n(0).x)
335
+ assert_equal(6, obj_[0].point_n(2).y)
336
+ assert_equal(::RGeo::Features::Point, obj_[1].geometry_type)
337
+ assert_equal(-1, obj_[1].x)
338
+ end
339
+
340
+
341
+ def test_collection_empty
342
+ parser_ = ::RGeo::WKRep::WKBParser.new
343
+ obj_ = parser_.parse_hex('000000000700000000')
344
+ assert_equal(::RGeo::Features::GeometryCollection, obj_.geometry_type)
345
+ assert_equal(0, obj_.num_geometries)
346
+ end
347
+
348
+
349
+ end
350
+
351
+ end
352
+ end
353
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 15
9
- version: 0.1.15
8
+ - 16
9
+ version: 0.1.16
10
10
  platform: ruby
11
11
  authors:
12
12
  - Daniel Azuma
@@ -14,24 +14,10 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-08 00:00:00 -08:00
17
+ date: 2010-11-18 00:00:00 -08:00
18
18
  default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: json
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 1
30
- - 4
31
- - 6
32
- version: 1.4.6
33
- type: :runtime
34
- version_requirements: *id001
19
+ dependencies: []
20
+
35
21
  description: RGeo is a spatial data library for Ruby. It provides an implementation of the Open Geospatial Consortium's Simple Features Specification, used by most standard spatial/geographic data storage systems such as PostGIS. It also provides a suite of useful tools for writing location-based applications using Ruby-based frameworks such as Ruby On Rails.
36
22
  email: dazuma@gmail.com
37
23
  executables: []
@@ -146,6 +132,8 @@ files:
146
132
  - tests/simple_spherical/tc_polygon.rb
147
133
  - tests/tc_geojson.rb
148
134
  - tests/tc_oneoff.rb
135
+ - tests/wkrep/tc_wkb_generator.rb
136
+ - tests/wkrep/tc_wkb_parser.rb
149
137
  - tests/wkrep/tc_wkt_generator.rb
150
138
  - tests/wkrep/tc_wkt_parser.rb
151
139
  - ext/geos_c_impl/extconf.rb
@@ -241,5 +229,7 @@ test_files:
241
229
  - tests/simple_spherical/tc_polygon.rb
242
230
  - tests/tc_geojson.rb
243
231
  - tests/tc_oneoff.rb
232
+ - tests/wkrep/tc_wkb_generator.rb
233
+ - tests/wkrep/tc_wkb_parser.rb
244
234
  - tests/wkrep/tc_wkt_generator.rb
245
235
  - tests/wkrep/tc_wkt_parser.rb