直接上代码:
头文件;
#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);
}