完美解决Google电子地图偏移问题
受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。最新计算偏移方法详见:http://www.anttna.com/archives/641.html
本站的偏移查询接口仍然有效: http://www.anttna.com/goffset/goffset.php
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获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
zoom: 这个值在做坐标运算时需要用到。
offset_x: 指定经纬度X方向的偏移值
offset_y:指定经纬度Y方向的偏移值
有了这三个值就可以在google map里修正坐标了
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);//原经纬度点
//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据
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地图偏移的问题。



您好,问下,我弄flex map 根据你的方法,普通地图的是偏移校正,可是,卫星地图位置却改变了,为什么,+我QQ414057823 请教了!!!
@王伟军
做偏移校正后,google map的地图数据源要设为ditu.google.cn 。
如果用maps.google.com就会出现电子地图和卫星地图不一致的情况。
google map flash用的是maps.google.com,现在还没找到flash中可以更改数据源为ditu.google.cn的方法。
那现在网站上的地图结果修正过来了?
嗯。大致试了一下,是比以前精确多了。看看以前共享的足迹就知道了。
@ant
难道我要在切换地图type的时候,重新生成点添加到地图上?
@王伟军
嗯,这个方法可行
@ant
能不能有更好的方法,将ditu.google.cn的数据源当做自定义图,add到flex地图里面,就是我不知道ditu.google.cn的图瓦链接地址生成算法,请教下~~谢谢
@ant
ant,我把ditu.google.cn 的卫星图跟电子地图的png 通过flex google maps 的自定义图,添加到flex地图里面了,就差一点两个如何混合
@王伟军
卫星图跟电子地图的png是用google静态地图api得到的吗?
google静态地图也可以获取混合地图图像,把混合地图的png加进去就行了
@王伟军
我是用重绘点的方法解决flash版google map地图不一致的问题。现在也是差混合地图的问题没解决。
flash版修正效果:http://www.anttna.com/archives/263.html
@ant
http://www.anttna.com/archives/263.html这个效果就是我想要得到的效果,很强势,ditu.google.cn的地图数据源,我是通过felx google map api 继承TileLayerBase并重载里面的loadTile(加载图瓦)方法得到的
@ant ant,请教下 http://www.anttna.com/archives/263.html 这个效果的做法,很感兴趣,加我QQ414057823 ,好吗?
@ant
ant ,flash 的修正效果,你是不是先在得到GPS数据,在地图上显示的时候通过其中一点得到该地图的偏移值,然后整体偏移生成marker跟polyline,然后在切换地图的时候,重新生成真实GPS数据的marker跟polyline?
@ant
ant ,flash 的修正效果,你是不是先在得到GPS数据,在地图上显示的时候通过其中一点得到该地区的偏移值,然后整体偏移生成marker跟polyline,然后在切换地图到混合地图跟卫星地图的时候,重新生成真实GPS数据的marker跟polyline?