前段时间,由于工作原因,研究了谷歌地图的瓦片相关操作。已知一个点的经纬度和地图级别,获取该点所在的瓦片的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)); }
时间: 2024-10-24 14:14:49