灵图编码与经纬度转换问题

        最近做项目的时候,需要使用51地图的免费接口标注一些网点,查看51地图的API文档得知需要使用经纬度并进行加密来标注。由于手中没有GPS终端,但是有灵图编码,于是就去网上找灵图编码转经纬度方面的介绍,找了很久终于找到了一篇,现转载其内容如下,以方便大家使用。(声明,此文转载自“明心狮的个人空间”,原文地址:http://www.cnpeugeot.com/index.php/64/action_viewspace_itemid_111.html
        以下是原文中部分内容:

众所周知,包括LT在内的所有导航软件的地图,就是经纬度坐标的点的集合。然后,与GPS的经纬度信号匹配,才能应用成为导航。
但是由于国家政策原因,LT不能直接用经纬度定位一个目标。为此,LT用了一种变通的方法:灵图编码。

这个灵图编码到底是什么规律呢?在此抛砖引玉,希望大家研究研究:

灵图编码共有12位,分为3节,表现为 abcd
- efgh - ijkl 的形式。
大家可以看一下自己的机器。

但是,实际上,这种分节的方法,是一种妥协,是骗人的。LT不能公然对抗国家政策法规,只好做一些伪装了。

咱们试试,定位6993
- 0563 - 3391 ,看看是哪里。这个点大家都熟悉,让我们命名为A点。
然后只改一个数4993
- 0563 - 3391 ,看看在哪儿?嗯,在A点南方约200米。
咱们再改一个数8993
- 0563 - 3391 ,在哪儿?嗯,在A点北方约200米。
好,我们摸到一点规律了。接着来:
那么应用看看:
9993 - 0563 - 3391 ,在哪儿?嗯,很好,如约出现在A点北方约300米的位置。
现在,出疑问了,需要进位!怎么进位呢?简单输入0993……肯定不对,是需要进位的。应该进在哪里?
试一下就可以知道,把第2节的第一位(也就是12位编码的第5位数)从“
0 ”改为“ 1 ”,
我们输入看看:
0993 - 1563 - 3391
很好!如约出现在A点北方约400米的地方!

好了,现在我们已经发现一点规律了。
让我们继续观察,并得到:

整个12位编码的第1位数字,每加1,就向北移动100米左右;每减1,就向南移动100米左右;
第2位数字,每减1,就向南移动100公里;
第3位数字,每减1,就向西移动1公里;
第4位数字,每减1,就向南移动约7米;
第5位数字,每加1,就向北移动1公里;
第6位数字,每减1,就向西移动100米;
第7位数字,每减1,就向西移动100公里;
第8位数字,每减1,就向西移动10公里;
第9位数字,每加1,就向东移动10米;
第10位数,每减1,就向南移动1000公里;
第11位数,每减1,就向南移动10公里;
第12位数,每减1,就向西移动1000公里。

现在我们已经有一点认识了,这个“灵图编码”就是一个XY坐标系统。

让我们试试看,如果我们定义一个原点,然后要找到距离这个原点的向西1234.5的地方,应该如何计算出灵图编码呢?
根据上面的试验:
向西1234.5公里,就是把原点的第12位数减1(代表向西1000公里),第7位减2(代表西200公里),第8位减3(代表西30公里),第3位减4(代表西4公里),第6位减5(代表西500米)。

让我们真的运算一下,看看对不对。我们首先设立一个原点,为了计算方便,我们在北京市找到一个叫做“中东汽修”的地址,其灵图编码是:
6993 - 0864 - 6391 。我们把它设为起始点(设为起始点是为了显示出来目的地的距离,看看是不是1234.5公里)。
按照上述的算法,我们计算:
6993 0864 6391
  ↓↓   ↓↓↓    ↓
6953 0341 6390


点“目的地”,“下一页”,选择“编码定位”,输入咱们算出的这个695303416390,设为目的地。好了,现在看到屏幕的显示了,我们定位的新坐标,确实是在原点(起始点)的西面1234.5公里处。
这证明我们的推算是正确的。

在12位的灵图编码中
第1位数字,每加1,就向北移动100米左右;每减1,就向南移动100米左右;
第2位数字,每减1,就向南移动100公里;
第3位数字,每减1,就向西移动1公里;
第4位数字,每减1,就向南移动约7米;
第5位数字,每加1,就向北移动1公里;
第6位数字,每减1,就向西移动100米;
第7位数字,每减1,就向西移动100公里;
第8位数字,每减1,就向西移动10公里;
第9位数字,每加1,就向东移动10米;
第10位数,每减1,就向南移动1000公里;
第11位数,每减1,就向南移动10公里;
第12位数,每减1,就向西移动1000公里。

在此基础上进一步分析,影响东西方向位置的视作经度元素,影响南北方向位置的视作纬度元素。而影响比较大的看作高位,影响小的看作低位。例如,第12位对经度影响最大,应该是经度的最高位,第9位对经度的影响最小,应该是经度的最低位。根据这样的原则排列,不难得到这样的结果:
经度:
12 7 8 3 6 9
纬度:
10 2 11 5 1 4
我们用一个实际的地点来说明,在灵图上取北京四惠桥的坐标为7981
- 0364 - 6391 ,按照上面说的排列规则,经度值就是  1   6   4   8   3   6 ,纬度值就是  3   9   9   0   7   1 。据我现场实测,得出四惠桥的位置是东经116度29.062分,北纬39度54.395分。两者对比可以做出这样的判断,灵图编码就是2位整数加4位小数的经纬度(省略了经度的百位)。在这里,灵图编码的经度值164836 = 16 .4836度 = 16度29.016分,纬度值399071 = 39 .9071度 = 39度54.426分,与我的实测比对误差极小,不仅在简单的GPS测量误差允许范围之内,而且在电子地图上取点时光标位置的毫厘之差都会导致这种误差。
在全国范围内取几个相距较远的点作验证,我在网上找到昆明和广州的经过校准的OZI地图作为比对标准。昆明市人民路-青年路交叉口,灵图编码5513
- 4427 - 3200 ,按上面推算是东经102.7143度 = 102度42.858分,北纬25.0453度 = 25度2.718分;广州市天河立交桥的灵图编码是6316 - 3033 - 0211 ,按上面推算是东经113.3100度 = 113度18.600分,北纬23.1366度 = 23度8.196分。与OZI地图中的经纬度比对,没有眼睛可以分辨出来的误差。
至于经度中的百位数可以这样考虑,在灵图上中国最西取一点9902
- 7535 - 1337 ,换算结果是东经73.5051度,在最东端取一点7803 - 0850 - 5443 ,换算结果是东经135.0085度,所以可以这样判断,经度最高位如果大于5,百位就是0,如果小于5,百位就是1。

        现在,可以很方便地使用灵图编码转换经纬度了。

猜你喜欢

转载自wzhongyu.iteye.com/blog/673531