|
没听说过什么是火星坐标吧 :-)
http://www.anttna.com/archives/468.html
受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。
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里修正坐标了
查看源代码打印帮助01 function convertCoord(vertex,zoom,offsetX,offsetY)
02 {
03 var projection = gMap.getCurrentMapType().getProjection();
04 var point = projection.fromLatLngToPixel(vertex, zoom);
05 point = new GPoint(point.x + offsetX, point.y + offsetY);
06 vertex = projection.fromPixelToLatLng(point, zoom);
07 return vertex;
08 }
09
10 var point = new GLatLng(lat,lng);//原经纬度点
11
12 //通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据
13 var zoom=18;
14 var offset_x=100;
15 var offset_y=200;
16 //修正经纬度
17 point=convertCoord(point,zoom,offset_x,offset_y);
18 //
效果测试
之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。
未修正的地图(电子地图和卫星地图不一致)
下面是修正后的地图(电子地图和卫星地图一致)
从测试效果来看,使用该修正方法可以完美的解决google地图偏移的问题。 |
|