我的手机是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. hadoop多机安装HA+YARN

    HA 相比于Hadoop1.0,Hadoop 2.0中的HDFS增加了两个重大特性,HA(热备)和Federation(联邦).HA即为High Availability,用于解决NameNode单点 ...

  2. 转:十九、Java的接口及实例

    http://blog.csdn.net/liujun13579/article/details/7736116 一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合 ...

  3. 【HDOJ】1963 Investment

    完全背包. #include <stdio.h> #include <string.h> #define max(a, b) (a>b) ? a:b ], an[]; ] ...

  4. [LeetCode#218] The Skyline Problem

    Problem: A city's skyline is the outer contour of the silhouette formed by all the buildings in that ...

  5. Design T-Shirt

    Design T-Shirt Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  6. HDU-1518 Square(DFS)

    Square Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  7. win pe 修改xp系统开机密码方法

    今天使用win pe 修改了xp系统的密码,有三种方法 一 .  最终找到了一个方法,这个方法只能改写密码,也就是说会留下痕迹,如下: 1.使用的工具:FbinstTool v1.50 FbinstT ...

  8. PowerDesigner 如何生成数据库更新脚本

    最近在学习使用PowerDesigner 这个数据库设计工具,发现真的很强大,可以做很多事情,其中就涉及到如果数据库要进行更新了怎么办,主要是增加表,最麻烦的是修改字段名称,增加字段等操作,遇到主要的 ...

  9. .net常見面試題(一)

    2 .列举ASP.NET 页面之间传递值的几种方式. 答. 1).使用QueryString, 如....?id=1; response. Redirect()....                 ...

  10. eclipse安装Hadoop1.1.2版本开发插件

    Hadoop1.1.2版本没有直接适合Eclipse的安装插件,需要手动打包jar文件. 我的系统配置: VMware Workstation10 CentOS-6.5-i386 hadoop-1.1 ...