rgeo-geojson 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +5 -0
- data/README.md +15 -26
- data/lib/rgeo/geo_json/coder.rb +65 -95
- data/lib/rgeo/geo_json/entities.rb +9 -53
- data/lib/rgeo/geo_json/interface.rb +3 -13
- data/lib/rgeo/geo_json/version.rb +1 -1
- data/lib/rgeo/geo_json.rb +5 -11
- data/lib/rgeo-geojson.rb +1 -1
- metadata +9 -12
- data/test/basic_test.rb +0 -273
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a486ffc62008cbb9d03e13f7ea93aa229c588de
|
4
|
+
data.tar.gz: c3826e787a98ba17b33f81e59c859898a6807ea3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ef133754c920d853e2e2a9191e194afdf895bb361692e22d56d2dc160c5dda5b9b8470aad511458d84a35e7ef44f5541346e44ab6750ff1ac7124129f7ccc7f
|
7
|
+
data.tar.gz: e6fd873662287d0b7999190469aad4f805259906e2589f043199128bd56848c84c7f14cb082dacabe7eb5b0073288fc40eccfae2818d098aabaafe74d7d9f476
|
data/History.md
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
#
|
1
|
+
# rgeo-geojson
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/rgeo-geojson.svg)](http://badge.fury.io/rb/rgeo-geojson)
|
4
4
|
[![Build Status](https://travis-ci.org/rgeo/rgeo-geojson.svg?branch=master)](https://travis-ci.org/rgeo/rgeo-geojson)
|
5
5
|
|
6
|
-
`
|
7
|
-
that provides GeoJSON encoding and decoding
|
6
|
+
`rgeo-geojson` is an extension to [RGeo](https://github.com/rgeo/rgeo)
|
7
|
+
that provides GeoJSON encoding and decoding.
|
8
8
|
|
9
9
|
## Summary
|
10
10
|
|
@@ -15,10 +15,9 @@ representations of geometric objects such as points, lines, and polygons,
|
|
15
15
|
along with a set of geometric analysis operations. See the README for the
|
16
16
|
"rgeo" gem for more information.
|
17
17
|
|
18
|
-
`RGeo::GeoJSON` is an optional RGeo
|
19
|
-
and decoding
|
20
|
-
|
21
|
-
for more information.
|
18
|
+
`RGeo::GeoJSON` is an optional RGeo module that provides GeoJSON encoding
|
19
|
+
and decoding. [GeoJSON](http://geojson.org) is a JSON format used for
|
20
|
+
geographic data structures.
|
22
21
|
|
23
22
|
Example:
|
24
23
|
|
@@ -26,11 +25,11 @@ Example:
|
|
26
25
|
require 'rgeo/geo_json'
|
27
26
|
|
28
27
|
str1 = '{"type":"Point","coordinates":[1,2]}'
|
29
|
-
geom = RGeo::GeoJSON.decode(str1, :
|
28
|
+
geom = RGeo::GeoJSON.decode(str1, json_parser: :json)
|
30
29
|
geom.as_text # => "POINT(1.0 2.0)"
|
31
30
|
|
32
31
|
str2 = '{"type":"Feature","geometry":{"type":"Point","coordinates":[2.5,4.0]},"properties":{"color":"red"}}'
|
33
|
-
feature = RGeo::GeoJSON.decode(str2, :
|
32
|
+
feature = RGeo::GeoJSON.decode(str2, json_parser: :json)
|
34
33
|
feature['color'] # => 'red'
|
35
34
|
feature.geometry.as_text # => "POINT(2.5 4.0)"
|
36
35
|
|
@@ -43,7 +42,7 @@ hash.to_json == str2 # => true
|
|
43
42
|
`RGeo::GeoJSON` has the following requirements:
|
44
43
|
|
45
44
|
* Ruby 1.9.3 or later
|
46
|
-
* rgeo 0.
|
45
|
+
* rgeo 0.5.0 or later.
|
47
46
|
|
48
47
|
Include in your bundle:
|
49
48
|
|
@@ -51,7 +50,7 @@ Include in your bundle:
|
|
51
50
|
gem 'rgeo-geojson'
|
52
51
|
```
|
53
52
|
|
54
|
-
Install
|
53
|
+
Install `rgeo-geojson` as a gem:
|
55
54
|
|
56
55
|
```sh
|
57
56
|
gem install rgeo-geojson
|
@@ -59,17 +58,11 @@ gem install rgeo-geojson
|
|
59
58
|
|
60
59
|
See the README for the "rgeo" gem, a required dependency, for further installation information.
|
61
60
|
|
62
|
-
If you are using Ruby 1.8, use version `0.2.x`.
|
63
|
-
|
64
|
-
### To-do list
|
65
|
-
|
66
|
-
* Add support for the "bbox" and "crs" elements.
|
67
|
-
|
68
61
|
### Development and support
|
69
62
|
|
70
63
|
RDoc Documentation is available at http://rdoc.info/gems/rgeo-geojson
|
71
64
|
|
72
|
-
Source code is hosted on Github at
|
65
|
+
Source code is hosted on Github at https://github.com/rgeo/rgeo-geojson
|
73
66
|
|
74
67
|
Contributions are welcome. Fork the project on Github.
|
75
68
|
|
@@ -77,17 +70,13 @@ Report bugs on Github issues at http://github.com/rgeo/rgeo-geojson/issues
|
|
77
70
|
|
78
71
|
### Acknowledgments
|
79
72
|
|
80
|
-
RGeo
|
73
|
+
RGeo was created by Daniel Azuma (http://www.daniel-azuma.com).
|
81
74
|
|
82
|
-
Development is supported by
|
83
|
-
|
84
|
-
* [Pirq](http://www.pirq.com)
|
85
|
-
* [Neighborland](https://neighborland.com)
|
75
|
+
Development is supported by [Pirq](http://www.pirq.com) and
|
76
|
+
[Neighborland](https://neighborland.com).
|
86
77
|
|
87
78
|
### License
|
88
79
|
|
89
|
-
Copyright
|
90
|
-
|
91
|
-
Copyright 2014 Tee Parham
|
80
|
+
Copyright (c) Daniel Azuma, Tee Parham
|
92
81
|
|
93
82
|
https://github.com/rgeo/rgeo-geojson/blob/master/LICENSE.txt
|
data/lib/rgeo/geo_json/coder.rb
CHANGED
@@ -1,21 +1,15 @@
|
|
1
1
|
module RGeo
|
2
|
-
|
3
2
|
module GeoJSON
|
4
|
-
|
5
|
-
|
6
3
|
# This object encapsulates encoding and decoding settings (principally
|
7
4
|
# the RGeo::Feature::Factory and the RGeo::GeoJSON::EntityFactory to
|
8
5
|
# be used) so that you can encode and decode without specifying those
|
9
6
|
# settings every time.
|
10
7
|
|
11
8
|
class Coder
|
12
|
-
|
13
|
-
|
14
9
|
@@json_available = nil
|
15
10
|
@@yajl_available = nil
|
16
11
|
@@activesupport_available = nil
|
17
12
|
|
18
|
-
|
19
13
|
# Create a new coder settings object. The geo factory is passed as
|
20
14
|
# a required argument.
|
21
15
|
#
|
@@ -42,7 +36,7 @@ module RGeo
|
|
42
36
|
# If a parser is not specified, then the decode method will not
|
43
37
|
# accept a String or IO object; it will require a Hash.
|
44
38
|
|
45
|
-
def initialize(opts_={})
|
39
|
+
def initialize(opts_ = {})
|
46
40
|
@geo_factory = opts_[:geo_factory] || ::RGeo::Cartesian.preferred_factory
|
47
41
|
@entity_factory = opts_[:entity_factory] || EntityFactory.instance
|
48
42
|
@json_parser = opts_[:json_parser]
|
@@ -50,42 +44,42 @@ module RGeo
|
|
50
44
|
when :json
|
51
45
|
if @@json_available.nil?
|
52
46
|
begin
|
53
|
-
require
|
47
|
+
require "json"
|
54
48
|
@@json_available = true
|
55
49
|
rescue ::LoadError
|
56
50
|
@@json_available = false
|
57
51
|
end
|
58
52
|
end
|
59
53
|
if @@json_available
|
60
|
-
@json_parser = ::Proc.new{ |str_| ::JSON.parse(str_) }
|
54
|
+
@json_parser = ::Proc.new { |str_| ::JSON.parse(str_) }
|
61
55
|
else
|
62
56
|
raise Error::RGeoError, "JSON library is not available. You may need to install the 'json' gem."
|
63
57
|
end
|
64
58
|
when :yajl
|
65
59
|
if @@yajl_available.nil?
|
66
60
|
begin
|
67
|
-
require
|
61
|
+
require "yajl"
|
68
62
|
@@yajl_available = true
|
69
63
|
rescue ::LoadError
|
70
64
|
@@yajl_available = false
|
71
65
|
end
|
72
66
|
end
|
73
67
|
if @@yajl_available
|
74
|
-
@json_parser = ::Proc.new{ |str_| ::Yajl::Parser.new.parse(str_) }
|
68
|
+
@json_parser = ::Proc.new { |str_| ::Yajl::Parser.new.parse(str_) }
|
75
69
|
else
|
76
70
|
raise Error::RGeoError, "Yajl library is not available. You may need to install the 'yajl' gem."
|
77
71
|
end
|
78
72
|
when :active_support
|
79
73
|
if @@activesupport_available.nil?
|
80
74
|
begin
|
81
|
-
require
|
75
|
+
require "active_support/json"
|
82
76
|
@@activesupport_available = true
|
83
77
|
rescue ::LoadError
|
84
78
|
@@activesupport_available = false
|
85
79
|
end
|
86
80
|
end
|
87
81
|
if @@activesupport_available
|
88
|
-
@json_parser = ::Proc.new{ |str_| ::ActiveSupport::JSON.decode(str_) }
|
82
|
+
@json_parser = ::Proc.new { |str_| ::ActiveSupport::JSON.decode(str_) }
|
89
83
|
else
|
90
84
|
raise Error::RGeoError, "ActiveSupport::JSON library is not available. You may need to install the 'activesupport' gem."
|
91
85
|
end
|
@@ -99,7 +93,6 @@ module RGeo
|
|
99
93
|
@num_coordinates += 1 if @geo_factory.property(:has_m_coordinate)
|
100
94
|
end
|
101
95
|
|
102
|
-
|
103
96
|
# Encode the given object as GeoJSON. The object may be one of the
|
104
97
|
# geometry objects specified in RGeo::Feature, or an appropriate
|
105
98
|
# GeoJSON wrapper entity supported by this coder's entity factory.
|
@@ -115,8 +108,8 @@ module RGeo
|
|
115
108
|
def encode(object_)
|
116
109
|
if @entity_factory.is_feature_collection?(object_)
|
117
110
|
{
|
118
|
-
|
119
|
-
|
111
|
+
"type" => "FeatureCollection",
|
112
|
+
"features" => @entity_factory.map_feature_collection(object_) { |f_| _encode_feature(f_) },
|
120
113
|
}
|
121
114
|
elsif @entity_factory.is_feature?(object_)
|
122
115
|
_encode_feature(object_)
|
@@ -127,7 +120,6 @@ module RGeo
|
|
127
120
|
end
|
128
121
|
end
|
129
122
|
|
130
|
-
|
131
123
|
# Decode an object from GeoJSON. The input may be a JSON hash, a
|
132
124
|
# String, or an IO object from which to read the JSON string.
|
133
125
|
# If an error occurs, nil is returned.
|
@@ -142,144 +134,133 @@ module RGeo
|
|
142
134
|
unless input_.kind_of?(::Hash)
|
143
135
|
return nil
|
144
136
|
end
|
145
|
-
case input_[
|
146
|
-
when
|
147
|
-
features_ = input_[
|
137
|
+
case input_["type"]
|
138
|
+
when "FeatureCollection"
|
139
|
+
features_ = input_["features"]
|
148
140
|
features_ = [] unless features_.kind_of?(::Array)
|
149
141
|
decoded_features_ = []
|
150
142
|
features_.each do |f_|
|
151
|
-
if f_[
|
143
|
+
if f_["type"] == "Feature"
|
152
144
|
decoded_features_ << _decode_feature(f_)
|
153
145
|
end
|
154
146
|
end
|
155
147
|
@entity_factory.feature_collection(decoded_features_)
|
156
|
-
when
|
148
|
+
when "Feature"
|
157
149
|
_decode_feature(input_)
|
158
150
|
else
|
159
151
|
_decode_geometry(input_)
|
160
152
|
end
|
161
153
|
end
|
162
154
|
|
163
|
-
|
164
155
|
# Returns the RGeo::Feature::Factory used to generate geometry objects.
|
165
156
|
|
166
|
-
|
167
|
-
@geo_factory
|
168
|
-
end
|
169
|
-
|
157
|
+
attr_reader :geo_factory
|
170
158
|
|
171
159
|
# Returns the RGeo::GeoJSON::EntityFactory used to generate GeoJSON
|
172
160
|
# wrapper entities.
|
173
161
|
|
174
|
-
|
175
|
-
@entity_factory
|
176
|
-
end
|
177
|
-
|
162
|
+
attr_reader :entity_factory
|
178
163
|
|
179
|
-
def _encode_feature(object_)
|
164
|
+
def _encode_feature(object_) # :nodoc:
|
180
165
|
json_ = {
|
181
|
-
|
182
|
-
|
183
|
-
|
166
|
+
"type" => "Feature",
|
167
|
+
"geometry" => _encode_geometry(@entity_factory.get_feature_geometry(object_)),
|
168
|
+
"properties" => @entity_factory.get_feature_properties(object_).dup,
|
184
169
|
}
|
185
170
|
id_ = @entity_factory.get_feature_id(object_)
|
186
|
-
json_[
|
171
|
+
json_["id"] = id_ if id_
|
187
172
|
json_
|
188
173
|
end
|
189
174
|
|
190
|
-
|
191
|
-
def _encode_geometry(object_, point_encoder_=nil) # :nodoc:
|
175
|
+
def _encode_geometry(object_, point_encoder_ = nil) # :nodoc:
|
192
176
|
unless point_encoder_
|
193
177
|
if object_.factory.property(:has_z_coordinate)
|
194
178
|
if object_.factory.property(:has_m_coordinate)
|
195
|
-
point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y, p_.z, p_.m] }
|
179
|
+
point_encoder_ = ::Proc.new { |p_| [p_.x, p_.y, p_.z, p_.m] }
|
196
180
|
else
|
197
|
-
point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y, p_.z] }
|
181
|
+
point_encoder_ = ::Proc.new { |p_| [p_.x, p_.y, p_.z] }
|
198
182
|
end
|
199
183
|
else
|
200
184
|
if object_.factory.property(:has_m_coordinate)
|
201
|
-
point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y, p_.m] }
|
185
|
+
point_encoder_ = ::Proc.new { |p_| [p_.x, p_.y, p_.m] }
|
202
186
|
else
|
203
|
-
point_encoder_ = ::Proc.new{ |p_| [p_.x, p_.y] }
|
187
|
+
point_encoder_ = ::Proc.new { |p_| [p_.x, p_.y] }
|
204
188
|
end
|
205
189
|
end
|
206
190
|
end
|
207
191
|
case object_
|
208
192
|
when ::RGeo::Feature::Point
|
209
193
|
{
|
210
|
-
|
211
|
-
|
194
|
+
"type" => "Point",
|
195
|
+
"coordinates" => object_.coordinates
|
212
196
|
}
|
213
197
|
when ::RGeo::Feature::LineString
|
214
198
|
{
|
215
|
-
|
216
|
-
|
199
|
+
"type" => "LineString",
|
200
|
+
"coordinates" => object_.coordinates
|
217
201
|
}
|
218
202
|
when ::RGeo::Feature::Polygon
|
219
203
|
{
|
220
|
-
|
221
|
-
|
204
|
+
"type" => "Polygon",
|
205
|
+
"coordinates" => object_.coordinates
|
222
206
|
}
|
223
207
|
when ::RGeo::Feature::MultiPoint
|
224
208
|
{
|
225
|
-
|
226
|
-
|
209
|
+
"type" => "MultiPoint",
|
210
|
+
"coordinates" => object_.coordinates
|
227
211
|
}
|
228
212
|
when ::RGeo::Feature::MultiLineString
|
229
213
|
{
|
230
|
-
|
231
|
-
|
214
|
+
"type" => "MultiLineString",
|
215
|
+
"coordinates" => object_.coordinates
|
232
216
|
}
|
233
217
|
when ::RGeo::Feature::MultiPolygon
|
234
218
|
{
|
235
|
-
|
236
|
-
|
219
|
+
"type" => "MultiPolygon",
|
220
|
+
"coordinates" => object_.coordinates
|
237
221
|
}
|
238
222
|
when ::RGeo::Feature::GeometryCollection
|
239
223
|
{
|
240
|
-
|
241
|
-
|
224
|
+
"type" => "GeometryCollection",
|
225
|
+
"geometries" => object_.map { |geom_| _encode_geometry(geom_, point_encoder_) },
|
242
226
|
}
|
243
227
|
else
|
244
228
|
nil
|
245
229
|
end
|
246
230
|
end
|
247
231
|
|
248
|
-
|
249
|
-
|
250
|
-
geometry_ = input_['geometry']
|
232
|
+
def _decode_feature(input_) # :nodoc:
|
233
|
+
geometry_ = input_["geometry"]
|
251
234
|
if geometry_
|
252
235
|
geometry_ = _decode_geometry(geometry_)
|
253
236
|
return nil unless geometry_
|
254
237
|
end
|
255
|
-
@entity_factory.feature(geometry_, input_[
|
238
|
+
@entity_factory.feature(geometry_, input_["id"], input_["properties"])
|
256
239
|
end
|
257
240
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
when 'GeometryCollection'
|
241
|
+
def _decode_geometry(input_) # :nodoc:
|
242
|
+
case input_["type"]
|
243
|
+
when "GeometryCollection"
|
262
244
|
_decode_geometry_collection(input_)
|
263
|
-
when
|
264
|
-
_decode_point_coords(input_[
|
265
|
-
when
|
266
|
-
_decode_line_string_coords(input_[
|
267
|
-
when
|
268
|
-
_decode_polygon_coords(input_[
|
269
|
-
when
|
270
|
-
_decode_multi_point_coords(input_[
|
271
|
-
when
|
272
|
-
_decode_multi_line_string_coords(input_[
|
273
|
-
when
|
274
|
-
_decode_multi_polygon_coords(input_[
|
245
|
+
when "Point"
|
246
|
+
_decode_point_coords(input_["coordinates"])
|
247
|
+
when "LineString"
|
248
|
+
_decode_line_string_coords(input_["coordinates"])
|
249
|
+
when "Polygon"
|
250
|
+
_decode_polygon_coords(input_["coordinates"])
|
251
|
+
when "MultiPoint"
|
252
|
+
_decode_multi_point_coords(input_["coordinates"])
|
253
|
+
when "MultiLineString"
|
254
|
+
_decode_multi_line_string_coords(input_["coordinates"])
|
255
|
+
when "MultiPolygon"
|
256
|
+
_decode_multi_polygon_coords(input_["coordinates"])
|
275
257
|
else
|
276
258
|
nil
|
277
259
|
end
|
278
260
|
end
|
279
261
|
|
280
|
-
|
281
262
|
def _decode_geometry_collection(input_) # :nodoc:
|
282
|
-
geometries_ = input_[
|
263
|
+
geometries_ = input_["geometries"]
|
283
264
|
geometries_ = [] unless geometries_.kind_of?(::Array)
|
284
265
|
decoded_geometries_ = []
|
285
266
|
geometries_.each do |g_|
|
@@ -289,14 +270,12 @@ module RGeo
|
|
289
270
|
@geo_factory.collection(decoded_geometries_)
|
290
271
|
end
|
291
272
|
|
292
|
-
|
293
273
|
def _decode_point_coords(point_coords_) # :nodoc:
|
294
274
|
return nil unless point_coords_.kind_of?(::Array)
|
295
|
-
@geo_factory.point(*(point_coords_[0...@num_coordinates].map
|
275
|
+
@geo_factory.point(*(point_coords_[0...@num_coordinates].map(&:to_f))) rescue nil
|
296
276
|
end
|
297
277
|
|
298
|
-
|
299
|
-
def _decode_line_string_coords(line_coords_) # :nodoc:
|
278
|
+
def _decode_line_string_coords(line_coords_) # :nodoc:
|
300
279
|
return nil unless line_coords_.kind_of?(::Array)
|
301
280
|
points_ = []
|
302
281
|
line_coords_.each do |point_coords_|
|
@@ -306,8 +285,7 @@ module RGeo
|
|
306
285
|
@geo_factory.line_string(points_)
|
307
286
|
end
|
308
287
|
|
309
|
-
|
310
|
-
def _decode_polygon_coords(poly_coords_) # :nodoc:
|
288
|
+
def _decode_polygon_coords(poly_coords_) # :nodoc:
|
311
289
|
return nil unless poly_coords_.kind_of?(::Array)
|
312
290
|
rings_ = []
|
313
291
|
poly_coords_.each do |ring_coords_|
|
@@ -327,8 +305,7 @@ module RGeo
|
|
327
305
|
end
|
328
306
|
end
|
329
307
|
|
330
|
-
|
331
|
-
def _decode_multi_point_coords(multi_point_coords_) # :nodoc:
|
308
|
+
def _decode_multi_point_coords(multi_point_coords_) # :nodoc:
|
332
309
|
return nil unless multi_point_coords_.kind_of?(::Array)
|
333
310
|
points_ = []
|
334
311
|
multi_point_coords_.each do |point_coords_|
|
@@ -338,8 +315,7 @@ module RGeo
|
|
338
315
|
@geo_factory.multi_point(points_)
|
339
316
|
end
|
340
317
|
|
341
|
-
|
342
|
-
def _decode_multi_line_string_coords(multi_line_coords_) # :nodoc:
|
318
|
+
def _decode_multi_line_string_coords(multi_line_coords_) # :nodoc:
|
343
319
|
return nil unless multi_line_coords_.kind_of?(::Array)
|
344
320
|
lines_ = []
|
345
321
|
multi_line_coords_.each do |line_coords_|
|
@@ -349,8 +325,7 @@ module RGeo
|
|
349
325
|
@geo_factory.multi_line_string(lines_)
|
350
326
|
end
|
351
327
|
|
352
|
-
|
353
|
-
def _decode_multi_polygon_coords(multi_polygon_coords_) # :nodoc:
|
328
|
+
def _decode_multi_polygon_coords(multi_polygon_coords_) # :nodoc:
|
354
329
|
return nil unless multi_polygon_coords_.kind_of?(::Array)
|
355
330
|
polygons_ = []
|
356
331
|
multi_polygon_coords_.each do |poly_coords_|
|
@@ -359,11 +334,6 @@ module RGeo
|
|
359
334
|
end
|
360
335
|
@geo_factory.multi_polygon(polygons_)
|
361
336
|
end
|
362
|
-
|
363
|
-
|
364
337
|
end
|
365
|
-
|
366
|
-
|
367
338
|
end
|
368
|
-
|
369
339
|
end
|
@@ -1,8 +1,5 @@
|
|
1
1
|
module RGeo
|
2
|
-
|
3
2
|
module GeoJSON
|
4
|
-
|
5
|
-
|
6
3
|
# This is a GeoJSON wrapper entity that corresponds to the GeoJSON
|
7
4
|
# "Feature" type. It is an immutable type.
|
8
5
|
#
|
@@ -14,12 +11,10 @@ module RGeo
|
|
14
11
|
# engine and features.
|
15
12
|
|
16
13
|
class Feature
|
17
|
-
|
18
|
-
|
19
14
|
# Create a feature wrapping the given geometry, with the given ID
|
20
15
|
# and properties.
|
21
16
|
|
22
|
-
def initialize(geometry_, id_=nil, properties_={})
|
17
|
+
def initialize(geometry_, id_ = nil, properties_ = {})
|
23
18
|
@geometry = geometry_
|
24
19
|
@id = id_
|
25
20
|
@properties = {}
|
@@ -28,8 +23,7 @@ module RGeo
|
|
28
23
|
end
|
29
24
|
end
|
30
25
|
|
31
|
-
|
32
|
-
def inspect # :nodoc:
|
26
|
+
def inspect # :nodoc:
|
33
27
|
"#<#{self.class}:0x#{object_id.to_s(16)} id=#{@id.inspect} geom=#{@geometry ? @geometry.as_text.inspect : 'nil'}>"
|
34
28
|
end
|
35
29
|
|
@@ -41,7 +35,6 @@ module RGeo
|
|
41
35
|
@geometry.hash + @id.hash + @properties.hash
|
42
36
|
end
|
43
37
|
|
44
|
-
|
45
38
|
# Two features are equal if their geometries, IDs, and properties
|
46
39
|
# are all equal.
|
47
40
|
# This method uses the eql? method to test geometry equality, which
|
@@ -51,7 +44,6 @@ module RGeo
|
|
51
44
|
rhs_.kind_of?(Feature) && @geometry.eql?(rhs_.geometry) && @id.eql?(rhs_.feature_id) && @properties.eql?(rhs_.instance_variable_get(:@properties))
|
52
45
|
end
|
53
46
|
|
54
|
-
|
55
47
|
# Two features are equal if their geometries, IDs, and properties
|
56
48
|
# are all equal.
|
57
49
|
# This method uses the == operator to test geometry equality, which
|
@@ -61,13 +53,9 @@ module RGeo
|
|
61
53
|
rhs_.kind_of?(Feature) && @geometry == rhs_.geometry && @id == rhs_.feature_id && @properties == rhs_.instance_variable_get(:@properties)
|
62
54
|
end
|
63
55
|
|
64
|
-
|
65
56
|
# Returns the geometry contained in this feature, which may be nil.
|
66
57
|
|
67
|
-
|
68
|
-
@geometry
|
69
|
-
end
|
70
|
-
|
58
|
+
attr_reader :geometry
|
71
59
|
|
72
60
|
# Returns the ID for this feature, which may be nil.
|
73
61
|
|
@@ -75,14 +63,12 @@ module RGeo
|
|
75
63
|
@id
|
76
64
|
end
|
77
65
|
|
78
|
-
|
79
66
|
# Returns a copy of the properties for this feature.
|
80
67
|
|
81
68
|
def properties
|
82
69
|
@properties.dup
|
83
70
|
end
|
84
71
|
|
85
|
-
|
86
72
|
# Gets the value of the given named property.
|
87
73
|
# Returns nil if the given property is not found.
|
88
74
|
|
@@ -91,17 +77,13 @@ module RGeo
|
|
91
77
|
end
|
92
78
|
alias_method :[], :property
|
93
79
|
|
94
|
-
|
95
80
|
# Gets an array of the known property keys in this feature.
|
96
81
|
|
97
82
|
def keys
|
98
83
|
@properties.keys
|
99
84
|
end
|
100
|
-
|
101
|
-
|
102
85
|
end
|
103
86
|
|
104
|
-
|
105
87
|
# This is a GeoJSON wrapper entity that corresponds to the GeoJSON
|
106
88
|
# "FeatureCollection" type. It is an immutable type.
|
107
89
|
#
|
@@ -113,20 +95,17 @@ module RGeo
|
|
113
95
|
# between the GeoJSON engine and feature collections.
|
114
96
|
|
115
97
|
class FeatureCollection
|
116
|
-
|
117
98
|
include ::Enumerable
|
118
99
|
|
119
|
-
|
120
100
|
# Create a new FeatureCollection with the given features, which must
|
121
101
|
# be provided as an Enumerable.
|
122
102
|
|
123
|
-
def initialize(features_=[])
|
103
|
+
def initialize(features_ = [])
|
124
104
|
@features = []
|
125
|
-
features_.each{ |f_| @features << f_ if f_.kind_of?(Feature) }
|
105
|
+
features_.each { |f_| @features << f_ if f_.kind_of?(Feature) }
|
126
106
|
end
|
127
107
|
|
128
|
-
|
129
|
-
def inspect # :nodoc:
|
108
|
+
def inspect # :nodoc:
|
130
109
|
"#<#{self.class}:0x#{object_id.to_s(16)}>"
|
131
110
|
end
|
132
111
|
|
@@ -138,7 +117,6 @@ module RGeo
|
|
138
117
|
@features.hash
|
139
118
|
end
|
140
119
|
|
141
|
-
|
142
120
|
# Two feature collections are equal if they contain the same
|
143
121
|
# features in the same order.
|
144
122
|
# This methods uses the eql? method to test geometry equality, which
|
@@ -148,7 +126,6 @@ module RGeo
|
|
148
126
|
rhs_.kind_of?(FeatureCollection) && @features.eql?(rhs_.instance_variable_get(:@features))
|
149
127
|
end
|
150
128
|
|
151
|
-
|
152
129
|
# Two feature collections are equal if they contain the same
|
153
130
|
# features in the same order.
|
154
131
|
# This methods uses the == operator to test geometry equality, which
|
@@ -158,55 +135,45 @@ module RGeo
|
|
158
135
|
rhs_.kind_of?(FeatureCollection) && @features == rhs_.instance_variable_get(:@features)
|
159
136
|
end
|
160
137
|
|
161
|
-
|
162
138
|
# Iterates or returns an iterator for the features.
|
163
139
|
|
164
140
|
def each(&block_)
|
165
141
|
@features.each(&block_)
|
166
142
|
end
|
167
143
|
|
168
|
-
|
169
144
|
# Returns the number of features contained in this collection.
|
170
145
|
|
171
146
|
def size
|
172
147
|
@features.size
|
173
148
|
end
|
174
149
|
|
175
|
-
|
176
150
|
# Access a feature by index.
|
177
151
|
|
178
152
|
def [](index_)
|
179
153
|
@features[index_]
|
180
154
|
end
|
181
|
-
|
182
|
-
|
183
155
|
end
|
184
156
|
|
185
|
-
|
186
157
|
# This is the default entity factory. It creates objects of type
|
187
158
|
# RGeo::GeoJSON::Feature and RGeo::GeoJSON::FeatureCollection.
|
188
159
|
# You may create your own entity factory by duck-typing this class.
|
189
160
|
|
190
161
|
class EntityFactory
|
191
|
-
|
192
|
-
|
193
162
|
# Create and return a new feature, given geometry, ID, and
|
194
163
|
# properties hash. Note that, per the GeoJSON spec, geometry and/or
|
195
164
|
# properties may be nil.
|
196
165
|
|
197
|
-
def feature(geometry_, id_=nil, properties_=nil)
|
166
|
+
def feature(geometry_, id_ = nil, properties_ = nil)
|
198
167
|
Feature.new(geometry_, id_, properties_ || {})
|
199
168
|
end
|
200
169
|
|
201
|
-
|
202
170
|
# Create and return a new feature collection, given an enumerable
|
203
171
|
# of feature objects.
|
204
172
|
|
205
|
-
def feature_collection(features_=[])
|
173
|
+
def feature_collection(features_ = [])
|
206
174
|
FeatureCollection.new(features_)
|
207
175
|
end
|
208
176
|
|
209
|
-
|
210
177
|
# Returns true if the given object is a feature created by this
|
211
178
|
# entity factory.
|
212
179
|
|
@@ -214,7 +181,6 @@ module RGeo
|
|
214
181
|
object_.kind_of?(Feature)
|
215
182
|
end
|
216
183
|
|
217
|
-
|
218
184
|
# Returns true if the given object is a feature collection created
|
219
185
|
# by this entity factory.
|
220
186
|
|
@@ -222,7 +188,6 @@ module RGeo
|
|
222
188
|
object_.kind_of?(FeatureCollection)
|
223
189
|
end
|
224
190
|
|
225
|
-
|
226
191
|
# Run Enumerable#map on the features contained in the given feature
|
227
192
|
# collection.
|
228
193
|
|
@@ -230,21 +195,18 @@ module RGeo
|
|
230
195
|
object_.map(&block_)
|
231
196
|
end
|
232
197
|
|
233
|
-
|
234
198
|
# Returns the geometry associated with the given feature.
|
235
199
|
|
236
200
|
def get_feature_geometry(object_)
|
237
201
|
object_.geometry
|
238
202
|
end
|
239
203
|
|
240
|
-
|
241
204
|
# Returns the ID of the given feature, or nil for no ID.
|
242
205
|
|
243
206
|
def get_feature_id(object_)
|
244
207
|
object_.feature_id
|
245
208
|
end
|
246
209
|
|
247
|
-
|
248
210
|
# Returns the properties of the given feature as a hash. Editing
|
249
211
|
# this hash does not change the state of the feature.
|
250
212
|
|
@@ -252,17 +214,11 @@ module RGeo
|
|
252
214
|
object_.properties
|
253
215
|
end
|
254
216
|
|
255
|
-
|
256
217
|
# Return the singleton instance of EntityFactory.
|
257
218
|
|
258
219
|
def self.instance
|
259
|
-
@instance ||=
|
220
|
+
@instance ||= new
|
260
221
|
end
|
261
|
-
|
262
|
-
|
263
222
|
end
|
264
|
-
|
265
|
-
|
266
223
|
end
|
267
|
-
|
268
224
|
end
|
@@ -1,10 +1,6 @@
|
|
1
1
|
module RGeo
|
2
|
-
|
3
2
|
module GeoJSON
|
4
|
-
|
5
3
|
class << self
|
6
|
-
|
7
|
-
|
8
4
|
# High-level convenience routine for encoding an object as GeoJSON.
|
9
5
|
# Pass the object, which may one of the geometry objects specified
|
10
6
|
# in RGeo::Feature, or an appropriate GeoJSON wrapper entity such
|
@@ -16,11 +12,10 @@ module RGeo
|
|
16
12
|
# encode supports objects of type RGeo::GeoJSON::Feature and
|
17
13
|
# RGeo::GeoJSON::FeatureCollection.
|
18
14
|
|
19
|
-
def encode(object_, opts_={})
|
15
|
+
def encode(object_, opts_ = {})
|
20
16
|
Coder.new(opts_).encode(object_)
|
21
17
|
end
|
22
18
|
|
23
|
-
|
24
19
|
# High-level convenience routine for decoding an object from GeoJSON.
|
25
20
|
# The input may be a JSON hash, a String, or an IO object from which
|
26
21
|
# to read the JSON string.
|
@@ -48,11 +43,10 @@ module RGeo
|
|
48
43
|
# If a parser is not specified, then the decode method will not
|
49
44
|
# accept a String or IO object; it will require a Hash.
|
50
45
|
|
51
|
-
def decode(input_, opts_={})
|
46
|
+
def decode(input_, opts_ = {})
|
52
47
|
Coder.new(opts_).decode(input_)
|
53
48
|
end
|
54
49
|
|
55
|
-
|
56
50
|
# Creates and returns a coder object of type RGeo::GeoJSON::Coder
|
57
51
|
# that encapsulates encoding and decoding settings (principally the
|
58
52
|
# RGeo::Feature::Factory and the RGeo::GeoJSON::EntityFactory to be
|
@@ -81,13 +75,9 @@ module RGeo
|
|
81
75
|
# If a parser is not specified, then the decode method will not
|
82
76
|
# accept a String or IO object; it will require a Hash.
|
83
77
|
|
84
|
-
def coder(opts_={})
|
78
|
+
def coder(opts_ = {})
|
85
79
|
Coder.new(opts_)
|
86
80
|
end
|
87
|
-
|
88
|
-
|
89
81
|
end
|
90
|
-
|
91
82
|
end
|
92
|
-
|
93
83
|
end
|
data/lib/rgeo/geo_json.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require "rgeo"
|
3
2
|
|
4
3
|
# RGeo is a spatial data library for Ruby, provided by the "rgeo" gem.
|
5
4
|
#
|
@@ -7,20 +6,15 @@ require 'rgeo'
|
|
7
6
|
# encoding and decoding.
|
8
7
|
|
9
8
|
module RGeo
|
10
|
-
|
11
|
-
|
12
9
|
# This is a namespace for a set of tools that provide GeoJSON encoding.
|
13
10
|
# See http://geojson.org/ for more information about this specification.
|
14
11
|
|
15
12
|
module GeoJSON
|
16
13
|
end
|
17
|
-
|
18
|
-
|
19
14
|
end
|
20
15
|
|
21
|
-
|
22
16
|
# Implementation files
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
17
|
+
require "rgeo/geo_json/version"
|
18
|
+
require "rgeo/geo_json/entities"
|
19
|
+
require "rgeo/geo_json/coder"
|
20
|
+
require "rgeo/geo_json/interface"
|
data/lib/rgeo-geojson.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require "rgeo/geo_json"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rgeo-geojson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Azuma
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-12-
|
12
|
+
date: 2015-12-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rgeo
|
@@ -67,10 +67,8 @@ dependencies:
|
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '10.4'
|
70
|
-
description: RGeo
|
71
|
-
|
72
|
-
used to communicate with location-based web services that understand the GeoJSON
|
73
|
-
format.
|
70
|
+
description: Convert RGeo data to and from GeoJSON. rgeo-geojson is an extension to
|
71
|
+
the rgeo gem that converts RGeo data types to and from GeoJSON.
|
74
72
|
email:
|
75
73
|
- dazuma@gmail.com
|
76
74
|
- parhameter@gmail.com
|
@@ -87,8 +85,7 @@ files:
|
|
87
85
|
- lib/rgeo/geo_json/entities.rb
|
88
86
|
- lib/rgeo/geo_json/interface.rb
|
89
87
|
- lib/rgeo/geo_json/version.rb
|
90
|
-
|
91
|
-
homepage: http://github.com/rgeo/rgeo-geojson
|
88
|
+
homepage: https://github.com/rgeo/rgeo-geojson
|
92
89
|
licenses:
|
93
90
|
- BSD
|
94
91
|
metadata: {}
|
@@ -108,9 +105,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
105
|
version: '0'
|
109
106
|
requirements: []
|
110
107
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.5.
|
108
|
+
rubygems_version: 2.5.1
|
112
109
|
signing_key:
|
113
110
|
specification_version: 4
|
114
|
-
summary:
|
115
|
-
test_files:
|
116
|
-
|
111
|
+
summary: Convert RGeo data to and from GeoJSON.
|
112
|
+
test_files: []
|
113
|
+
has_rdoc:
|
data/test/basic_test.rb
DELETED
@@ -1,273 +0,0 @@
|
|
1
|
-
require 'minitest/autorun'
|
2
|
-
require 'rgeo/geo_json'
|
3
|
-
|
4
|
-
module RGeo
|
5
|
-
module GeoJSON
|
6
|
-
module Tests # :nodoc:
|
7
|
-
|
8
|
-
class BasicTest < Minitest::Test # :nodoc:
|
9
|
-
|
10
|
-
|
11
|
-
def setup
|
12
|
-
@geo_factory = ::RGeo::Cartesian.simple_factory(:srid => 4326)
|
13
|
-
@geo_factory_z = ::RGeo::Cartesian.simple_factory(:srid => 4326, :has_z_coordinate => true)
|
14
|
-
@geo_factory_m = ::RGeo::Cartesian.simple_factory(:srid => 4326, :has_m_coordinate => true)
|
15
|
-
@geo_factory_zm = ::RGeo::Cartesian.simple_factory(:srid => 4326, :has_z_coordinate => true, :has_m_coordinate => true)
|
16
|
-
@entity_factory = ::RGeo::GeoJSON::EntityFactory.instance
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
def test_has_version
|
21
|
-
refute_nil(::RGeo::GeoJSON::VERSION)
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def test_nil
|
26
|
-
assert_nil(::RGeo::GeoJSON.encode(nil))
|
27
|
-
assert_nil(::RGeo::GeoJSON.decode(nil, :geo_factory => @geo_factory))
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
def test_point
|
32
|
-
object_ = @geo_factory.point(10, 20)
|
33
|
-
json_ = {
|
34
|
-
'type' => 'Point',
|
35
|
-
'coordinates' => [10.0, 20.0],
|
36
|
-
}
|
37
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
38
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
def test_point_z
|
43
|
-
object_ = @geo_factory_z.point(10, 20, -1)
|
44
|
-
json_ = {
|
45
|
-
'type' => 'Point',
|
46
|
-
'coordinates' => [10.0, 20.0, -1.0],
|
47
|
-
}
|
48
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
49
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory_z).eql?(object_))
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
def test_point_m
|
54
|
-
object_ = @geo_factory_m.point(10, 20, -1)
|
55
|
-
json_ = {
|
56
|
-
'type' => 'Point',
|
57
|
-
'coordinates' => [10.0, 20.0, -1.0],
|
58
|
-
}
|
59
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
60
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory_m).eql?(object_))
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
|
-
def test_point_zm
|
65
|
-
object_ = @geo_factory_zm.point(10, 20, -1, -2)
|
66
|
-
json_ = {
|
67
|
-
'type' => 'Point',
|
68
|
-
'coordinates' => [10.0, 20.0, -1.0, -2.0],
|
69
|
-
}
|
70
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
71
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory_zm).eql?(object_))
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
|
-
def test_line_string
|
76
|
-
object_ = @geo_factory.line_string([@geo_factory.point(10, 20), @geo_factory.point(12, 22), @geo_factory.point(-3, 24)])
|
77
|
-
json_ = {
|
78
|
-
'type' => 'LineString',
|
79
|
-
'coordinates' => [[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0]],
|
80
|
-
}
|
81
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
82
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
def test_polygon
|
87
|
-
object_ = @geo_factory.polygon(@geo_factory.linear_ring([@geo_factory.point(10, 20), @geo_factory.point(12, 22), @geo_factory.point(-3, 24), @geo_factory.point(10, 20)]))
|
88
|
-
json_ = {
|
89
|
-
'type' => 'Polygon',
|
90
|
-
'coordinates' => [[[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0], [10.0, 20.0]]],
|
91
|
-
}
|
92
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
93
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
def test_polygon_complex
|
98
|
-
object_ = @geo_factory.polygon(@geo_factory.linear_ring([@geo_factory.point(0, 0), @geo_factory.point(10, 0), @geo_factory.point(10, 10), @geo_factory.point(0, 10), @geo_factory.point(0, 0)]), [@geo_factory.linear_ring([@geo_factory.point(4, 4), @geo_factory.point(6, 5), @geo_factory.point(4, 6), @geo_factory.point(4, 4)])])
|
99
|
-
json_ = {
|
100
|
-
'type' => 'Polygon',
|
101
|
-
'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]]],
|
102
|
-
}
|
103
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
104
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
105
|
-
end
|
106
|
-
|
107
|
-
|
108
|
-
def test_multi_point
|
109
|
-
object_ = @geo_factory.multi_point([@geo_factory.point(10, 20), @geo_factory.point(12, 22), @geo_factory.point(-3, 24)])
|
110
|
-
json_ = {
|
111
|
-
'type' => 'MultiPoint',
|
112
|
-
'coordinates' => [[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0]],
|
113
|
-
}
|
114
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
115
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
116
|
-
end
|
117
|
-
|
118
|
-
|
119
|
-
def test_multi_line_string
|
120
|
-
object_ = @geo_factory.multi_line_string([@geo_factory.line_string([@geo_factory.point(10, 20), @geo_factory.point(12, 22), @geo_factory.point(-3, 24)]), @geo_factory.line_string([@geo_factory.point(1, 2), @geo_factory.point(3, 4)])])
|
121
|
-
json_ = {
|
122
|
-
'type' => 'MultiLineString',
|
123
|
-
'coordinates' => [[[10.0, 20.0], [12.0, 22.0], [-3.0, 24.0]], [[1.0, 2.0], [3.0, 4.0]]],
|
124
|
-
}
|
125
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
126
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
def test_multi_polygon
|
131
|
-
object_ = @geo_factory.multi_polygon([@geo_factory.polygon(@geo_factory.linear_ring([@geo_factory.point(0, 0), @geo_factory.point(10, 0), @geo_factory.point(10, 10), @geo_factory.point(0, 10), @geo_factory.point(0, 0)]), [@geo_factory.linear_ring([@geo_factory.point(4, 4), @geo_factory.point(6, 5), @geo_factory.point(4, 6), @geo_factory.point(4, 4)])]), @geo_factory.polygon(@geo_factory.linear_ring([@geo_factory.point(-10,-10), @geo_factory.point(-15, -10), @geo_factory.point(-10, -15), @geo_factory.point(-10, -10)]))])
|
132
|
-
json_ = {
|
133
|
-
'type' => 'MultiPolygon',
|
134
|
-
'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]]]]
|
135
|
-
}
|
136
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
137
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
138
|
-
end
|
139
|
-
|
140
|
-
|
141
|
-
def test_geometry_collection
|
142
|
-
object_ = @geo_factory.collection([@geo_factory.point(10, 20), @geo_factory.collection([@geo_factory.point(12, 22), @geo_factory.point(-3, 24)])])
|
143
|
-
json_ = {
|
144
|
-
'type' => 'GeometryCollection',
|
145
|
-
'geometries' => [
|
146
|
-
{
|
147
|
-
'type' => 'Point',
|
148
|
-
'coordinates' => [10.0, 20.0],
|
149
|
-
},
|
150
|
-
{
|
151
|
-
'type' => 'GeometryCollection',
|
152
|
-
'geometries' => [
|
153
|
-
{
|
154
|
-
'type' => 'Point',
|
155
|
-
'coordinates' => [12.0, 22.0],
|
156
|
-
},
|
157
|
-
{
|
158
|
-
'type' => 'Point',
|
159
|
-
'coordinates' => [-3.0, 24.0],
|
160
|
-
},
|
161
|
-
],
|
162
|
-
},
|
163
|
-
],
|
164
|
-
}
|
165
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
166
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
167
|
-
end
|
168
|
-
|
169
|
-
|
170
|
-
def test_feature
|
171
|
-
object_ = @entity_factory.feature(@geo_factory.point(10, 20))
|
172
|
-
json_ = {
|
173
|
-
'type' => 'Feature',
|
174
|
-
'geometry' => {
|
175
|
-
'type' => 'Point',
|
176
|
-
'coordinates' => [10.0, 20.0],
|
177
|
-
},
|
178
|
-
'properties' => {},
|
179
|
-
}
|
180
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
181
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
182
|
-
end
|
183
|
-
|
184
|
-
|
185
|
-
def test_feature_nulls
|
186
|
-
json_ = {
|
187
|
-
'type' => 'Feature',
|
188
|
-
'geometry' => nil,
|
189
|
-
'properties' => nil,
|
190
|
-
}
|
191
|
-
obj_ = ::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory)
|
192
|
-
refute_nil(obj_)
|
193
|
-
assert_nil(obj_.geometry)
|
194
|
-
assert_equal({}, obj_.properties)
|
195
|
-
end
|
196
|
-
|
197
|
-
|
198
|
-
def test_feature_complex
|
199
|
-
object_ = @entity_factory.feature(@geo_factory.point(10, 20), 2, {'prop1' => 'foo', 'prop2' => 'bar'})
|
200
|
-
json_ = {
|
201
|
-
'type' => 'Feature',
|
202
|
-
'geometry' => {
|
203
|
-
'type' => 'Point',
|
204
|
-
'coordinates' => [10.0, 20.0],
|
205
|
-
},
|
206
|
-
'id' => 2,
|
207
|
-
'properties' => {'prop1' => 'foo', 'prop2' => 'bar'},
|
208
|
-
}
|
209
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
210
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
211
|
-
end
|
212
|
-
|
213
|
-
|
214
|
-
def test_feature_with_symbol_prop_keys
|
215
|
-
object_ = @entity_factory.feature(@geo_factory.point(10, 20), 2, {:prop1 => 'foo', 'prop2' => 'bar'})
|
216
|
-
json_ = {
|
217
|
-
'type' => 'Feature',
|
218
|
-
'geometry' => {
|
219
|
-
'type' => 'Point',
|
220
|
-
'coordinates' => [10.0, 20.0],
|
221
|
-
},
|
222
|
-
'id' => 2,
|
223
|
-
'properties' => {'prop1' => 'foo', 'prop2' => 'bar'},
|
224
|
-
}
|
225
|
-
assert_equal('foo', object_.property('prop1'))
|
226
|
-
assert_equal('bar', object_.property(:prop2))
|
227
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
228
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
229
|
-
end
|
230
|
-
|
231
|
-
|
232
|
-
def test_feature_collection
|
233
|
-
object_ = @entity_factory.feature_collection([@entity_factory.feature(@geo_factory.point(10, 20)), @entity_factory.feature(@geo_factory.point(11, 22)), @entity_factory.feature(@geo_factory.point(10, 20), 8)])
|
234
|
-
json_ = {
|
235
|
-
'type' => 'FeatureCollection',
|
236
|
-
'features' => [
|
237
|
-
{
|
238
|
-
'type' => 'Feature',
|
239
|
-
'geometry' => {
|
240
|
-
'type' => 'Point',
|
241
|
-
'coordinates' => [10.0, 20.0],
|
242
|
-
},
|
243
|
-
'properties' => {},
|
244
|
-
},
|
245
|
-
{
|
246
|
-
'type' => 'Feature',
|
247
|
-
'geometry' => {
|
248
|
-
'type' => 'Point',
|
249
|
-
'coordinates' => [11.0, 22.0],
|
250
|
-
},
|
251
|
-
'properties' => {},
|
252
|
-
},
|
253
|
-
{
|
254
|
-
'type' => 'Feature',
|
255
|
-
'geometry' => {
|
256
|
-
'type' => 'Point',
|
257
|
-
'coordinates' => [10.0, 20.0],
|
258
|
-
},
|
259
|
-
'id' => 8,
|
260
|
-
'properties' => {},
|
261
|
-
},
|
262
|
-
]
|
263
|
-
}
|
264
|
-
assert_equal(json_, ::RGeo::GeoJSON.encode(object_))
|
265
|
-
assert(::RGeo::GeoJSON.decode(json_, :geo_factory => @geo_factory).eql?(object_))
|
266
|
-
end
|
267
|
-
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
end
|
272
|
-
end
|
273
|
-
end
|