Google Map API v2 番外篇 关于gps位置偏差及修正方法探讨
我的手机是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位置偏差及修正方法探讨的更多相关文章
- Android中Google地图路径导航,使用mapfragment地图上画出线路(google map api v2)详解
在这篇里我们只聊怎么在android中google map api v2地图上画出路径导航,用mapfragment而不是mapview,至于怎么去申请key,manifest.xml中加入的权限,系 ...
- Google Map API v2 步步为营(一) ----- 初见地图
官方文档:https://developers.google.com/maps/documentation/android/start?hl=zh-CN 先谷歌后百度.使用google的api基本上按 ...
- google map api v2的使用详细过程,图文并茂(原创)
上一篇中说到怎么获取key,下面来介绍怎么使用key来显示google地图 步骤1:eclipse上打开android SDK Manager,安装google play services. 步骤2: ...
- Google Map API v2 (三)----- 地图上添加标记(Marker),标记info窗口,即指定经纬度获取地址字符串
接上篇 http://www.cnblogs.com/inkheart0124/p/3536322.html 1,在地图上打个标记 private MarkerOptions mMarkOption; ...
- Google Map API v2 步步为营 (二)----- Location
接上篇. 改造一下MapsActivity: public class MapsActivity extends Activity implements LocationListener, InfoW ...
- Google Map API V2密钥申请
之前用的都是v1,用的是MapView,好吧,仅仅能认命了.废话不再多说,開始android 的Google Maps Android API v2吧 之前參考了http://www.cnblogs. ...
- Google Map API v2 (四)----- 导航路径
仍然是建议个异步小任务 private GetPathTask mGetPathTask = null; private void getGuidePath(LatLng origin){ if(mG ...
- electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google JavaScript Style Guide代码规范
我的electron教程系列 electron教程(一): electron的安装和项目的创建 electron教程(番外篇一): 开发环境及插件, VSCode调试, ESLint + Google ...
- [uboot] (番外篇)uboot 驱动模型(转)重要
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
随机推荐
- 《鸟哥的Linux私房菜》读书笔记一
1.CPU为一个具有特定功能的芯片,里面含有微指令集,一个CPU又可以分为两个主要的单元:算术逻辑单元和控制单元.CPU读取的数据都是从内存读取来的,内存内的数据是从输入单元传输来的.CPU处理完也要 ...
- python 替换windows换行符为unix格式
windows 默认换行符为 \r\n; unix默认换行符为 \n; 所以当win下编辑的脚本在linux下显示末尾多了^M: 换行符修改为同一的unix格式脚本如下: def run(path,f ...
- Linux的线程同步对象:互斥量Mutex,读写锁,条件变量
进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...
- fuser可以用于系统安全检查。
fuser可以用于系统安全检查.用fuser查看哪些用户和进程在某些地方作什么:fuser -cu /root 简略显示fuser -muv /mnt3 分列显示
- oracle查询转换_view merge
oracle对于子查询的支持做的很好,oracle optimizer会对inline view进行query transfomation,即视图合并,不过也经常带来意想不到的问题.下面是一个inli ...
- TFS2010中文版安装
VS2010的中文版出来一段时间了,对TFS2010的了解,也有一段时间了,只不过中文版还是首次见到.于是把第一次安装的图片分享出来,公供参数. TFS2010安装环境是操作系统为Windows Se ...
- FileUpload上传文件无法获取文件名
原因:将FileUpload控件放到了UpdatePannel控件中了 解决办法:将FileUpload控件位置移动到UpdatePannel控件外面
- input框自动填充内容背景颜色为黄色解决方法
谷歌浏览器input自动填充内容,背景色会是黄色,想改的话: input:-webkit-autofill { box-shadow: 0 0 0px 1000px white inset;} 这种方 ...
- Bzoj 2763: [JLOI2011]飞行路线 dijkstra,堆,最短路,分层图
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1728 Solved: 649[Submit][Statu ...
- UIWebview 禁止某个方向滚动
Enable Horizontal scrolling and disable Vertical scrolling: myWebView.scrollView.delegate = self; [m ...