# Code coverage report for src/geo/projection/Projection.Mercator.js

## Statements: 100% (12 / 12) Branches: 100% (2 / 2) Functions: 100% (2 / 2) Lines: 100% (12 / 12)

All files » src/geo/projection/ » Projection.Mercator.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    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
    57

    1

    8

    8

    8
    8

    8

    4

    4
    4
    4

    4

    4

     /*
     * Mercator projection that takes into account that the Earth is not a perfect sphere.
     * Less popular than spherical mercator; used by projections like EPSG:3395.
     */

    L.Projection.Mercator = {
    	MAX_LATITUDE: 85.0840591556,

    	R_MINOR: 6356752.3142,
    	R_MAJOR: 6378137,

    	project: function (latlng) { // (LatLng) -> Point
    		var d = L.LatLng.DEG_TO_RAD,
    		    max = this.MAX_LATITUDE,
    		    lat = Math.max(Math.min(max, latlng.lat), -max),
    		    r = this.R_MAJOR,
    		    r2 = this.R_MINOR,
    		    x = latlng.lng * d * r,
    		    y = lat * d,
    		    tmp = r2 / r,
    		    eccent = Math.sqrt(1.0 - tmp * tmp),
    		    con = eccent * Math.sin(y);

    		con = Math.pow((1 - con) / (1 + con), eccent * 0.5);

    		var ts = Math.tan(0.5 * ((Math.PI * 0.5) - y)) / con;
    		y = -r2 * Math.log(ts);

    		return new L.Point(x, y);
    	},

    	unproject: function (point) { // (Point, Boolean) -> LatLng
    		var d = L.LatLng.RAD_TO_DEG,
    		    r = this.R_MAJOR,
    		    r2 = this.R_MINOR,
    		    lng = point.x * d / r,
    		    tmp = r2 / r,
    		    eccent = Math.sqrt(1 - (tmp * tmp)),
    		    ts = Math.exp(- point.y / r2),
    		    phi = (Math.PI / 2) - 2 * Math.atan(ts),
    		    numIter = 15,
    		    tol = 1e-7,
    		    i = numIter,
    		    dphi = 0.1,
    		    con;

    		while ((Math.abs(dphi) > tol) && (--i > 0)) {
    			con = eccent * Math.sin(phi);
    			dphi = (Math.PI / 2) - 2 * Math.atan(ts *
    			            Math.pow((1.0 - con) / (1.0 + con), 0.5 * eccent)) - phi;
    			phi += dphi;
    		}

    		return new L.LatLng(phi * d, lng);
    	}
    };