`
modabobo
  • 浏览: 508362 次
文章分类
社区版块
存档分类
最新评论

将地图坐标转换成GPS坐标的简单算法

 
阅读更多

丽水市汽车运输集团股份有限公司信息中心 苟安廷

由于天朝上国的特色,我们接收到的GPS坐标并不是真实的坐标,而是GPS设备按照国家加密算法进行加偏以后的坐标,这个算法是一致的,和具体GPS设备无关,收到GPS坐标后,我们不能直接把这个坐标显示到电子地图上,因为每种电子地图会在此基础上进行二次加偏,也就是说,我们必须把GPS坐标转换成地图对应的地图坐标,才能正确显示出来,这样,我们将接触到三个坐标:真实坐标、在真实坐标基础上加偏的GPS坐标、在GPS加偏基础上再加偏的地图坐标。GPS设备收到真实坐标后,会按统一算法加偏,得到GPS坐标,并传给我们,这个过程是硬件完成的,我们将收到的GPS加偏坐标,按每种地图提供的纠偏接口,转换成地图坐标,再显示到地图上。GPS本身的加偏算法是一样的,尽管我们并不知道具体怎么算的,但不同地图二次加偏的算法不一样,我们只有拿到该地图对应的加偏算法才能在该地图上正确显示位置信息,这个过程我们通常称之为纠偏,每种地图都有自己的纠偏接口,也就是将GPS坐标转换成该地图对应的地图坐标,关于百度地图纠偏的方法,请参加我的另外一篇博客:http://blog.csdn.net/gatr/article/details/9569189,但这些纠偏方法,都没有提供逆向的,也就是说没有将地图坐标转换成GPS坐标的直接方法,而这种需求往往又是必须的,比如,我们有一个百度地图的坐标,需要正确显示到谷歌地图上,显然,无法直接将百度地图坐标转换成谷歌地图坐标,最理想的方式,就是先把百度坐标转换成GPS坐标,然后,再把GPS坐标转换成谷歌坐标。

我们知道,地图坐标加偏是非线性的,也就是说,不同区域,偏移量不一样,但同一个区域,偏移量却差不多,因此,我们只要找到该区域的偏移量,就可以反算GPS坐标了,那么,如何找到偏移量呢?一个简单的办法,就是把当前地图坐标当成GPS坐标来使用,然后以此计算出对应地图的地图坐标,最后,将原坐标和新得到的坐标相减,就得到了偏移了,既然有了偏移,将该偏移和原坐标叠加,就反算出了对应的GPS坐标了。为了使用整数表示,我们参照GPS通用做法,将经纬度分别乘以一百万,示例代码如下(不同地图加偏方式不一样,这里,我们用一个方法模拟):

/// <summary>

/// 模拟地图纠偏,每种地图纠偏算法参照对应的接口

/// </summary>

/// <param name="p">GPS坐标</param>

/// <returns>对应的地图坐标</returns>

private Point GpsToMap(Point p)

{

return new Point(p.X - 1000, p.Y - 500);

}

/// <summary>

/// 将地图坐标转还原为GPS坐标

/// </summary>

/// <param name="p">当前地图坐标</param>

/// <returns>GPS坐标</returns>

private Point MapToGps(Point p)

{

//将当前地图坐标,当成GPS坐标使用,根据地图转换接口,得到地图坐标

Point temp = GpsToMap(p);

//用当前坐标(模拟的GPS坐标)减去得到的地图坐标,得到偏移

int offX = p.X - temp.X;

int offY = p.Y - temp.Y;

//根据地图坐标与偏移的叠加,反算出GPS坐标,并返回

return new Point(p.X + offX, p.Y + offY);

}

//测试代码

private void button1_Click(object sender, EventArgs e)

{

/定义一个GPS坐标

Point ptTest = new Point(120123456, 28123456);

//模拟纠偏得到地图坐标

Point pt1 = GpsToMap(ptTest);

//根据地图坐标,反算出GPS坐标,我们可以看到,pt2ptTest相同

Point pt2 = MapToGps(pt1);

}

上面的代码实现了将地图坐标转换成GPS坐标的功能,需要注意的是,实际使用时,同样的GPS坐标,每次调用地图纠偏接口时,得到的地图坐标都可能不一样,都有一定的随机误差,因此,不要指望这种转换是严格一对一的,实际只能是近似值而已。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics