rgeo 0.1.14 → 0.1.15
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 +6 -0
- data/Version +1 -1
- data/lib/rgeo.rb +80 -30
- data/lib/rgeo/all.rb +48 -0
- data/lib/rgeo/cartesian.rb +37 -12
- data/lib/rgeo/cartesian/calculations.rb +5 -0
- data/lib/rgeo/cartesian/{simple_factory.rb → factory.rb} +14 -17
- data/lib/rgeo/cartesian/{simple_feature_classes.rb → feature_classes.rb} +55 -55
- data/lib/rgeo/cartesian/{simple_feature_methods.rb → feature_methods.rb} +7 -3
- data/lib/rgeo/cartesian/interface.rb +7 -3
- data/lib/rgeo/errors.rb +4 -0
- data/lib/rgeo/features.rb +25 -20
- data/lib/rgeo/geo_json.rb +10 -8
- data/lib/rgeo/geography.rb +10 -16
- data/lib/rgeo/geography/all.rb +40 -0
- data/lib/rgeo/geography/factory.rb +2 -2
- data/lib/rgeo/geography/{factories.rb → interface.rb} +4 -2
- data/lib/rgeo/geography/simple_mercator.rb +69 -0
- data/lib/rgeo/geography/simple_mercator/feature_classes.rb +62 -62
- data/lib/rgeo/geography/simple_mercator/projector.rb +1 -1
- data/lib/rgeo/geography/simple_spherical.rb +68 -0
- data/lib/rgeo/geography/simple_spherical/calculations.rb +2 -2
- data/lib/rgeo/geography/simple_spherical/feature_classes.rb +44 -44
- data/lib/rgeo/geos.rb +12 -9
- data/lib/rgeo/impl_helpers.rb +14 -9
- data/lib/rgeo/impl_helpers/basic_geometry_collection_methods.rb +10 -0
- data/lib/rgeo/impl_helpers/basic_point_methods.rb +3 -0
- data/lib/rgeo/{geography/helper.rb → impl_helpers/math.rb} +3 -3
- data/lib/rgeo/wkrep.rb +32 -12
- data/lib/rgeo/wkrep/wkb_generator.rb +95 -9
- data/lib/rgeo/wkrep/wkb_parser.rb +117 -9
- data/lib/rgeo/wkrep/wkt_generator.rb +106 -18
- data/lib/rgeo/wkrep/wkt_parser.rb +203 -59
- data/tests/simple_cartesian/tc_calculations.rb +8 -8
- data/tests/wkrep/tc_wkt_generator.rb +362 -0
- data/tests/wkrep/tc_wkt_parser.rb +490 -0
- metadata +16 -8
| @@ -65,7 +65,7 @@ module RGeo | |
| 65 65 | 
             
                    def unproject(geometry_)
         | 
| 66 66 | 
             
                      case geometry_
         | 
| 67 67 | 
             
                      when Features::Point
         | 
| 68 | 
            -
                        dpr_ =  | 
| 68 | 
            +
                        dpr_ = ::RGeo::ImplHelpers::Math::DEGREES_PER_RADIAN
         | 
| 69 69 | 
             
                        radius_ = EQUATORIAL_RADIUS
         | 
| 70 70 | 
             
                        @geography_factory.point(geometry_.x / radius_ * dpr_,
         | 
| 71 71 | 
             
                          (2.0 * ::Math.atan(::Math.exp(geometry_.y / radius_)) - ::Math::PI / 2.0) * dpr_)
         | 
| @@ -0,0 +1,68 @@ | |
| 1 | 
            +
            # -----------------------------------------------------------------------------
         | 
| 2 | 
            +
            # 
         | 
| 3 | 
            +
            # Simple spherical geography 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 | 
            +
            require 'rgeo/geography'
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
            module RGeo
         | 
| 41 | 
            +
              
         | 
| 42 | 
            +
              module Geography
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                
         | 
| 45 | 
            +
                # This namespace contains the simple spherical implementation.
         | 
| 46 | 
            +
                
         | 
| 47 | 
            +
                module SimpleSpherical
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
                
         | 
| 50 | 
            +
                
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
              
         | 
| 53 | 
            +
              
         | 
| 54 | 
            +
            end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
             | 
| 57 | 
            +
            # Dependency source files.
         | 
| 58 | 
            +
            paths_ = [
         | 
| 59 | 
            +
              'features',
         | 
| 60 | 
            +
              'wkrep',
         | 
| 61 | 
            +
              'impl_helpers',
         | 
| 62 | 
            +
              'geography/simple_spherical/calculations',
         | 
| 63 | 
            +
              'geography/simple_spherical/feature_methods',
         | 
| 64 | 
            +
              'geography/simple_spherical/feature_classes',
         | 
| 65 | 
            +
              'geography/factory',
         | 
| 66 | 
            +
              'geography/projected_window',
         | 
| 67 | 
            +
            ]
         | 
| 68 | 
            +
            paths_.each{ |path_| require "rgeo/#{path_}" }
         | 
| @@ -85,7 +85,7 @@ module RGeo | |
| 85 85 | 
             
                    def latlon
         | 
| 86 86 | 
             
                      lat_rad_ = ::Math.asin(@z)
         | 
| 87 87 | 
             
                      lon_rad_ = ::Math.atan2(@y, @x) rescue 0.0
         | 
| 88 | 
            -
                      rpd_ =  | 
| 88 | 
            +
                      rpd_ = ::RGeo::ImplHelpers::Math::RADIANS_PER_DEGREE
         | 
| 89 89 | 
             
                      [lat_rad_ / rpd_, lon_rad_ / rpd_]
         | 
| 90 90 | 
             
                    end
         | 
| 91 91 |  | 
| @@ -120,7 +120,7 @@ module RGeo | |
| 120 120 |  | 
| 121 121 |  | 
| 122 122 | 
             
                    def self.from_latlon(lat_, lon_)
         | 
| 123 | 
            -
                      rpd_ =  | 
| 123 | 
            +
                      rpd_ = ::RGeo::ImplHelpers::Math::RADIANS_PER_DEGREE
         | 
| 124 124 | 
             
                      lat_rad_ = rpd_ * lat_
         | 
| 125 125 | 
             
                      lon_rad_ = rpd_ * lon_
         | 
| 126 126 | 
             
                      z_ = ::Math.sin(lat_rad_)
         | 
| @@ -44,10 +44,10 @@ module RGeo | |
| 44 44 | 
             
                  class PointImpl  # :nodoc:
         | 
| 45 45 |  | 
| 46 46 |  | 
| 47 | 
            -
                    include Features::Point
         | 
| 48 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 49 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 50 | 
            -
                    include ImplHelpers::BasicPointMethods
         | 
| 47 | 
            +
                    include ::RGeo::Features::Point
         | 
| 48 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 49 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 50 | 
            +
                    include ::RGeo::ImplHelpers::BasicPointMethods
         | 
| 51 51 |  | 
| 52 52 |  | 
| 53 53 | 
             
                    def _validate_geometry
         | 
| @@ -81,11 +81,11 @@ module RGeo | |
| 81 81 | 
             
                  class LineStringImpl  # :nodoc:
         | 
| 82 82 |  | 
| 83 83 |  | 
| 84 | 
            -
                    include Features::LineString
         | 
| 85 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 86 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 87 | 
            -
                    include ImplHelpers::BasicLineStringMethods
         | 
| 88 | 
            -
                    include SimpleSpherical::LineStringMethods
         | 
| 84 | 
            +
                    include ::RGeo::Features::LineString
         | 
| 85 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 86 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 87 | 
            +
                    include ::RGeo::ImplHelpers::BasicLineStringMethods
         | 
| 88 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::LineStringMethods
         | 
| 89 89 |  | 
| 90 90 |  | 
| 91 91 | 
             
                  end
         | 
| @@ -94,12 +94,12 @@ module RGeo | |
| 94 94 | 
             
                  class LineImpl  # :nodoc:
         | 
| 95 95 |  | 
| 96 96 |  | 
| 97 | 
            -
                    include Features::Line
         | 
| 98 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 99 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 100 | 
            -
                    include ImplHelpers::BasicLineStringMethods
         | 
| 101 | 
            -
                    include SimpleSpherical::LineStringMethods
         | 
| 102 | 
            -
                    include ImplHelpers::BasicLineMethods
         | 
| 97 | 
            +
                    include ::RGeo::Features::Line
         | 
| 98 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 99 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 100 | 
            +
                    include ::RGeo::ImplHelpers::BasicLineStringMethods
         | 
| 101 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::LineStringMethods
         | 
| 102 | 
            +
                    include ::RGeo::ImplHelpers::BasicLineMethods
         | 
| 103 103 |  | 
| 104 104 |  | 
| 105 105 | 
             
                  end
         | 
| @@ -108,12 +108,12 @@ module RGeo | |
| 108 108 | 
             
                  class LinearRingImpl  # :nodoc:
         | 
| 109 109 |  | 
| 110 110 |  | 
| 111 | 
            -
                    include Features::Line
         | 
| 112 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 113 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 114 | 
            -
                    include ImplHelpers::BasicLineStringMethods
         | 
| 115 | 
            -
                    include SimpleSpherical::LineStringMethods
         | 
| 116 | 
            -
                    include ImplHelpers::BasicLinearRingMethods
         | 
| 111 | 
            +
                    include ::RGeo::Features::Line
         | 
| 112 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 113 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 114 | 
            +
                    include ::RGeo::ImplHelpers::BasicLineStringMethods
         | 
| 115 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::LineStringMethods
         | 
| 116 | 
            +
                    include ::RGeo::ImplHelpers::BasicLinearRingMethods
         | 
| 117 117 |  | 
| 118 118 |  | 
| 119 119 | 
             
                  end
         | 
| @@ -122,10 +122,10 @@ module RGeo | |
| 122 122 | 
             
                  class PolygonImpl  # :nodoc:
         | 
| 123 123 |  | 
| 124 124 |  | 
| 125 | 
            -
                    include Features::Polygon
         | 
| 126 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 127 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 128 | 
            -
                    include ImplHelpers::BasicPolygonMethods
         | 
| 125 | 
            +
                    include ::RGeo::Features::Polygon
         | 
| 126 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 127 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 128 | 
            +
                    include ::RGeo::ImplHelpers::BasicPolygonMethods
         | 
| 129 129 |  | 
| 130 130 |  | 
| 131 131 | 
             
                  end
         | 
| @@ -134,10 +134,10 @@ module RGeo | |
| 134 134 | 
             
                  class GeometryCollectionImpl  # :nodoc:
         | 
| 135 135 |  | 
| 136 136 |  | 
| 137 | 
            -
                    include Features::GeometryCollection
         | 
| 138 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 139 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 140 | 
            -
                    include ImplHelpers::BasicGeometryCollectionMethods
         | 
| 137 | 
            +
                    include ::RGeo::Features::GeometryCollection
         | 
| 138 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 139 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 140 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
         | 
| 141 141 |  | 
| 142 142 |  | 
| 143 143 | 
             
                  end
         | 
| @@ -146,11 +146,11 @@ module RGeo | |
| 146 146 | 
             
                  class MultiPointImpl  # :nodoc:
         | 
| 147 147 |  | 
| 148 148 |  | 
| 149 | 
            -
                    include Features::GeometryCollection
         | 
| 150 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 151 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 152 | 
            -
                    include ImplHelpers::BasicGeometryCollectionMethods
         | 
| 153 | 
            -
                    include ImplHelpers::BasicMultiPointMethods
         | 
| 149 | 
            +
                    include ::RGeo::Features::GeometryCollection
         | 
| 150 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 151 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 152 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
         | 
| 153 | 
            +
                    include ::RGeo::ImplHelpers::BasicMultiPointMethods
         | 
| 154 154 |  | 
| 155 155 |  | 
| 156 156 | 
             
                  end
         | 
| @@ -159,11 +159,11 @@ module RGeo | |
| 159 159 | 
             
                  class MultiLineStringImpl  # :nodoc:
         | 
| 160 160 |  | 
| 161 161 |  | 
| 162 | 
            -
                    include Features::GeometryCollection
         | 
| 163 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 164 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 165 | 
            -
                    include ImplHelpers::BasicGeometryCollectionMethods
         | 
| 166 | 
            -
                    include ImplHelpers::BasicMultiLineStringMethods
         | 
| 162 | 
            +
                    include ::RGeo::Features::GeometryCollection
         | 
| 163 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 164 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 165 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
         | 
| 166 | 
            +
                    include ::RGeo::ImplHelpers::BasicMultiLineStringMethods
         | 
| 167 167 |  | 
| 168 168 |  | 
| 169 169 | 
             
                  end
         | 
| @@ -172,11 +172,11 @@ module RGeo | |
| 172 172 | 
             
                  class MultiPolygonImpl  # :nodoc:
         | 
| 173 173 |  | 
| 174 174 |  | 
| 175 | 
            -
                    include Features::GeometryCollection
         | 
| 176 | 
            -
                    include ImplHelpers::BasicGeometryMethods
         | 
| 177 | 
            -
                    include SimpleSpherical::GeometryMethods
         | 
| 178 | 
            -
                    include ImplHelpers::BasicGeometryCollectionMethods
         | 
| 179 | 
            -
                    include ImplHelpers::BasicMultiPolygonMethods
         | 
| 175 | 
            +
                    include ::RGeo::Features::GeometryCollection
         | 
| 176 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryMethods
         | 
| 177 | 
            +
                    include ::RGeo::Geography::SimpleSpherical::GeometryMethods
         | 
| 178 | 
            +
                    include ::RGeo::ImplHelpers::BasicGeometryCollectionMethods
         | 
| 179 | 
            +
                    include ::RGeo::ImplHelpers::BasicMultiPolygonMethods
         | 
| 180 180 |  | 
| 181 181 |  | 
| 182 182 | 
             
                  end
         | 
    
        data/lib/rgeo/geos.rb
    CHANGED
    
    | @@ -34,6 +34,10 @@ | |
| 34 34 | 
             
            ;
         | 
| 35 35 |  | 
| 36 36 |  | 
| 37 | 
            +
            # Parent file
         | 
| 38 | 
            +
            require 'rgeo'
         | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 37 41 | 
             
            module RGeo
         | 
| 38 42 |  | 
| 39 43 |  | 
| @@ -61,12 +65,11 @@ module RGeo | |
| 61 65 | 
             
            end
         | 
| 62 66 |  | 
| 63 67 |  | 
| 64 | 
            -
            # Dependency  | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
            paths_.each{ |path_| require "rgeo/#{path_}" }
         | 
| 68 | 
            +
            # Dependency files
         | 
| 69 | 
            +
            require 'rgeo/features'
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            # Implementation files
         | 
| 72 | 
            +
            require 'rgeo/geos/factory'
         | 
| 73 | 
            +
            require 'rgeo/geos/interface'
         | 
| 74 | 
            +
            require 'rgeo/geos/geos_c_impl'
         | 
| 75 | 
            +
            require 'rgeo/geos/impl_additions'
         | 
    
        data/lib/rgeo/impl_helpers.rb
    CHANGED
    
    | @@ -34,6 +34,10 @@ | |
| 34 34 | 
             
            ;
         | 
| 35 35 |  | 
| 36 36 |  | 
| 37 | 
            +
            # Parent file
         | 
| 38 | 
            +
            require 'rgeo'
         | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 37 41 | 
             
            module RGeo
         | 
| 38 42 |  | 
| 39 43 |  | 
| @@ -44,12 +48,13 @@ module RGeo | |
| 44 48 | 
             
            end
         | 
| 45 49 |  | 
| 46 50 |  | 
| 47 | 
            -
            # Dependency  | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 51 | 
            +
            # Dependency files
         | 
| 52 | 
            +
            require 'rgeo/features'
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            # Implementation files
         | 
| 55 | 
            +
            require 'rgeo/impl_helpers/math'
         | 
| 56 | 
            +
            require 'rgeo/impl_helpers/basic_geometry_methods'
         | 
| 57 | 
            +
            require 'rgeo/impl_helpers/basic_geometry_collection_methods'
         | 
| 58 | 
            +
            require 'rgeo/impl_helpers/basic_point_methods'
         | 
| 59 | 
            +
            require 'rgeo/impl_helpers/basic_line_string_methods'
         | 
| 60 | 
            +
            require 'rgeo/impl_helpers/basic_polygon_methods'
         | 
| @@ -130,6 +130,11 @@ module RGeo | |
| 130 130 | 
             
                  end
         | 
| 131 131 |  | 
| 132 132 |  | 
| 133 | 
            +
                  def length
         | 
| 134 | 
            +
                    @elements.inject(0.0){ |sum_, obj_| sum_ + obj_.length }
         | 
| 135 | 
            +
                  end
         | 
| 136 | 
            +
                  
         | 
| 137 | 
            +
                  
         | 
| 133 138 | 
             
                end
         | 
| 134 139 |  | 
| 135 140 |  | 
| @@ -178,6 +183,11 @@ module RGeo | |
| 178 183 | 
             
                  end
         | 
| 179 184 |  | 
| 180 185 |  | 
| 186 | 
            +
                  def area
         | 
| 187 | 
            +
                    @elements.inject(0.0){ |sum_, obj_| sum_ + obj_.area }
         | 
| 188 | 
            +
                  end
         | 
| 189 | 
            +
                  
         | 
| 190 | 
            +
                  
         | 
| 181 191 | 
             
                end
         | 
| 182 192 |  | 
| 183 193 |  | 
| @@ -48,6 +48,9 @@ module RGeo | |
| 48 48 | 
             
                    @y = y_.to_f
         | 
| 49 49 | 
             
                    @z = factory_.has_capability?(:z_coordinate) ? extra_.shift.to_f : nil
         | 
| 50 50 | 
             
                    @m = factory_.has_capability?(:m_coordinate) ? extra_.shift.to_f : nil
         | 
| 51 | 
            +
                    if extra_.size > 0
         | 
| 52 | 
            +
                      raise ::ArgumentError, "Too many arguments for point initializer"
         | 
| 53 | 
            +
                    end
         | 
| 51 54 | 
             
                    _validate_geometry
         | 
| 52 55 | 
             
                  end
         | 
| 53 56 |  | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            # -----------------------------------------------------------------------------
         | 
| 2 2 | 
             
            # 
         | 
| 3 | 
            -
            #  | 
| 3 | 
            +
            # Math constants and tools
         | 
| 4 4 | 
             
            # 
         | 
| 5 5 | 
             
            # -----------------------------------------------------------------------------
         | 
| 6 6 | 
             
            # Copyright 2010 Daniel Azuma
         | 
| @@ -36,9 +36,9 @@ | |
| 36 36 |  | 
| 37 37 | 
             
            module RGeo
         | 
| 38 38 |  | 
| 39 | 
            -
              module  | 
| 39 | 
            +
              module ImplHelpers  # :nodoc:
         | 
| 40 40 |  | 
| 41 | 
            -
                module  | 
| 41 | 
            +
                module Math  # :nodoc:
         | 
| 42 42 |  | 
| 43 43 | 
             
                  RADIANS_PER_DEGREE = ::Math::PI/180.0
         | 
| 44 44 | 
             
                  DEGREES_PER_RADIAN = 180.0/::Math::PI
         | 
    
        data/lib/rgeo/wkrep.rb
    CHANGED
    
    | @@ -34,12 +34,33 @@ | |
| 34 34 | 
             
            ;
         | 
| 35 35 |  | 
| 36 36 |  | 
| 37 | 
            +
            # Parent file
         | 
| 38 | 
            +
            require 'rgeo'
         | 
| 39 | 
            +
             | 
| 40 | 
            +
             | 
| 37 41 | 
             
            module RGeo
         | 
| 38 42 |  | 
| 39 43 |  | 
| 40 | 
            -
              #  | 
| 41 | 
            -
              #  | 
| 42 | 
            -
              #  | 
| 44 | 
            +
              # This module contains implementations of the OpenGIS well-known
         | 
| 45 | 
            +
              # representations: the WKT (well-known text representation) and the
         | 
| 46 | 
            +
              # WKB (well-known binary representation), as defined in the Simple
         | 
| 47 | 
            +
              # Features Specification, version 1.1. Facilities are provided to
         | 
| 48 | 
            +
              # serialize any geometry into one of these formats, and to parse a
         | 
| 49 | 
            +
              # serialized string back into a geometry. Support is also provided for
         | 
| 50 | 
            +
              # the common extensions to these formats-- notably, the EWKT and EWKB
         | 
| 51 | 
            +
              # formats used by PostGIS.
         | 
| 52 | 
            +
              # 
         | 
| 53 | 
            +
              # To serialize a geometry into WKT (well-known text) format, use
         | 
| 54 | 
            +
              # the WKRep::WKTGenerator class.
         | 
| 55 | 
            +
              # 
         | 
| 56 | 
            +
              # To serialize a geometry into WKB (well-known binary) format, use
         | 
| 57 | 
            +
              # the WKRep::WKBGenerator class.
         | 
| 58 | 
            +
              # 
         | 
| 59 | 
            +
              # To parse a string in WKT (well-known text) format back into a
         | 
| 60 | 
            +
              # geometry object, use the WKRep::WKTParser class.
         | 
| 61 | 
            +
              # 
         | 
| 62 | 
            +
              # To parse a byte string in WKB (well-known binary) format back into a
         | 
| 63 | 
            +
              # geometry object, use the WKRep::WKBParser class.
         | 
| 43 64 |  | 
| 44 65 | 
             
              module WKRep
         | 
| 45 66 | 
             
              end
         | 
| @@ -48,12 +69,11 @@ module RGeo | |
| 48 69 | 
             
            end
         | 
| 49 70 |  | 
| 50 71 |  | 
| 51 | 
            -
            # Dependency  | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
            paths_.each{ |path_| require "rgeo/#{path_}" }
         | 
| 72 | 
            +
            # Dependency files
         | 
| 73 | 
            +
            require 'rgeo/features'
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            # Implementation files
         | 
| 76 | 
            +
            require 'rgeo/wkrep/wkt_parser'
         | 
| 77 | 
            +
            require 'rgeo/wkrep/wkt_generator'
         | 
| 78 | 
            +
            require 'rgeo/wkrep/wkb_parser'
         | 
| 79 | 
            +
            require 'rgeo/wkrep/wkb_generator'
         | 
| @@ -39,9 +39,42 @@ module RGeo | |
| 39 39 | 
             
              module WKRep
         | 
| 40 40 |  | 
| 41 41 |  | 
| 42 | 
            +
                # This class provides the functionality of serializing a geometry as
         | 
| 43 | 
            +
                # WKB (well-known binary) format. You may also customize the
         | 
| 44 | 
            +
                # serializer to generate PostGIS EWKB extensions to the output, or to
         | 
| 45 | 
            +
                # follow the Simple Features Specification 1.2 extensions for Z and M
         | 
| 46 | 
            +
                # coordinates.
         | 
| 47 | 
            +
                # 
         | 
| 48 | 
            +
                # To use this class, create an instance with the desired settings and
         | 
| 49 | 
            +
                # customizations, and call the generate method.
         | 
| 50 | 
            +
                # 
         | 
| 51 | 
            +
                # === Configuration options
         | 
| 52 | 
            +
                # 
         | 
| 53 | 
            +
                # The following options are recognized. These can be passed to the
         | 
| 54 | 
            +
                # constructor, or set on the object afterwards.
         | 
| 55 | 
            +
                # 
         | 
| 56 | 
            +
                # <tt>:type_format</tt>::
         | 
| 57 | 
            +
                #   The format for type codes. Possible values are <tt>:wkb11</tt>,
         | 
| 58 | 
            +
                #   indicating SFS 1.1 WKB (i.e. no Z or M values); <tt>:ewkb</tt>,
         | 
| 59 | 
            +
                #   indicating the PostGIS EWKB extensions (i.e. Z and M presence
         | 
| 60 | 
            +
                #   flagged by the two high bits of the type code, and support for
         | 
| 61 | 
            +
                #   embedded SRID); or <tt>:wkb12</tt> (indicating SFS 1.2 WKB
         | 
| 62 | 
            +
                #   (i.e. Z and M presence flagged by adding 1000 and/or 2000 to
         | 
| 63 | 
            +
                #   the type code.) Default is <tt>:wkb11</tt>.
         | 
| 64 | 
            +
                # <tt>:emit_ewkb_srid</tt>::
         | 
| 65 | 
            +
                #   If true, embed the SRID in the toplevel geometry. Available only
         | 
| 66 | 
            +
                #   if <tt>:type_format</tt> is <tt>:ewkb</tt>. Default is false.
         | 
| 67 | 
            +
                # <tt>:hex_format</tt>::
         | 
| 68 | 
            +
                #   If true, output a hex string instead of a byte string.
         | 
| 69 | 
            +
                #   Default is false.
         | 
| 70 | 
            +
                # <tt>:little_endian</tt>::
         | 
| 71 | 
            +
                #   If true, output little endian (NDR) byte order. If false, output
         | 
| 72 | 
            +
                #   big endian (XDR), or network byte order. Default is false.
         | 
| 73 | 
            +
                
         | 
| 42 74 | 
             
                class WKBGenerator
         | 
| 43 75 |  | 
| 44 76 |  | 
| 77 | 
            +
                  # :stopdoc:
         | 
| 45 78 | 
             
                  TYPE_CODES = {
         | 
| 46 79 | 
             
                    Features::Point => 1,
         | 
| 47 80 | 
             
                    Features::LineString => 2,
         | 
| @@ -53,15 +86,68 @@ module RGeo | |
| 53 86 | 
             
                    Features::MultiPolygon => 6,
         | 
| 54 87 | 
             
                    Features::GeometryCollection => 7,
         | 
| 55 88 | 
             
                  }
         | 
| 89 | 
            +
                  # :startdoc:
         | 
| 90 | 
            +
                  
         | 
| 56 91 |  | 
| 92 | 
            +
                  # Create and configure a WKB generator. See the WKBGenerator
         | 
| 93 | 
            +
                  # documentation for the options that can be passed.
         | 
| 57 94 |  | 
| 58 95 | 
             
                  def initialize(opts_={})
         | 
| 59 | 
            -
                    @type_format = opts_[:type_format]
         | 
| 60 | 
            -
                    @emit_ewkb_srid = opts_[:emit_ewkb_srid] if @type_format == :ewkb
         | 
| 61 | 
            -
                    @hex_format = opts_[:hex_format]
         | 
| 62 | 
            -
                    @little_endian = opts_[:little_endian]
         | 
| 96 | 
            +
                    @type_format = opts_[:type_format] || :wkb11
         | 
| 97 | 
            +
                    @emit_ewkb_srid = opts_[:emit_ewkb_srid] ? true : false if @type_format == :ewkb
         | 
| 98 | 
            +
                    @hex_format = opts_[:hex_format] ? true : false
         | 
| 99 | 
            +
                    @little_endian = opts_[:little_endian] ? true : false
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                  
         | 
| 102 | 
            +
                  
         | 
| 103 | 
            +
                  # Returns the format for type codes. See WKBGenerator for details.
         | 
| 104 | 
            +
                  def type_format
         | 
| 105 | 
            +
                    @type_format
         | 
| 106 | 
            +
                  end
         | 
| 107 | 
            +
                  
         | 
| 108 | 
            +
                  # Sets the format for type codes. See WKBGenerator for details.
         | 
| 109 | 
            +
                  def type_format=(value_)
         | 
| 110 | 
            +
                    @type_format = value_
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
                  
         | 
| 113 | 
            +
                  # Returns whether SRID is embedded. See WKBGenerator for details.
         | 
| 114 | 
            +
                  def emit_ewkb_srid?
         | 
| 115 | 
            +
                    @emit_ewkb_srid
         | 
| 116 | 
            +
                  end
         | 
| 117 | 
            +
                  
         | 
| 118 | 
            +
                  # Sets whether SRID is embedded. Available only when the type_format
         | 
| 119 | 
            +
                  # is <tt>:ewkb</tt>. See WKBGenerator for details.
         | 
| 120 | 
            +
                  def emit_ewkb_srid=(value_)
         | 
| 121 | 
            +
                    @emit_ewkb_srid = @type_format == :ewkb && value_
         | 
| 63 122 | 
             
                  end
         | 
| 64 123 |  | 
| 124 | 
            +
                  # Returns whether output is converted to hex.
         | 
| 125 | 
            +
                  # See WKBGenerator for details.
         | 
| 126 | 
            +
                  def hex_format?
         | 
| 127 | 
            +
                    @hex_format
         | 
| 128 | 
            +
                  end
         | 
| 129 | 
            +
                  
         | 
| 130 | 
            +
                  # Sets whether output is converted to hex.
         | 
| 131 | 
            +
                  # See WKBGenerator for details.
         | 
| 132 | 
            +
                  def hex_format=(value_)
         | 
| 133 | 
            +
                    @hex_format = value_ ? true : false
         | 
| 134 | 
            +
                  end
         | 
| 135 | 
            +
                  
         | 
| 136 | 
            +
                  # Returns whether output is little-endian (NDR).
         | 
| 137 | 
            +
                  # See WKBGenerator for details.
         | 
| 138 | 
            +
                  def little_endian?
         | 
| 139 | 
            +
                    @little_endian
         | 
| 140 | 
            +
                  end
         | 
| 141 | 
            +
                  
         | 
| 142 | 
            +
                  # Sets whether output is little-endian (NDR).
         | 
| 143 | 
            +
                  # See WKBGenerator for details.
         | 
| 144 | 
            +
                  def little_endian=(value_)
         | 
| 145 | 
            +
                    @little_endian = value_ ? true : false
         | 
| 146 | 
            +
                  end
         | 
| 147 | 
            +
                  
         | 
| 148 | 
            +
                  
         | 
| 149 | 
            +
                  # Generate and return the WKB format for the given geometry object,
         | 
| 150 | 
            +
                  # according to the current settings.
         | 
| 65 151 |  | 
| 66 152 | 
             
                  def generate(obj_)
         | 
| 67 153 | 
             
                    factory_ = obj_.factory
         | 
| @@ -87,13 +173,13 @@ module RGeo | |
| 87 173 | 
             
                      raise Errors::ParseError, "Unrecognized Geometry Type: #{type_}"
         | 
| 88 174 | 
             
                    end
         | 
| 89 175 | 
             
                    emit_srid_ = false
         | 
| 90 | 
            -
                    if @emit_ewkb_srid && toplevel_
         | 
| 91 | 
            -
                      type_code |= 0x20000000
         | 
| 92 | 
            -
                      emit_srid_ = true
         | 
| 93 | 
            -
                    end
         | 
| 94 176 | 
             
                    if @type_format == :ewkb
         | 
| 95 177 | 
             
                      type_code_ |= 0x80000000 if @cur_has_z
         | 
| 96 178 | 
             
                      type_code_ |= 0x40000000 if @cur_has_m
         | 
| 179 | 
            +
                      if @emit_ewkb_srid && toplevel_
         | 
| 180 | 
            +
                        type_code |= 0x20000000
         | 
| 181 | 
            +
                        emit_srid_ = true
         | 
| 182 | 
            +
                      end
         | 
| 97 183 | 
             
                    elsif @type_format == :wkb12
         | 
| 98 184 | 
             
                      type_code_ += 1000 if @cur_has_z
         | 
| 99 185 | 
             
                      type_code_ += 2000 if @cur_has_m
         | 
| @@ -169,7 +255,7 @@ module RGeo | |
| 169 255 | 
             
                  def _finish_emitter  # :nodoc:
         | 
| 170 256 | 
             
                    str_ = @cur_array.join
         | 
| 171 257 | 
             
                    @cur_array = nil
         | 
| 172 | 
            -
                    str_
         | 
| 258 | 
            +
                    @hex_format ? str_.unpack("H*")[0] : str_
         | 
| 173 259 | 
             
                  end
         | 
| 174 260 |  | 
| 175 261 |  |