我的手机是M35C,在我自己的map activity中,通过gps获取到的经纬度比实际地址总是有500米左右的偏差。

在网上搜索了很多,都说这个是测绘局为了保密故意弄成这样的。gps全球定位系统获得的location是WGS84坐标系,而咱们是用的自己的坐标系,不知道是BJ54还是大地坐标系。

反正就是不一样。

但我没想明白,为什么安装google自己的地图apk 就没有这个问题呢。

转换模型貌似能搜到些很正规的论文,呃。。我没仔细看,对于我这样高数只能勉强的及格的人来说,那些公式具有强烈的眩晕效果。@_@

一个修正的办法是通过百度的坐标转换web api

发送一个httpGet的请求

String urlString = "http://api.map.baidu.com/ag/coord/convert?from=0&to=2&x=" + lng + "&y=" + lat;

from=0&to=2 即表示要从gps坐标系转到google坐标系,我也搞不清这是什么意思。
            //gps坐标的type=0
            //google坐标的type=2
            //baidu坐标的type=4

这个http请求返回的是json,其中x字段是经度,y字段是纬度,发送http的部分就不贴了,只贴一段json的解析

 String mHttpResponse = httpClient.execute(httpGet);

 if (mHttpResponse.getStatusLine().getStatusCode() == 200){
mHttpEntity = mHttpResponse.getEntity();
responseString = mHttpEntity.toString();
} String err = responseString.substring(responseString.indexOf("error") + 7, responseString.indexOf("error") + 8);
if ("0".equals(err))
{
JSONObject js;
try {
js = new JSONObject(responseString);
String x = js.getString("x");
String y = js.getString("y");
byte[] xByte = Base64.decode(x,0);
byte[] yByte = Base64.decode(y,0);
Location retLoc = new Location(""); String lngString = new String(xByte);
String latString = new String(yByte); double lng = Double.parseDouble(lngString);
double lat = Double.parseDouble(latString); retLoc.setLatitude(lat);
retLoc.setLongitude(lng);
return retLoc;
} catch (JSONException e) {
log("JSONException in doInBackground():" + e);
}
}

从第11行开始是JSON解析,x,y也是base64的。

接下来要想办法让google的“我的位置”图层使用我们修正后的经纬度。

1,首先实现一个LocationSource给google地图的MyLocationLayer送数据

private LocationSource.OnLocationChangedListener myLocationListener = null;
private class MyLocationSource implements LocationSource{ @Override
public void activate(OnLocationChangedListener listener) {
log("MyLocationSource activate");
myLocationListener = listener;
} @Override
public void deactivate() {
log("MyLocationSource deactivate");
myLocationListener = null;
}

}

2,调用GoolgeMap.setLocationSource(new MyLocationSource());

当my location layer显示的时候会跑到public void activate(OnLocationChangedListener listener),入参就是my location layer用来监听位置变化的listener,把它赋值给private的myLocationListener。

3,得到转换后的经纬度后,调用myLocationListener.onLocationChanged(location)通知给google地图。

结果,位置是正确了,但是实时性很差,而且在google地图里面用baidu的api,显得很无赖。

我最终用百度地图重写了这个activity,算是投降了。这里记录一下,以后有空再研究吧

Google Map API v2 番外篇 关于gps位置偏差及修正方法探讨的更多相关文章

  1. Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解

    在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...

  2. Google Map API v2 步步为营(一) ----- 初见地图

    官方文档:https://developers.google.com/maps/documentation/android/start?hl=zh-CN 先谷歌后百度.使用google的api基本上按 ...

  3. google map api v2的使用详细过程,图文并茂(原创)

    上一篇中说到怎么获取key,下面来介绍怎么使用key来显示google地图 步骤1:eclipse上打开android SDK Manager,安装google play services. 步骤2: ...

  4. Google Map API v2 (三)----- 地图上添加标记(Marker),标记info窗口,即指定经纬度获取地址字符串

    接上篇 http://www.cnblogs.com/inkheart0124/p/3536322.html 1,在地图上打个标记 private MarkerOptions mMarkOption; ...

  5. Google Map API v2 步步为营 (二)----- Location

    接上篇. 改造一下MapsActivity: public class MapsActivity extends Activity implements LocationListener, InfoW ...

  6. Google Map API V2密钥申请

    之前用的都是v1,用的是MapView,好吧,仅仅能认命了.废话不再多说,開始android 的Google Maps Android API v2吧 之前參考了http://www.cnblogs. ...

  7. Google Map API v2 (四)----- 导航路径

    仍然是建议个异步小任务 private GetPathTask mGetPathTask = null; private void getGuidePath(LatLng origin){ if(mG ...

  8. electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范

    我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...

  9. [uboot] (番外篇)uboot 驱动模型(转)重要

    [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...

随机推荐

  1. 算法练习之:Doubles

    Doubles Time Limit: 1000MS Memory Limit: 65536KB Problem Description As part of an arithmetic compet ...

  2. Java final知识点

    被final修饰的值,只可以被赋值一次. 被final修饰的类,其所有方法就变成了final方法,该类也不能被继承. 被final修饰的方法,不能在子类中重写. public static void ...

  3. USB数据线上的“疙瘩”:原来有这么大用处!

    在不少键盘.鼠标或是游戏外设的数据线末端我们都能见到一小段金属圆环.虽然这算得上是习以为常的一个设计,但如果说到其具体作用的话很多人一下子还真回答不上来.反正笔者在这里先可以告诉大家,这货肯定不是简简 ...

  4. linux系统配置文件和用户配置文件及其作用

    我的博客:www.while0.com /etc/issue 未登陆时控制台显示的文字 /etc/issue.net 远程登陆时控制台显示的文字 /etc/motd 用户登陆时显示的文字 这里先提供两 ...

  5. (转载)struct 与typdef struct的区别

    (转载)http://blog.csdn.net/piratejk/article/details/3491226 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字. ...

  6. 计算几何(凸包):SHTSC 2012 信用卡凸包

    这道题是水题,发现平移某些边,答案就是圆心的凸包+一个圆的周长. 不要忽视精度误差! #include <algorithm> #include <iostream> #inc ...

  7. 基于.NET平台常用的框架和开源程序整理

    自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中 也积累了一些开源的组件,就目前想到的先整理于此,如果再想到, ...

  8. java基础(十八)IO流(一)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

  9. 17 Great Machine Learning Libraries

    17 Great Machine Learning Libraries 08 October 2013 After wonderful feedback on my previous post on ...

  10. InetAddress Example program in Java

    The InetAddress class has no visible constructors. To create an InetAddress object, you have to use ...