百度地图API位置偏移的校准算法

百度地图API位置偏移的校准算法

算法语言 软件开发 2年前 (2016-02-17) 浏览: 2295 评论: 0

在开始使用百度地图API进行开发时可能会遇到一件相当奇怪的事情,使用百度定位的经纬度在地图上显示相当不准确,这一问题我在微信开发和安卓开始时都遇到过。第一次使用百度地图api获取位置并在地图上显示是在微信开发的时候,那是不知道具体原因无奈在微信获取的地理位置上加了一个偏移量进行校准,虽能勉强解决,但是不太准确。后来在安卓开始也同样遇到了这个问题,才发现百度地图API定位偏移已经不是一个偶然问题了。 百度地图API定位偏移的原因 以下来自互联网: 一、坐标体系 首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:   2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。 3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。 第二种分类: 首先明白,所有坐标体系的原点,都是非洲。 1、 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。 如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。 2、 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192) 墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。 搜狗地图API就是直接使用的墨卡托坐标。 二、坐标转换 在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。 比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。 例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。 例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。 例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。 1、度分秒坐标转换为经纬度 比如,在GPS记录仪,或者google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 2、 GPS转换为GCJ-02坐标 谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。) 不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见: http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro 3、GCJ-02与BD-09之间互转 国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解: http://blog.csdn.net/coolypf/article/details/8569813 不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标): To_B是转到百度,To_G是转到GCJ-02。 var TO_BLNG = function(lng){return lng+0.0065;}; var TO_BLAT = function(lat){return lat+0.0060;}; var TO_GLNG = function(lng){return lng-0.0065;}; var TO_GLAT = function(lat){return lat-0.0060;}; 4、经纬纬度转成墨卡托 网上也有详细讲解: http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245 (大家发现没,高德是api,腾讯和百度是mapapi,说明什么?) 三、坐标偏移 如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。 A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。 解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。 B、原始坐标准确度不够 解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。 如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。 C、度分秒的概念混淆 比如,在google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 D、经纬度顺序写反了 有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。 相关问题的百度解释:http://developer.baidu.com/map/question.htm 百度地图API位置偏移的校准算法 C++算法  

AndroidStudio代码混淆和NDK预防apk反编译

AndroidStudio代码混淆和NDK预防apk反编译

技术应用 软件开发 2年前 (2016-01-09) 浏览: 794 评论: 0

代码混淆 什么是代码混淆 Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。 混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。   NDK将应用的核心代码或通讯协议打包成so文件 NDK可以实现代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 因为java是半解释半编译性语言,,先将java的代码解释成CLASS文件,然后编译给计算机中的JVM虚拟机,然后由虚拟机调用相应的计算机部件进行运算,而安卓的SO文件是linux下的文件,用c或者c++写的,c++你可以看做是C的扩充版,C有良好的机器兼容性,就是因为它可以直接编译为机器指令,执行效率相对java高,而java是跨平台移可植性强大。 C/C++更接近底层系统实现和依赖于编译器,不同编译器生成的二进制代码会相对不同平台有所区别,甚至同一操作系统不同系列的编译器都会有一点差异,比如在linux下编译C/C++得到的二进制代码就很难或无法运行在windows平台上,反之亦然,所以反编译很困难,现在大多数反编译软件都只能反编译成汇编。有一些号称可以反编译成C或者C++的工具,但反编译出来的结果大多看不明白,还不如用汇编。  

第一个android studio+NDK程序

第一个android studio+NDK程序

软件开发 2年前 (2016-01-08) 浏览: 132 评论: 0

NDK(android native develop kits ):android 本地开发工具集 ,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件。 什么是JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。 java可以实现上层应用的开发,但是不能写底层驱动,有些android项目必须和底层硬件打交道,比如要精确快速的获取某种传感器的值,那么java是不能办到的,那怎么办,就通过JNI开发,通过c/c++完成底层驱动或者值得获取,然后将值传回到java层。同样java层也可以将数据传递给c/c++层,这样通过JNI完成数据的交互。 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。 MainActivity: 下面是通过javah命令自动生成的 cn_wangbaiyuan_ndktest_MainActivity.h   在build.gradle(Module:App)加入下列配置可指定生成.so文件的CPU平台类型以及so文件的名称,如果没有指定,android将会生成libapp.so,以及所有平台的so文件;生成so文件路径为:你的项目根目录\app\build\intermediates\ndk\debug\lib build.gradle(Module:App)    

回溯法求无向图结点涂色最少颜色数

回溯法求无向图结点涂色最少颜色数

算法语言 2年前 (2015-12-06) 浏览: 111 评论: 0

回溯法通过深度优先遍历的策略遍历解空间树,其实现过程是:从根节点出发搜索它的所有孩子树或者孩子结点,对于每个结点判断其是否满足约束条件和判定函数,如果满足则进入此结点同样以此结点搜索它的子结点。拥有子节点的结点称之为活节点,当搜索至到没有活节点时则返回原父节点继续寻找活节点,以此类推,直到回溯算法搜索完解空间树。 回溯法由于是遍历完解决问题的所有可能解,所以称它是解决问题的万能算法,只要正确构建了解空间树,通过回溯遍历解空间树即可。回溯算法可以解出解决问题的所有可能解,而在实际解决一些最优解问题时我们可以通过剪枝函数剪掉比中间结果比已求得最优解还差的子树。 无向图的m着色问题的m的最小值求解    

C++活动主机扫描

C++活动主机扫描

计算机技术 2年前 (2015-11-20) 浏览: 195 评论: 0

  (1)以命令方式运行:DOS>scanHost  start_ip  end_ip (2)输出内容:活动主机IP地址。 实现原理: (1)通过某IP发送ICMP_ECHO请求报文,接收到ICMP_response 报文,表明该IP主机活动。 (2)利用原始套接字 (3)为了提高检测时间,利用多线程技术。    

C++扫描指定主机开放的端口

C++扫描指定主机开放的端口

计算机技术 2年前 (2015-11-19) 浏览: 292 评论: 0

C++扫描指定主机开放的端口,OS提供了connect()系统调用,用于与远程主机某端口建立连接,如果远程主机该端口处于帧听状态,则connect()连接成功;否则说明该端口关闭。    

C++解析ARP数据包(可选网卡)

C++解析ARP数据包(可选网卡)

计算机技术 2年前 (2015-11-17) 浏览: 604 评论: 0

在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址,而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。因此在通讯前必须获得目的主机的硬件地址。ARP协议就起到这个作用。源主机发出ARP请求,询问“IP地址是192.168.0.1的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。 每台主机都维护一个ARP缓存表,可以用arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。 本项目是基于win cap的,要想成功运行本代码,你需要下载安装win cap以及WpdPack并在visual studio中配置wincap的库。  

无向图个数最少且元素间不相连的子集

无向图个数最少且元素间不相连的子集

算法语言 2年前 (2015-11-15) 浏览: 73 评论: 0

问题 设给定一个任意的无向图,将图划分若干的子集,子集集合中任意俩个节点不相连,使用贪心算法使子集个数最少。 算法步骤或流程:   构造一个向量A按结点度大小加入。 构建向量B为空,B存储最后的结果,其元素为子集 取向量A的第一个元素m(即度最大)加入向量B,遍历B中的元素,如果m与B中元素(子集)中的元素都不相连,则加入到当前子集,如果相连则创建新子集。 将向量A中m除去,重新对向量A按度大小排序,重复3 C++代码  

一瓶啤酒烫烫烫

一瓶啤酒烫烫烫

算法语言 2年前 (2015-11-01) 浏览: 162 评论: 0

现在网上很多人黑程序员,“只有程序员才能听懂的笑话”常常出现在朋友圈,各种娱乐化程序员,极客人有时候也表示很无辜。听人讲起下面这个程序员的笑话,逼格算是比较高了,哈哈! 两个字符串走进酒吧。 第一个字符串对服务员说:“给我来一瓶啤酒烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫”。 “请原谅我的朋友,”第二个字符串说:“他忘了加\0”。   初听这个所谓笑话的时候感觉莫名奇妙,直到昨天调代码遇到字符数组中出现的情况才明白了一二: 至于出现烫烫烫的原因,下面是从百度抠下来的解释: 在用VC写代码时,经常会遇到在栈中申请空间的并且没有被初始化的字符数组就会显示"烫烫烫烫。。。",虽然是知道编译器对栈中没有初始化的数据会进行默认的初始化工作。如下面的代码: 代码很简单,就是在栈中申请了一个大小为4个字节的字符数组。 用断点查看X的值,可以发现,“烫烫”出现了: x 0x0012ff60 "烫烫烫烫?" char [4] 查看反汇编:     简单解释一下关键句的含义: 004113AC 8D BD 34 FF FF FF lea         edi,[ebp-0CCh] 将获得的0CCh大小的栈空间首地址赋给edi 004113B2 B9 33 00 00 00   mov         ecx,33h rep的循环次数为33h 004113B7 B8 CC CC CC CC   mov         eax,0CCCCCCCCh eax = 0CCCCCCCCh 004113BC F3 AB            rep stos    dword ptr es:[edi] 将栈空间的33H个双字节赋值为0CCCCCCCCh 而0xcccc用汉语表示刚好就是“烫” oxcc正好是中断int 3的指令 起到保护作用 (参考:) 在Debug 模式下,VC 会把未初始化的栈内存全部填成0xcc。会把未初始化的堆内存全部填成0xcd。但是Release 模式下不会有这种附加动作,原来那块内存里是什么就是什么。 未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字。同理,0Xcdcd就是“屯”字。   ‘\0’的含义 ‘\0’在很多编程语言中代表着一段字符的结尾,编译器判断我们字符串到哪个地方结束都是根据'\0'判断的,如果遇到'\0',就停止读取字符串,如果一直没有碰到'\0',会继续往下找。

根据前中序遍历构建二叉树

根据前中序遍历构建二叉树

算法语言 2年前 (2015-11-01) 浏览: 235 评论: 1

根据前序遍历和中序遍历构建二叉树的基本思想是使用递归算法;首先构建根节点的左子树和右子树,而在构建根节点的左右子树的时候又要构建左右子树根节点的左右子树, 所以很容易想到递归算法;本项目构建二叉树的主要函数是CreateBinaryTree,其参数有char *preorder, char *inorder, int n,分别是当前构建二叉树的前序排列和中序排列和结点个数;直到构建的子二叉树中节点个数为零,即完成了递归。 根据前中序遍历构建二叉树  

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册