Class: RGeo::Geographic::SimpleMercatorProjector

Inherits:
Object
  • Object
show all
Defined in:
lib/rgeo/geographic/simple_mercator_projector.rb

Overview

:nodoc:

Constant Summary collapse

EQUATORIAL_RADIUS =
6_378_137.0

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(geography_factory_, opts_ = {}) ⇒ SimpleMercatorProjector

Returns a new instance of SimpleMercatorProjector.



12
13
14
15
16
17
18
19
20
21
22
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 12

def initialize(geography_factory_, opts_ = {})
  @geography_factory = geography_factory_
  @projection_factory = Cartesian.preferred_factory(srid: 3857,
                                                    proj4: SimpleMercatorProjector._proj4_3857,
                                                    coord_sys: SimpleMercatorProjector._coordsys_3857,
                                                    buffer_resolution: opts_[:buffer_resolution],
                                                    lenient_multi_polygon_assertions: opts_[:lenient_multi_polygon_assertions],
                                                    uses_lenient_assertions: opts_[:uses_lenient_assertions],
                                                    has_z_coordinate: opts_[:has_z_coordinate],
                                                    has_m_coordinate: opts_[:has_m_coordinate])
end

Instance Attribute Details

#projection_factoryObject (readonly)

Returns the value of attribute projection_factory.



29
30
31
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 29

def projection_factory
  @projection_factory
end

Class Method Details

._coordsys_3857Object

:nodoc:



102
103
104
105
106
107
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 102

def self._coordsys_3857 # :nodoc:
  unless defined?(@coordsys_3857)
    @coordsys_3857 = CoordSys::CS.create_from_wkt('PROJCS["Popular Visualisation CRS / Mercator",GEOGCS["Popular Visualisation CRS",DATUM["Popular_Visualisation_Datum",SPHEROID["Popular Visualisation Sphere",6378137,0,AUTHORITY["EPSG","7059"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6055"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4055"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],AUTHORITY["EPSG","3785"],AXIS["X",EAST],AXIS["Y",NORTH]]')
  end
  @coordsys_3857
end

._proj4_3857Object

:nodoc:



95
96
97
98
99
100
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 95

def self._proj4_3857 # :nodoc:
  unless defined?(@proj4_3857)
    @proj4_3857 = CoordSys::Proj4.create("+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs")
  end
  @proj4_3857
end

Instance Method Details

#_set_factories(geography_factory_, projection_factory_) ⇒ Object

:nodoc:



24
25
26
27
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 24

def _set_factories(geography_factory_, projection_factory_) # :nodoc:
  @geography_factory = geography_factory_
  @projection_factory = projection_factory_
end

#limits_windowObject



89
90
91
92
93
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 89

def limits_window
  @limits_window ||= ProjectedWindow.new(@geography_factory,
    -20_037_508.342789, -20_037_508.342789, 20_037_508.342789, 20_037_508.342789,
    is_limits: true)
end

#project(geometry_) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 31

def project(geometry_)
  case geometry_
  when Feature::Point
    rpd_ = ImplHelper::Math::RADIANS_PER_DEGREE
    radius_ = EQUATORIAL_RADIUS
    @projection_factory.point(geometry_.x * rpd_ * radius_,
      ::Math.log(::Math.tan(::Math::PI / 4.0 + geometry_.y * rpd_ / 2.0)) * radius_)
  when Feature::Line
    @projection_factory.line(project(geometry_.start_point), project(geometry_.end_point))
  when Feature::LinearRing
    @projection_factory.linear_ring(geometry_.points.map { |p_| project(p_) })
  when Feature::LineString
    @projection_factory.line_string(geometry_.points.map { |p_| project(p_) })
  when Feature::Polygon
    @projection_factory.polygon(project(geometry_.exterior_ring),
                                geometry_.interior_rings.map { |p_| project(p_) })
  when Feature::MultiPoint
    @projection_factory.multi_point(geometry_.map { |p_| project(p_) })
  when Feature::MultiLineString
    @projection_factory.multi_line_string(geometry_.map { |p_| project(p_) })
  when Feature::MultiPolygon
    @projection_factory.multi_polygon(geometry_.map { |p_| project(p_) })
  when Feature::GeometryCollection
    @projection_factory.collection(geometry_.map { |p_| project(p_) })
  end
end

#unproject(geometry_) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 58

def unproject(geometry_)
  case geometry_
  when Feature::Point
    dpr_ = ImplHelper::Math::DEGREES_PER_RADIAN
    radius_ = EQUATORIAL_RADIUS
    @geography_factory.point(geometry_.x / radius_ * dpr_,
      (2.0 * ::Math.atan(::Math.exp(geometry_.y / radius_)) - ::Math::PI / 2.0) * dpr_)
  when Feature::Line
    @geography_factory.line(unproject(geometry_.start_point), unproject(geometry_.end_point))
  when Feature::LinearRing
    @geography_factory.linear_ring(geometry_.points.map { |p_| unproject(p_) })
  when Feature::LineString
    @geography_factory.line_string(geometry_.points.map { |p_| unproject(p_) })
  when Feature::Polygon
    @geography_factory.polygon(unproject(geometry_.exterior_ring),
      geometry_.interior_rings.map { |p_| unproject(p_) })
  when Feature::MultiPoint
    @geography_factory.multi_point(geometry_.map { |p_| unproject(p_) })
  when Feature::MultiLineString
    @geography_factory.multi_line_string(geometry_.map { |p_| unproject(p_) })
  when Feature::MultiPolygon
    @geography_factory.multi_polygon(geometry_.map { |p_| unproject(p_) })
  when Feature::GeometryCollection
    @geography_factory.collection(geometry_.map { |p_| unproject(p_) })
  end
end

#wraps?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 85

def wraps?
  true
end