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.


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

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


31
32
33
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 31

def projection_factory
  @projection_factory
end

Class Method Details

._coordsys_3857Object

:nodoc:


105
106
107
108
109
110
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 105

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:


97
98
99
100
101
102
103
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 97

def self._proj4_3857 # :nodoc:
  return unless CoordSys.supported?(:proj4)
  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

#limits_windowObject


91
92
93
94
95
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 91

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


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

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

#set_factories(geography_factory, projection_factory) ⇒ Object


26
27
28
29
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 26

def set_factories(geography_factory, projection_factory)
  @geography_factory = geography_factory
  @projection_factory = projection_factory
end

#unproject(geometry) ⇒ Object


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

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)

87
88
89
# File 'lib/rgeo/geographic/simple_mercator_projector.rb', line 87

def wraps?
  true
end