rgeo 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. data/History.rdoc +22 -0
  2. data/README.rdoc +124 -0
  3. data/Version +1 -0
  4. data/ext/geos_c_impl/extconf.rb +72 -0
  5. data/ext/geos_c_impl/factory.c +468 -0
  6. data/ext/geos_c_impl/factory.h +217 -0
  7. data/ext/geos_c_impl/geometry.c +644 -0
  8. data/ext/geos_c_impl/geometry.h +65 -0
  9. data/ext/geos_c_impl/geometry_collection.c +580 -0
  10. data/ext/geos_c_impl/geometry_collection.h +79 -0
  11. data/ext/geos_c_impl/globals.h +58 -0
  12. data/ext/geos_c_impl/line_string.c +468 -0
  13. data/ext/geos_c_impl/line_string.h +74 -0
  14. data/ext/geos_c_impl/main.c +65 -0
  15. data/ext/geos_c_impl/point.c +201 -0
  16. data/ext/geos_c_impl/point.h +77 -0
  17. data/ext/geos_c_impl/polygon.c +259 -0
  18. data/ext/geos_c_impl/polygon.h +76 -0
  19. data/ext/geos_c_impl/preface.h +42 -0
  20. data/lib/rgeo.rb +68 -0
  21. data/lib/rgeo/errors.rb +59 -0
  22. data/lib/rgeo/features.rb +89 -0
  23. data/lib/rgeo/features/curve.rb +155 -0
  24. data/lib/rgeo/features/factory.rb +191 -0
  25. data/lib/rgeo/features/geometry.rb +560 -0
  26. data/lib/rgeo/features/geometry_collection.rb +118 -0
  27. data/lib/rgeo/features/line.rb +65 -0
  28. data/lib/rgeo/features/line_string.rb +101 -0
  29. data/lib/rgeo/features/linear_ring.rb +65 -0
  30. data/lib/rgeo/features/multi_curve.rb +112 -0
  31. data/lib/rgeo/features/multi_line_string.rb +65 -0
  32. data/lib/rgeo/features/multi_point.rb +72 -0
  33. data/lib/rgeo/features/multi_polygon.rb +96 -0
  34. data/lib/rgeo/features/multi_surface.rb +115 -0
  35. data/lib/rgeo/features/point.rb +97 -0
  36. data/lib/rgeo/features/polygon.rb +141 -0
  37. data/lib/rgeo/features/surface.rb +121 -0
  38. data/lib/rgeo/geo_json.rb +58 -0
  39. data/lib/rgeo/geo_json/coder.rb +305 -0
  40. data/lib/rgeo/geo_json/entities.rb +284 -0
  41. data/lib/rgeo/geo_json/interface.rb +95 -0
  42. data/lib/rgeo/geography.rb +75 -0
  43. data/lib/rgeo/geography/common/geometry_collection_methods.rb +206 -0
  44. data/lib/rgeo/geography/common/geometry_methods.rb +92 -0
  45. data/lib/rgeo/geography/common/helper.rb +102 -0
  46. data/lib/rgeo/geography/common/line_string_methods.rb +187 -0
  47. data/lib/rgeo/geography/common/point_methods.rb +149 -0
  48. data/lib/rgeo/geography/common/polygon_methods.rb +122 -0
  49. data/lib/rgeo/geography/factories.rb +136 -0
  50. data/lib/rgeo/geography/factory.rb +246 -0
  51. data/lib/rgeo/geography/projected_window.rb +467 -0
  52. data/lib/rgeo/geography/simple_mercator/feature_classes.rb +320 -0
  53. data/lib/rgeo/geography/simple_mercator/feature_methods.rb +291 -0
  54. data/lib/rgeo/geography/simple_mercator/projector.rb +116 -0
  55. data/lib/rgeo/geography/simple_spherical/calculations.rb +70 -0
  56. data/lib/rgeo/geography/simple_spherical/geometry_collection_impl.rb +66 -0
  57. data/lib/rgeo/geography/simple_spherical/geometry_methods.rb +59 -0
  58. data/lib/rgeo/geography/simple_spherical/line_string_impl.rb +104 -0
  59. data/lib/rgeo/geography/simple_spherical/multi_line_string_impl.rb +67 -0
  60. data/lib/rgeo/geography/simple_spherical/multi_point_impl.rb +67 -0
  61. data/lib/rgeo/geography/simple_spherical/multi_polygon_impl.rb +67 -0
  62. data/lib/rgeo/geography/simple_spherical/point_impl.rb +85 -0
  63. data/lib/rgeo/geography/simple_spherical/polygon_impl.rb +66 -0
  64. data/lib/rgeo/geos.rb +72 -0
  65. data/lib/rgeo/geos/factory.rb +260 -0
  66. data/lib/rgeo/geos/impl_additions.rb +57 -0
  67. data/lib/rgeo/geos/interface.rb +74 -0
  68. data/lib/rgeo/version.rb +52 -0
  69. data/tests/geos/tc_factory.rb +91 -0
  70. data/tests/geos/tc_geometry_collection.rb +226 -0
  71. data/tests/geos/tc_line_string.rb +310 -0
  72. data/tests/geos/tc_misc.rb +72 -0
  73. data/tests/geos/tc_multi_line_string.rb +211 -0
  74. data/tests/geos/tc_multi_point.rb +202 -0
  75. data/tests/geos/tc_multi_polygon.rb +210 -0
  76. data/tests/geos/tc_point.rb +305 -0
  77. data/tests/geos/tc_polygon.rb +240 -0
  78. data/tests/simple_mercator/tc_point.rb +303 -0
  79. data/tests/simple_mercator/tc_window.rb +219 -0
  80. data/tests/tc_geojson.rb +230 -0
  81. data/tests/tc_oneoff.rb +61 -0
  82. metadata +162 -0
@@ -0,0 +1,141 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Polygon feature interface
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
+ module RGeo
38
+
39
+ module Features
40
+
41
+
42
+ # == SFS 1.1 Description
43
+ #
44
+ # A Polygon is a planar Surface defined by 1 exterior boundary and 0 or
45
+ # more interior boundaries. Each interior boundary defines a hole in
46
+ # the Polygon.
47
+ #
48
+ # The assertions for Polygons (the rules that define valid Polygons)
49
+ # are as follows:
50
+ #
51
+ # (a) Polygons are topologically closed;
52
+ #
53
+ # (b) The boundary of a Polygon consists of a set of LinearRings that
54
+ # make up its exterior and interior boundaries;
55
+ #
56
+ # (c) No two Rings in the boundary cross and the Rings in the boundary
57
+ # of a Polygon may intersect at a Point but only as a tangent;
58
+ #
59
+ # (d) A Polygon may not have cut lines, spikes or punctures;
60
+ #
61
+ # (e) The interior of every Polygon is a connected point set;
62
+ #
63
+ # (f) The exterior of a Polygon with 1 or more holes is not connected.
64
+ # Each hole defines a connected component of the exterior.
65
+ #
66
+ # In the above assertions, interior, closure and exterior have the
67
+ # standard topological definitions. The combination of (a) and (c) make
68
+ # a Polygon a regular closed Point set.
69
+ #
70
+ # Polygons are simple geometric objects.
71
+ #
72
+ # == Notes
73
+ #
74
+ # Polygon is defined as a module and is provided primarily
75
+ # for the sake of documentation. Implementations need not necessarily
76
+ # include this module itself. Therefore, you should not depend on the
77
+ # kind_of? method to check type. Instead, use the provided check_type
78
+ # class method. A corresponding === operator is also provided to
79
+ # to support case-when constructs.
80
+
81
+ module Polygon
82
+
83
+ include Surface
84
+ include ::Enumerable
85
+
86
+
87
+ # === SFS 1.1 Description
88
+ #
89
+ # Returns the exterior ring of this Polygon.
90
+ #
91
+ # === Notes
92
+ #
93
+ # Returns an object that supports the LinearRing interface.
94
+
95
+ def exterior_ring
96
+ raise Errors::MethodUnimplemented
97
+ end
98
+
99
+
100
+ # === SFS 1.1 Description
101
+ #
102
+ # Returns the number of interiorRings in this Polygon.
103
+ #
104
+ # === Notes
105
+ #
106
+ # Returns an integer.
107
+
108
+ def num_interior_rings
109
+ raise Errors::MethodUnimplemented
110
+ end
111
+
112
+
113
+ # === SFS 1.1 Description
114
+ #
115
+ # Returns the Nth interiorRing for this Polygon as a LineString.
116
+ #
117
+ # === Notes
118
+ #
119
+ # Returns an object that supports the LineString interface, or nil
120
+ # if the given n is out of range.
121
+
122
+ def interior_ring_n(n_)
123
+ raise Errors::MethodUnimplemented
124
+ end
125
+
126
+
127
+ # Returns the interior rings as a (possibly empty) array of objects
128
+ # that support the LinearRing interface.
129
+
130
+ def interior_rings
131
+ raise Errors::MethodUnimplemented
132
+ end
133
+
134
+
135
+
136
+ end
137
+
138
+
139
+ end
140
+
141
+ end
@@ -0,0 +1,121 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # Surface feature interface
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
+ module RGeo
38
+
39
+ module Features
40
+
41
+
42
+ # == SFS 1.1 Description
43
+ #
44
+ # A Surface is a 2-dimensional geometric object.
45
+ #
46
+ # A simple Surface consists of a single "patch" that is associated with
47
+ # one "exterior boundary" and 0 or more "interior" boundaries. Simple
48
+ # Surfaces in 3-dimensional space are isomorphic to planar Surfaces.
49
+ # Polyhedral Surfaces are formed by "stitching" together simple
50
+ # Surfaces along their boundaries, polyhedral Surfaces in 3-dimensional
51
+ # space may not be planar as a whole.
52
+ #
53
+ # The boundary of a simple Surface is the set of closed Curves
54
+ # corresponding to its "exterior" and "interior" boundaries.
55
+ #
56
+ # The only instantiable subclass of Surface defined in this
57
+ # specification, Polygon, is a simple Surface that is planar.
58
+ #
59
+ # == Notes
60
+ #
61
+ # Surface is defined as a module and is provided primarily
62
+ # for the sake of documentation. Implementations need not necessarily
63
+ # include this module itself. Therefore, you should not depend on the
64
+ # kind_of? method to check type. Instead, use the provided check_type
65
+ # class method. A corresponding === operator is also provided to
66
+ # to support case-when constructs.
67
+ #
68
+ # Some implementations may support higher dimensional points.
69
+
70
+ module Surface
71
+
72
+ include Geometry
73
+
74
+
75
+ # === SFS 1.1 Description
76
+ #
77
+ # The area of this Surface, as measured in the spatial reference
78
+ # system of this Surface.
79
+ #
80
+ # === Notes
81
+ #
82
+ # Returns a floating-point scalar value.
83
+
84
+ def area
85
+ raise Errors::MethodUnimplemented
86
+ end
87
+
88
+
89
+ # === SFS 1.1 Description
90
+ #
91
+ # The mathematical centroid for this Surface as a Point. The result
92
+ # is not guaranteed to be on this Surface.
93
+ #
94
+ # === Notes
95
+ #
96
+ # Returns an object that supports the Point interface.
97
+
98
+ def centroid
99
+ raise Errors::MethodUnimplemented
100
+ end
101
+
102
+
103
+ # === SFS 1.1 Description
104
+ #
105
+ # A Point guaranteed to be on this Surface.
106
+ #
107
+ # === Notes
108
+ #
109
+ # Returns an object that supports the Point interface.
110
+
111
+ def point_on_surface
112
+ raise Errors::MethodUnimplemented
113
+ end
114
+
115
+
116
+ end
117
+
118
+
119
+ end
120
+
121
+ end
@@ -0,0 +1,58 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # GeoJSON implementation for RGeo
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
+ module RGeo
38
+
39
+
40
+ # This is a namespace for a set of tools that provide GeoJSON encoding.
41
+ # See http://geojson.org/ for more information about this specification.
42
+
43
+ module GeoJSON
44
+ end
45
+
46
+
47
+ end
48
+
49
+
50
+ # Dependency source files.
51
+ paths_ = [
52
+ 'features',
53
+ 'geo_json/entities',
54
+ 'geo_json/coder',
55
+ 'geo_json/interface',
56
+ ]
57
+
58
+ paths_.each{ |path_| require "rgeo/#{path_}" }
@@ -0,0 +1,305 @@
1
+ # -----------------------------------------------------------------------------
2
+ #
3
+ # GeoJSON encoder object
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 'json'
38
+
39
+
40
+ module RGeo
41
+
42
+ module GeoJSON
43
+
44
+
45
+ # This object encapsulates encoding and decoding settings (principally
46
+ # the RGeo::Features::Factory and the RGeo::GeoJSON::EntityFactory to
47
+ # be used) so that you can encode and decode without specifying those
48
+ # settings every time.
49
+
50
+ class Coder
51
+
52
+
53
+ # 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_
61
+ @entity_factory = opts_[:entity_factory] || EntityFactory.instance
62
+ end
63
+
64
+
65
+ # Encode the given object as GeoJSON. The object may be one of the
66
+ # geometry objects specified in RGeo::Features, or an appropriate
67
+ # GeoJSON wrapper entity supported by this coder's entity factory.
68
+
69
+ def encode(object_)
70
+ if @entity_factory.is_feature_collection?(object_)
71
+ {
72
+ 'type' => 'FeatureCollection',
73
+ 'features' => @entity_factory.map_feature_collection(object_){ |f_| _encode_feature(f_) },
74
+ }
75
+ elsif @entity_factory.is_feature?(object_)
76
+ _encode_feature(object_)
77
+ else
78
+ _encode_geometry(object_)
79
+ end
80
+ end
81
+
82
+
83
+ # Decode an object from GeoJSON. The input may be a JSON hash, a
84
+ # String, or an IO object from which to read the JSON string.
85
+
86
+ def decode(input_)
87
+ if input_.kind_of?(::IO)
88
+ input_ = input_.read rescue nil
89
+ end
90
+ if input_.kind_of?(::String)
91
+ input_ = ::JSON.parse(input_) rescue nil
92
+ end
93
+ unless input_.kind_of?(::Hash)
94
+ return nil
95
+ end
96
+ case input_['type']
97
+ when 'FeatureCollection'
98
+ features_ = input_['features']
99
+ features_ = [] unless features_.kind_of?(::Array)
100
+ decoded_features_ = []
101
+ features_.each do |f_|
102
+ if f_['type'] == 'Feature'
103
+ decoded_features_ << _decode_feature(f_)
104
+ end
105
+ end
106
+ @entity_factory.feature_collection(decoded_features_)
107
+ when 'Feature'
108
+ _decode_feature(input_)
109
+ else
110
+ _decode_geometry(input_)
111
+ end
112
+ end
113
+
114
+
115
+ # Returns the RGeo::Features::Factory used to generate geometry objects.
116
+
117
+ def geo_factory
118
+ @geo_factory
119
+ end
120
+
121
+
122
+ # Returns the RGeo::GeoJSON::EntityFactory used to generate GeoJSON
123
+ # wrapper entities.
124
+
125
+ def entity_factory
126
+ @entity_factory
127
+ end
128
+
129
+
130
+ def _encode_feature(object_) # :nodoc:
131
+ json_ = {
132
+ 'type' => 'Feature',
133
+ 'geometry' => _encode_geometry(@entity_factory.get_feature_geometry(object_)),
134
+ 'properties' => @entity_factory.get_feature_properties(object_).dup,
135
+ }
136
+ id_ = @entity_factory.get_feature_id(object_)
137
+ json_['id'] = id_ if id_
138
+ json_
139
+ end
140
+
141
+
142
+ def _encode_geometry(object_) # :nodoc:
143
+ case object_
144
+ when Features::Point
145
+ {
146
+ 'type' => 'Point',
147
+ 'coordinates' => [object_.x, object_.y],
148
+ }
149
+ when Features::LineString
150
+ {
151
+ 'type' => 'LineString',
152
+ 'coordinates' => object_.points.map{ |p_| [p_.x, p_.y] },
153
+ }
154
+ when Features::Polygon
155
+ {
156
+ '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] } }
158
+ }
159
+ when Features::MultiPoint
160
+ {
161
+ 'type' => 'MultiPoint',
162
+ 'coordinates' => object_.map{ |p_| [p_.x, p_.y] },
163
+ }
164
+ when Features::MultiLineString
165
+ {
166
+ 'type' => 'MultiLineString',
167
+ 'coordinates' => object_.map{ |ls_| ls_.points.map{ |p_| [p_.x, p_.y] } },
168
+ }
169
+ when Features::MultiPolygon
170
+ {
171
+ '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] } } },
173
+ }
174
+ when Features::GeometryCollection
175
+ {
176
+ 'type' => 'GeometryCollection',
177
+ 'geometries' => object_.map{ |geom_| _encode_geometry(geom_) },
178
+ }
179
+ else
180
+ nil
181
+ end
182
+ end
183
+
184
+
185
+ def _decode_feature(input_) # :nodoc:
186
+ geometry_ = _decode_geometry(input_['geometry'])
187
+ if geometry_
188
+ @entity_factory.feature(geometry_, input_['id'], input_['properties'])
189
+ else
190
+ nil
191
+ end
192
+ end
193
+
194
+
195
+ def _decode_geometry(input_) # :nodoc:
196
+ case input_['type']
197
+ when 'GeometryCollection'
198
+ _decode_geometry_collection(input_)
199
+ when 'Point'
200
+ _decode_point_coords(input_['coordinates'])
201
+ when 'LineString'
202
+ _decode_line_string_coords(input_['coordinates'])
203
+ when 'Polygon'
204
+ _decode_polygon_coords(input_['coordinates'])
205
+ when 'MultiPoint'
206
+ _decode_multi_point_coords(input_['coordinates'])
207
+ when 'MultiLineString'
208
+ _decode_multi_line_string_coords(input_['coordinates'])
209
+ when 'MultiPolygon'
210
+ _decode_multi_polygon_coords(input_['coordinates'])
211
+ else
212
+ nil
213
+ end
214
+ end
215
+
216
+
217
+ def _decode_geometry_collection(input_) # :nodoc:
218
+ geometries_ = input_['geometries']
219
+ geometries_ = [] unless geometries_.kind_of?(::Array)
220
+ decoded_geometries_ = []
221
+ geometries_.each do |g_|
222
+ g_ = _decode_geometry(g_)
223
+ decoded_geometries_ << g_ if g_
224
+ end
225
+ @geo_factory.collection(decoded_geometries_)
226
+ end
227
+
228
+
229
+ def _decode_point_coords(point_coords_) # :nodoc:
230
+ return nil unless point_coords_.kind_of?(::Array)
231
+ @geo_factory.point(point_coords_[0].to_f, point_coords_[1].to_f) rescue nil
232
+ end
233
+
234
+
235
+ def _decode_line_string_coords(line_coords_) # :nodoc:
236
+ return nil unless line_coords_.kind_of?(::Array)
237
+ points_ = []
238
+ line_coords_.each do |point_coords_|
239
+ point_ = _decode_point_coords(point_coords_)
240
+ points_ << point_ if point_
241
+ end
242
+ @geo_factory.line_string(points_)
243
+ end
244
+
245
+
246
+ def _decode_polygon_coords(poly_coords_) # :nodoc:
247
+ return nil unless poly_coords_.kind_of?(::Array)
248
+ rings_ = []
249
+ poly_coords_.each do |ring_coords_|
250
+ return nil unless ring_coords_.kind_of?(::Array)
251
+ points_ = []
252
+ ring_coords_.each do |point_coords_|
253
+ point_ = _decode_point_coords(point_coords_)
254
+ points_ << point_ if point_
255
+ end
256
+ ring_ = @geo_factory.linear_ring(points_)
257
+ rings_ << ring_ if ring_
258
+ end
259
+ if rings_.size == 0
260
+ nil
261
+ else
262
+ @geo_factory.polygon(rings_[0], rings_[1..-1])
263
+ end
264
+ end
265
+
266
+
267
+ def _decode_multi_point_coords(multi_point_coords_) # :nodoc:
268
+ return nil unless multi_point_coords_.kind_of?(::Array)
269
+ points_ = []
270
+ multi_point_coords_.each do |point_coords_|
271
+ point_ = _decode_point_coords(point_coords_)
272
+ points_ << point_ if point_
273
+ end
274
+ @geo_factory.multi_point(points_)
275
+ end
276
+
277
+
278
+ def _decode_multi_line_string_coords(multi_line_coords_) # :nodoc:
279
+ return nil unless multi_line_coords_.kind_of?(::Array)
280
+ lines_ = []
281
+ multi_line_coords_.each do |line_coords_|
282
+ line_ = _decode_line_string_coords(line_coords_)
283
+ lines_ << line_ if line_
284
+ end
285
+ @geo_factory.multi_line_string(lines_)
286
+ end
287
+
288
+
289
+ def _decode_multi_polygon_coords(multi_polygon_coords_) # :nodoc:
290
+ return nil unless multi_polygon_coords_.kind_of?(::Array)
291
+ polygons_ = []
292
+ multi_polygon_coords_.each do |poly_coords_|
293
+ poly_ = _decode_polygon_coords(poly_coords_)
294
+ polygons_ << poly_ if poly_
295
+ end
296
+ @geo_factory.multi_polygon(polygons_)
297
+ end
298
+
299
+
300
+ end
301
+
302
+
303
+ end
304
+
305
+ end