首页 > 网络相关 > 完美解决Google电子地图偏移问题

完美解决Google电子地图偏移问题

2010年1月13日 ant 发表评论 阅读评论 3,604 views

受中国的一些政策法规的限制,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地图偏移的问题。

  1. 王伟军
    2010年1月13日14:07 | #1

    您好,问下,我弄flex map 根据你的方法,普通地图的是偏移校正,可是,卫星地图位置却改变了,为什么,+我QQ414057823 请教了!!!

  2. 2010年1月13日14:54 | #2

    @王伟军
    做偏移校正后,google map的地图数据源要设为ditu.google.cn 。
    如果用maps.google.com就会出现电子地图和卫星地图不一致的情况。
    google map flash用的是maps.google.com,现在还没找到flash中可以更改数据源为ditu.google.cn的方法。

  3. lain
    2010年1月17日14:56 | #3

    那现在网站上的地图结果修正过来了?

  4. lain
    2010年1月17日15:02 | #4

    嗯。大致试了一下,是比以前精确多了。看看以前共享的足迹就知道了。

  5. 王伟军
    2010年1月21日15:36 | #5

    @ant
    难道我要在切换地图type的时候,重新生成点添加到地图上?

  6. 2010年1月23日22:50 | #6

    @王伟军
    嗯,这个方法可行

  7. 伟军
    2010年1月26日21:58 | #7

    @ant
    能不能有更好的方法,将ditu.google.cn的数据源当做自定义图,add到flex地图里面,就是我不知道ditu.google.cn的图瓦链接地址生成算法,请教下~~谢谢

  8. 王伟军
    2010年1月28日09:51 | #8

    @ant
    ant,我把ditu.google.cn 的卫星图跟电子地图的png 通过flex google maps 的自定义图,添加到flex地图里面了,就差一点两个如何混合

  9. 2010年1月28日21:48 | #9

    @王伟军
    卫星图跟电子地图的png是用google静态地图api得到的吗?
    google静态地图也可以获取混合地图图像,把混合地图的png加进去就行了

  10. 2010年1月28日22:03 | #10

    @王伟军
    我是用重绘点的方法解决flash版google map地图不一致的问题。现在也是差混合地图的问题没解决。
    flash版修正效果:http://www.anttna.com/archives/263.html

  11. 王伟军
    2010年2月1日13:46 | #11
  12. 王伟军
    2010年2月1日13:49 | #12

    @ant ant,请教下 http://www.anttna.com/archives/263.html 这个效果的做法,很感兴趣,加我QQ414057823 ,好吗?

  13. 王伟军
    2010年2月1日13:58 | #13

    @ant
    ant ,flash 的修正效果,你是不是先在得到GPS数据,在地图上显示的时候通过其中一点得到该地图的偏移值,然后整体偏移生成marker跟polyline,然后在切换地图的时候,重新生成真实GPS数据的marker跟polyline?

  14. 王伟军
    2010年2月1日14:00 | #14

    @ant
    ant ,flash 的修正效果,你是不是先在得到GPS数据,在地图上显示的时候通过其中一点得到该地区的偏移值,然后整体偏移生成marker跟polyline,然后在切换地图到混合地图跟卫星地图的时候,重新生成真实GPS数据的marker跟polyline?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.