您的位置:首页 > 编程语言 > Go语言

Google map EPSG:900913 地图分块算法、切片算法个人解析。一看就明白哈

2012-09-27 18:25 435 查看
Google map 地图分块算法的解析 EPSG:900913

我下面的小伙子总是不明白map api,这块算法原理。我想很多人也一样,所以写一下说明一下哈

projection: "EPSG:900913", //投影为 900913,google 墨卡托投影 units: "m", //屏幕坐标以米为单位

maxResolution: 156543.0339, //最大比例下的每像素屏幕地图单位值 maxExtent: new OpenLayers.Bounds(-20037508, -20037508,20037508, 20037508.34), numZoomLevels: 17。 这是openlayer中的说明,大多人看不懂哈

解释开始:

1、先了解一个常量,世界一张图。一个像素代表多少米

世界范围,一个256*256的图 就是一个世界地图(如下)。 1个像素代表的米数就是 156543.0339。下面这图的面积就是=世界面积=156543.0339*256 * 156543.0339*256



2、其实全世界墨卡托范围是 -20037508, -20037508,20037508, 20037508.34 ,从第四象限到第一象限

其实这个值很简单,就是 -20037508 = -156543.0339*128 ; 为什么称128 呢? 因为 他是256的一半,所以一个像素*128正好代表一个象限的长度,也就是世界的一半长度。

3、切片的级别,比例尺级别

我们一般考虑切片到 18级别 ,maxZoomLevel = 18; 也就是说 世界一张图,被放大到 2的18次方倍哈。宽度、高度同时放大到2的18次方倍

我们用这个函数就可以知道 每个比例尺下,每个像素代表多少米啦。那我们18级别一个像素代表的米为:0.5971642833709717 (一像素不到一米哈)

Map.getZoomUnits = function(zoom)

{

var zu = [0,0];

var a = Math.pow(2,(18-zoom));

zu[0] = 0.5971642833709717 * a;

zu[1] = 0.5971642833709717 * a;

return zu;

};

4、根据墨卡托经纬度定位到x ,y ,z块号。

用点所在的墨卡托 减去 之前的基础墨卡托值,得到相对绝对距离米,再用这个 总米 / 当前比例尺每块代表的米 就知道是在哪一xy块啦

中国一般在第一象限哈

SE.Map.prototype.toMapId = function(point,zoom)

{

var x=point.MercatorLng-156543.0339*128;

var y=-156543.0339*128-point.MercatorLat;

var zu = this.getZoomUnits(zoom,true);

var spanX = zu[0]*256;//zu[0]为1px代表的纬度,this.imgSize为加载的图片大小(256)

var spanY = zu[1]*256;//zu[1]为1px代表的经度,this.imgSize为加载的图片大小(256)

var bx=parseInt(x/spanX);

var by=parseInt(y/spanY);

return [bx,by,(x-bx*spanX)/spanX*this.imgSize,(y-by*spanY)/spanY*this.imgSize];

};

附上:经纬度转84、84转经纬度 算法函数:

/**

w84转为墨卡托坐标(经纬度转墨卡托)

WGS84是地理坐标的一种,地理坐标本身有很多种,web墨卡托是投影坐标

lon : w84经度

lat : w84纬度

*/

PG.Tool.forwardMercator = function(lon, lat) {

lon = parseFloat(lon);

lat = parseFloat(lat);

var x = lon * 20037508.34 / 180;

var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);

y = y * 20037508.34 / 180;

return [x,y];

};

/**

将墨卡托坐标转为w84(墨卡托转经纬度)

x : 墨卡托经度

y : 墨卡托纬度

*/

PG.Tool.inverseMercator = function(x, y) {

var lon = (x / 20037508.34) * 180;

var lat = (y / 20037508.34) * 180;

lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);

return [lon, lat];

};

OK,明白了吧! 其实就是个世界范围 和 平方的关系。有问题联系我哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: