mapTile C++ 实现 分级缩放

1 篇文章 0 订阅

直接上代码:

头文件;

#include <math.h>
#include <iostream>
class MapTool
{
public:
    MapTool(void);

    float Resolution(int zoom);
    void LatLonToMeters(double lat,double lon,float &mx,float &my);//Converts given lat/lon in WGS84 Datum to XY in Spherical Mercator EPSG:900913
    
    void MetersToLatLon(float mx,float my,double &lat,double &lon);//Converts XY point from Spherical Mercator EPSG:900913 to lat/lon in WGS84 Datum

    void PixelsToMeters(float px,float py,int zoom,float &mx,float &my);//Converts pixel coordinates in given zoom level of pyramid to EPSG:900913

    void MetersToPixels(float mx,float my,int zoom,float &px,float &py);

    void PixelsToTile(float px,float py,int &tx,int &ty);

    void PixelsToRaster(float px, float py, int zoom,float &rx,float &ry);

    void MetersToTile(float mx,float my,int zoom,int &tx,int &ty);

    void TileBounds(int tx,int ty,int zoom,float &minx,float &maxx,float &miny,float &maxy);

    void TileLatLonBounds(int tx,int ty,int zoom,double &minLat,double &maxLat,double &minLon,double &maxLon);

    int ZoomForPixelSize(float pixelSize);

    void GoogleTile(int tx,int ty,int zoom,int &tx1,int &ty1);

    std::string xyz_to_Quad(int x,int y,int zoom);

    void Quad_to_xyz(std::string quad,int &x,int &y,int &lev);

    void LatLon2GoogleTile(double lat,double lon,int zoom,int &x,int &y);

    
    ~MapTool(void);

public:
    int tilesize;
    int initialResolution;
    float originShift;
};


CPP:

#include "MapTool.h"
#include <math.h>

MapTool::MapTool(void)
{
    tilesize = 256;
    initialResolution = 2*3.1415926*6378137/tilesize;
    originShift = 2*3.1415926*6378137/2.0;
}


float MapTool::Resolution( int zoom )
{
    return initialResolution / (pow(2.0,zoom));
}

MapTool::~MapTool(void)
{
}

void MapTool::LatLonToMeters(double lat,double lon,float &mx,float &my)
{
    mx = lon*originShift/180.0;
    my = log(tan((90+lat)*3.1415926/360.0))/(3.1415926/180.0);
    my = my * originShift/ 180.0;
}

void MapTool::MetersToLatLon( float mx,float my,double &lat,double &lon )
{
    lon = (mx/originShift)*180.0;
    lat = (my/originShift)*180.0;
    lat = 180/3.1415926*(2*atan(exp(lat * 3.1415926 / 180.0)))-3.1415926/2.0;
}

void MapTool::PixelsToMeters( float px,float py,int zoom,float &mx,float &my )
{
        float res = Resolution(zoom);
        mx = px * res-originShift;
        my = py * res-originShift;
}

void MapTool::MetersToPixels(float mx,float my,int zoom,float &px,float &py)
{
    float res = Resolution(zoom);
    px = (mx+originShift)/res;
    py = (my+originShift)/res;
}

void MapTool::PixelsToTile( float px,float py,int &tx,int &ty )
{
    tx = (int)(ceil(px/float(tilesize)))-1;
    ty = (int)(ceil(py/float(tilesize)))-1;
}

void MapTool::PixelsToRaster( float px, float py, int zoom,float &rx,float &ry )
{
    float mapsize = tilesize<<zoom;
    rx = px;
    ry = mapsize-py;
}

void MapTool::MetersToTile( float mx,float my,int zoom,int &tx,int &ty )
{
    float px ,py;
    MetersToPixels(mx,my,zoom,px,py);
    PixelsToTile(px,py,tx,ty);
}

void MapTool::TileBounds( int tx,int ty,int zoom,float &minx,float &maxx,float &miny,float &maxy )
{
    
    PixelsToMeters(tx*tilesize,ty * tilesize, zoom,minx,miny);
    PixelsToMeters((tx + 1) * tilesize, (ty + 1) * tilesize, zoom,maxx,maxy);
}

void MapTool::TileLatLonBounds( int tx,int ty,int zoom,double &minLat,double &maxLat,double &minLon,double &maxLon )
{
    float minx,maxx,miny,maxy;
    TileBounds(tx,ty,zoom,minx,maxx,miny,maxy);
    MetersToLatLon(minx,miny,minLat,minLon);
    MetersToLatLon(maxx,maxy,maxLat,maxLon);

}

int MapTool::ZoomForPixelSize( float pixelSize )
{
    for(int i=0;i<30;i++)
    {
        if(pixelSize>Resolution(i))
        {
            if(i!=0)
            {
                return i-1;
            }
            else
                return 0;
        }
    }
}

void MapTool::GoogleTile( int tx,int ty,int zoom,int &tx1,int &ty1 )
{
    tx1 = tx;
    ty1 = pow(2.0,zoom)-1-ty;
}

std::string MapTool::xyz_to_Quad( int x,int y,int lev )
{
    std::string  quadKey;
    for (int i = lev; i > 0; i--)
    {
        char digit = '0';
        int mask = 1 << (i - 1);
        if ((x & mask) != 0)
        {
            digit++;
        }
        if ((y & mask) != 0)
        {
            digit++;
            digit++;
        }
        quadKey.append(&digit);
    }
    return quadKey;
}

void MapTool::Quad_to_xyz( std::string quad,int &x,int &y,int &lev )
{
    x = y = 0;
    lev = quad.length();
    for (int i = lev; i > 0; i--)
    {
        int mask = 1 << (i - 1);
        switch (quad[lev - i])
        {
        case '0':
            break;

        case '1':
            x |= mask;
            break;

        case '2':
            y |= mask;
            break;

        case '3':
            x |= mask;
            y |= mask;
            break;

        default:
            break;
        }
    }
}

void MapTool::LatLon2GoogleTile( double lat,double lon,int zoom,int &x,int &y )
{
    float mx,my;
    LatLonToMeters(lat,lon,mx,my);
    int tx,ty;
    MetersToTile(mx,my,zoom,tx,ty);
    GoogleTile(tx,ty,zoom,x,y);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值