谷歌地图瓦片相关操作(js,google Maps v3)

前段时间,由于工作原因,研究了谷歌地图的瓦片相关操作。已知一个点的经纬度和地图级别,获取该点所在的瓦片的url;已知一个瓦片的url,计算该瓦片左上角经纬度;已知一个点经纬度和地图级别,计算这个点在世界地图上的像素值。

1、已知一个点的经纬度和地图级别,获取该点所在的瓦片的url

参考了两篇博客:这个博客(http://blog.csdn.net/lijun_xiao2009/article/details/8178578)中的原理,但是使用到的公式太难算了,就结合了另一篇博客(http://blog.csdn.net/zhaobmox/article/details/1253005)里面的运算。

//管理瓦片路径
function CalculationUrl(Val_lat,Val_lng)
{
	Val_lng = parseFloat(Val_lng);
	Val_lat = parseFloat(Val_lat);
	
	var Val_zoom = MapAttr.CUTZOOM;//地图级别,设置为了全局变量
	var zoomN = Math.pow(2,Val_zoom);
	
	var x = CalculationLng(Val_lng);
	var y = CalculationLat(Val_lat);
	//UrlDiv
	var url_x = x*zoomN;
	var url_y = y*zoomN;
	
	return [Math.floor(url_x),Math.floor(url_y)];
	
}

//根据经度计算瓦片x值
function CalculationLng(lng)
{
	var x = (180.0 + parseFloat(lng)) / 360.0;
	return x;
}

//根据纬度计算瓦片y值
function CalculationLat(lat)
{
	var PI = Math.PI;//3.1415926535897;
	var y = -parseFloat(lat) * PI / 180; 
	y = 0.5 * Math.log((1+Math.sin(y)) / (1 - Math.sin(y)));
	y *= 1.0/(2 * PI); 
	y += 0.5;
	return y;
}

将得到的数据拼成“.../‘+zoom+‘/‘+x+‘/‘+y+‘.png‘”,zoom是地图级别,xy是刚才计算出来的数据。

2、已知一个瓦片的url,计算该瓦片左上角经纬度

参考了博客:http://www.cnblogs.com/Tangf/archive/2012/04/07/2435545.html

function CalculationLatlng(x,y)
{
	var PI = Math.PI;
	var zoomN = Math.pow(2,MapAttr.CUTZOOM);//地图级别,设置为全局变量
	
	var lng = x/zoomN*360.0-180.0;
	var a = PI*(1-2*y/zoomN);
	var e = Math.E;
	var rad = (Math.pow(e,a)-Math.pow(e,-a))*0.5
	var latrad = Math.atan(rad);
	var lat = latrad*180.0/PI;
	return {"lat":lat,"lng":lng};
}

3、已知一个点经纬度和地图级别,计算这个点在世界地图上的像素值

参考了百度文库:http://wenku.baidu.com/link?url=LG31kM26TJHtYTmBkWMQ92lNEu7P-aUKEowFrEj62Rbsgrc7SiVe9vk2RQ64Sk0dlMvfs1zeiDMx44skLxVZYcT_nJw2guhJQyXksXBvmaK

//计算一个点的在世界地图上的像素值
function CalculationPixelDistance(lat,lng)
{
	var zoom = MapAttr.CUTZOOM;<span style="font-family: Arial, Helvetica, sans-serif;">//地图级别,设置为全局变量</span>

	
	//该坐标相对世界地图的第一片瓦片的像素
	var X = lngToPixel_x(lng,zoom);
	var Y = latToPixel_y(lat,zoom);

	return {x:Math.floor(X),y:Math.floor(Y)};
}

//根据经度计算x像素值
function lngToPixel_x(lng,zoom)
{
	return (lng+180)*(256<<zoom)/360;
}

//根据纬度计算y像素值
function latToPixel_y(lat,zoom)
{
	var siny = Math.sin(lat*Math.PI/180);
	var y = Math.log((1+siny)/(1-siny))
	return (128<<zoom)*(1-y/(2*Math.PI));
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。