Google Map API v2 番外篇 关于gps位置偏差及修正方法探讨
2014-01-31 23:15
316 查看
我的手机是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的解析
从第11行开始是JSON解析,x,y也是base64的。
接下来要想办法让google的“我的位置”图层使用我们修正后的经纬度。
1,首先实现一个LocationSource给google地图的MyLocationLayer送数据
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,算是投降了。这里记录一下,以后有空再研究吧
在网上搜索了很多,都说这个是测绘局为了保密故意弄成这样的。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,算是投降了。这里记录一下,以后有空再研究吧
相关文章推荐
- 关于 android百度地图 调用 地理位置 经纬度坐标,只调用一次的解决方法,通知栏不总是 搜索 GPS 。。。
- Android开发获取GPS位置,包含基站\wifi\gps 几种方法
- 关于java继承中父类方法可见性探讨
- 一种关于人脸五官位置识别的初步检测方法
- 关于"Java中方法参数的传递方式"的探讨
- 关于Windows XP sp2下金山词霸2005取词BUG,桌面重启修正方法
- Android使用GPS获取用户地理位置并监听位置变化的方法
- 关于wince SD 卡HIVE注册表的问题解决方法探讨
- 关于 IE6下面修正png后链接失效的补救方法
- Android6.0获取GPS定位和获取位置权限和位置信息的方法
- 关于监听联系人变化的问题与解决方法探讨
- 关于EditText设置单击提示音方法的探讨
- 关于敏捷方法的探讨与思考
- 疑难杂症——关于EntityFramework的SqlQuery方法的执行效率差异的探讨
- python关于dict的几个方法探讨
- Android编程实现GPS位置获取的方法
- 关于G1的GPS软件介绍及打开GPS模块方法
- Android关于位置的requestLocationUpdates方法可以准确到多少精度?如果是结合蓝牙呢?
- SQL Server中关于基数估计计算预估行数的一些方法探讨
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨