Mapbar经纬坐标偏移的加/解密算法

具本人研究所知,Mapbar地图的成图算法并不难懂,并且它的地图成图算法没有进行加密(效果就是整个地图有一定的偏移,实际上它的成图是准确的),由此可想而知,它的坐标必定也未加密!
那么为什么我用真实的经纬坐标在Mapbar上标注的时候,会有明显的偏移呢?

在我们应用Mapbar开发一些应用的时候,我们所看到的或者是获取到的经纬度坐标其实都不是真正的地理坐标,而是经过Mapbar加密以后的坐标,所以对于外来的坐标Mapbar并不感冒。
在Mapbar的Api中,它会对传入的坐标进行一次解密(会获得真实的经纬度坐标),然后在Api的核心成图函数里就使用这个真实的坐标绘制用户可见的地图,而我们通过API获取的Mapbar坐标都是加密以后的坐标。
综上,如果你传给了Mapbar一个真实的坐标,因为它会对所有传入的坐标进行一次解密,因为我们传的本来就是真实的坐标,被它这么一解密反而就不真实了,于是这个不真实的坐标在后面成图中以及标注点上就有了偏移。
废话太多了,直接看代码吧!


经纬度加密算法如下:(PHP版)

/**


  • * 将真实地理坐标加密为Mapbar经纬度坐标
  • *
  • * @param $x 经度值
  • * @param $y 维度值
  • * @returns array
  • */
  • function coordOffsetEncrypt($x,$y){
  • $x = floatval($x)*100000%36000000;
  • $y = floatval($y)*100000%36000000;

  • $_X = intval(((cos($y/100000))*($x/18000))+((sin($x/100000))*($y/9000))+$x);
  • $_Y = intval(((sin($y/100000))*($x/18000))+((cos($x/100000))*($y/9000))+$y);

  • return
    array($_X/100000.0,$_Y/100000.0);
  • }

经纬坐标加密算法(Javascript版)


  • /**
  • * 将真实地理坐标加密为Mapbar经纬度坐标
  • *
  • * @param x 经度值
  • * @param y 维度值
  • * @returns [x,y]
  • */
  • function coordOffsetEncrypt(x,y){
  • x = parseFloat(x)*100000%36000000;
  • y = parseFloat(y)*100000%36000000;

  • _X = intval(((Math.cos(y/100000))*(x/18000))+((Math.sin(x/100000))*(y/9000))+x);
  • _Y = intval(((Math.sin(y/100000))*(x/18000))+((Math.cos(x/100000))*(y/9000))+y);

  • return [_X/100000.0,_Y/100000.0];
  • }

经纬度坐标解密算法(PHP版)



  • /**
  • * 将Mapbar经纬坐标解密为真实地理坐标
  • *
  • * @param $x 经度值
  • * @param $y 维度值
  • * @returns array
  • */
  • function croodOffsetDecrypt($x,$y){
  • $x = floatval($x)*100000%36000000;
  • $y = floatval($y)*100000%36000000;

  • $x1 = intval(-(((cos($y/100000))*($x/18000))+((sin($x/100000))*($y/9000)))+$x);
  • $y1 = intval(-(((sin($y/100000))*($x/18000))+((cos($x/100000))*($y/9000)))+$y);

  • $x2 = intval(-(((cos($y1/100000))*($x1/18000))+((sin($x1/100000))*($y1/9000)))+$x+(($x>0)?1:-1));
  • $y2 = intval(-(((sin($y1/100000))*($x1/18000))+((cos($x1/100000))*($y1/9000)))+$y+(($y>0)?1:-1));

  • return
    array($x2/100000.0,$y2/100000.0);
  • }


经纬度坐标解密算法(Javascript版)

  • /**
  • * 将Mapbar经纬坐标解密为真实地理坐标
  • *
  • * @param x 经度值
  • * @param y 维度值
  • * @returns [x,y]
  • */
  • function croodOffsetDecrypt(x,y){
  • x = parseFloat(x)*100000%36000000;
  • y = parseFloat(y)*100000%36000000;

  • x1 = parseInt(-(((Math.cos(y/100000))*(x/18000))+((Math.sin(x/100000))*(y/9000)))+x);
  • y1 = parseInt(-(((Math.sin(y/100000))*(x/18000))+((Math.cos(x/100000))*(y/9000)))+y);

  • x2 = parseInt(-(((Math.cos(y1/100000))*(x1/18000))+((Math.sin(x1/100000))*(y1/9000)))+x+((x>0)?1:-1));
  • y2 = parseInt(-(((Math.sin(y1/100000))*(x1/18000))+((Math.cos(x1/100000))*(y1/9000)))+y+((y>0)?1:-1));

  • return [x2/100000.0,y2/100000.0];
  • }


http://www.crossyou.cn/latitude-and-longitude-coordinates-offset-will-mapbar-encryption-decryption-algorithm.htm

http://www.crossyou.cn/baidu-map-module-dynamic-loading-method.htm

http://demo.crossyou.cn/mapbar/coord/convert.php

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值