1. 基础介绍
在线地图服务提供的图片下载和组织方式与google map基本相同。下载图片时,客户端需要指定缩放级别和下载图片的 tile 编号(即
tile所在的行号和列号),下载完成后自行拼装成前台显示的地图。
Tile与显示窗口的关系如下图所示:
黄色小方块表示一个tile,大小固定,一般取256*256。
红色方框表示前端的地图显示窗口。
紫色方框表示为了完成地图显示窗口的地图拼装所需要下载的 tile组。
2. 坐标转换方法
2.1 基本换算
1) 墨卡托正变换 通过墨卡托投影法将球面经纬度坐标变换成平面坐标:
public static Point2D convertLonLat2MercXY(LonLat lonlat)
{
Point2D result = new Point2D();
result.X = lonlat.lon * DEG2RAD;
double phi = lonlat.lat * DEG2RAD;
result.Y = 0.5 * Math.log((1 + Math.sin(phi)) / (1 - Math.sin(phi)));
return (result);
}
其中的数据结构和常量定义如下:
public class LonLat {
public double lon;
public double lat;
}
public class Point2D {
public double X;
public double Y;
}
// 度换算成弧度
public static double DEG2RAD = 0.017453293;
2) 墨卡托逆变换将墨卡托平面坐标变换成经纬度坐标:
public static LonLat convertMercXY2LonLat(Point2D mercXY){
LonLat result = new LonLat();
result.lon = mercXY.X / DEG2RAD;
result.lat = Math.atan(Math.sinh(mercXY.Y)) / DEG2RAD;
return (result);
}
3) 墨卡托坐标到pixel坐标的变换根据显示级别和墨卡托坐标,取得像素坐标:
public