百度地图WGS4转换真实GPS及逆向转换

来源:互联网 发布:7z linux解压命令 编辑:程序博客网 时间:2024/05/22 02:21

http://hunray.iteye.com/blog/1404129


http://www.eoeandroid.com/forum.php?mod=viewthread&tid=185177


最近项目中碰见并解决了一个的问题 (内牛满面啊...)
主要需求是这样的:
在百度地图上仍然展示百度地图的坐标,但是提交数据是要上传精确的gps坐标 (客户那边是用google地图做的但客户要求android客户端用百度地图...) 

众所周知在我们的天朝GPS是不可能公开让所有人都知道的,所以百度google地图都会有一定的偏移量 ,只有加上偏移量之后 ,国家测绘地理信息什么协会,才会同意商用或者提供API接口

我们用百度地图时,默认获取的都是baidu09的百度坐标,如果想获取GPS就得转换了(当然也有别的办法,直接使用WGS坐标来定位,当然,显示的时候仍然要转换一下,转换方法下边有代码,自己参考)

昨天弄了一下午  今天仔细一行一行的调试 最终终于找到了这个bug  内牛满面啊。。。
没有文档上不起啊。。。
上代码 

?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
*
*<font color="\"#ff0000\""> </font><font color="\"#ff00\"">特别是这里x一定要传lon,y值传lat 传反了后果自负(我就是在这里栽跟头的 谨记谨记)</font>
*/
String bmapBase64Encode = "http://api.map.baidu.com/ag/coord/convert?from=0&to=4<font color="\"#ff0000\"">&x=%1$s&y=%2$s"</font>;
/**
* 转换百度地图坐标
* @param baiduLat
* 百度地图坐标 纬度
* @param baiduLon
* 百度地图坐标 经度
* @throws IOException
* @throws HWNetException
* @throws JSONException
*/
privatevoid tran(doublebaiduLat,doublebaiduLon) throwsIOException,
HWNetException, JSONException {
//就一个普通个的url请求封装成Client而已
AndroidClient client = newAndroidClient();
//获取请求后数据
String json = client.doGetWithString(String.format(bmapBase64Encode,String.valueOf(baiduLon),String.valueOf(baiduLat)));
//得到JSON对象
JSONObject object = newJSONObject(json);
System.out.println(object);
Double lon1 = Double.parseDouble(newString(Base64.decodeBase64(object.getString("x").getBytes())));
Double lat1 = Double.parseDouble(newString(Base64.decodeBase64(object.getString("y").getBytes())));
System.out.println("转换出来的百度坐标经度:"+lon1+"纬度:"+lat1);
//这里的就是GPS坐标 经过下面算法转换 基本上合真实的GPS坐标相差无几  
super.gpsLat = baiduLat*2-lat1;
super.gpsLon = baiduLon*2-lon1;
System.out.println("算法转算后的百度坐标经度:"+gpsLon+"纬度:"+gpsLat);
}
  
知道GPS(WGS84)坐标转换百度地图坐标只需一句话
?
代码片段,双击复制
01
02
CoordinateConvert.bundleDecode(CoordinateConvert.fromWgs84ToBaidu(
newGeoPoint((int)(gpsLat*1E6), (int)(gpsLon*1E6))))

红色部分 血的教训啊。。。  
mark一下  分享一下 顺便总结一下 ... 


——————————————————————————————


百度地图API中,有GPS坐标转百度坐标的功能 
http://dev.baidu.com/wiki/static/map/API/examples/?v=1.2&0_6#0&6 

http接口是:http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=116.397428&y=39.90923&callback=BMap.Convertor.cbk_7594 
返回结果坐标是通过base64加密的。 
这个转换算法百度是不会公开的,而且百度也没有提供百度坐标转成GPS坐标功能,这里我用了取巧的办法。 

百度坐标和GPS坐标转换在很近的距离时偏差非常接近。 
假设你有百度坐标:x1=116.397428,y1=39.90923 
把这个坐标当成GPS坐标,通过接口获得他的百度坐标:x2=116.41004950566,y2=39.916979519873 

通过计算就可以得到GPS的坐标: 
x = 2*x1-x2,y = 2*y1-y2 
x=116.38480649434001 
y=39.901480480127 

在http://dev.baidu.com/wiki/static/map/API/examples/?v=1.2&0_6#0&6 将此坐标输入GPS数据项中得到的结果是:116.39743826208,39.909194650838 

原创粉丝点击