受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。请使用本站的偏移修正接口: 纠偏前的纬度值&lon=纠偏前的经度值
Google电子地图偏移的原理
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。
Google电子地图偏移的修正方法
知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x a,y b)提交给google map,google map再经过上面的算法处理后(x a-a,y b-b),显示在地图上的就是(x,y)了。
如何得到该点的偏移值(a,b)?
网上已经有人研究出了google获取偏移值的方法,接口地址为 ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。
为了简化操作,ant封装了该接口,可以提交经纬度到接口 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
zoom: 这个值在做坐标运算时需要用到。
offset_x: 指定经纬度X方向的偏移值
offset_y:指定经纬度Y方向的偏移值
有了这三个值就可以在google map里修正坐标了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
function convertCoord(vertex,zoom,offsetX,offsetY)
{
var projection = gMap.getCurrentMapType().getProjection();
var point = projection.fromLatLngToPixel(vertex, zoom);
point = new GPoint(point.x offsetX, point.y offsetY);
vertex = projection.fromPixelToLatLng(point, zoom);
return vertex;
}
var point = new GLatLng(lat,lng);//原经纬度点
var zoom=18;
var offset_x=100;
var offset_y=200;
//修正经纬度
point=convertCoord(point,zoom,offset_x,offset_y);
// |
效果测试
之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。
未修正的地图(电子地图和卫星地图不一致)
下面是修正后的地图(电子地图和卫星地图一致)
从测试效果来看,使用该修正方法可以完美的解决google地图偏移的问题。