Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 95 lines (82 sloc) 2.489 kb
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 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 84 85 86 87 88 89 90 91 92 93 94
/*------------------------------------------------------------------------------
*
* This file is part of rendermq
*
* Author: artem@mapnik-consulting.com
*
* Copyright 2010-1 Mapquest, Inc. All Rights reserved.
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*-----------------------------------------------------------------------------*/

#ifndef SPHERICAL_MERCATOR_HPP
#define SPHERICAL_MERCATOR_HPP

#ifndef M_PI
#define M_PI 3.141592653589793238462643
#endif

#define RAD_TO_DEG (180/M_PI)
#define DEG_TO_RAD (M_PI/180)

#include <cmath>

namespace rendermq
{

template <int levels=19>
class spherical_mercator
{
    double Ac[levels];
    double Bc[levels];
    double Cc[levels];
    double zc[levels];
    
public:
    spherical_mercator()
    {
        int d, c = 256;
        for (d=0; d<levels; d++) {
            int e = c/2;
            Bc[d] = c/360.0;
            Cc[d] = c/(2 * M_PI);
            zc[d] = e;
            Ac[d] = c;
            c *=2;
        }
    }
    
    void to_pixels(double &x, double &y, int zoom)
    {
        double d = zc[zoom];
        double f = minmax(std::sin(DEG_TO_RAD * y),-0.9999,0.9999);
        x = round(d + x * Bc[zoom]);
        y = round(d + 0.5*std::log((1+f)/(1-f))*-Cc[zoom]);
    }
    
    void from_pixels(double &x, double &y, int zoom)
    {
        double e = zc[zoom];
        double g = (y - e)/-Cc[zoom];
        x = (x - e)/Bc[zoom];
        y = RAD_TO_DEG * ( 2 * atan(exp(g)) - 0.5 * M_PI);
    }

private:
    double minmax(double a, double b, double c)
    {
#define LOCAL_MIN(x,y) ((x)<(y)?(x):(y))
#define LOCAL_MAX(x,y) ((x)>(y)?(x):(y))
        a = LOCAL_MAX(a,b);
        a = LOCAL_MIN(a,c);
        return a;
#undef LOCAL_MIN
#undef LOCAL_MAX
    }
};

}

#endif //SPHERICAL_MERCATOR_HPP
Something went wrong with that request. Please try again.