最近项目中碰见并解决了一个的问题 (内牛满面啊...)
主要需求是这样的:
在百度地图上仍然展示百度地图的坐标,但是提交数据是要上传精确的gps坐标 (客户那边是用google地图做的但客户要求android客户端用百度地图...)
众所周知在我们的天朝GPS是不可能公开让所有人都知道的,所以百度google地图都会有一定的偏移量 ,只有加上偏移量之后 ,国家测绘地理信息什么协会,才会同意商用或者提供API接口
我们用百度地图时,默认获取的都是baidu09的百度坐标,如果想获取GPS就得转换了(当然也有别的办法,直接使用WGS坐标来定位,当然,显示的时候仍然要转换一下,转换方法下边有代码,自己参考)
昨天弄了一下午 今天仔细一行一行的调试 最终终于找到了这个bug 内牛满面啊。。。
没有文档伤不起啊。。。
上代码
/**
*
*<font color="#00f000"> </font><font color="#00ff00">特别是这里x一定要传lon,y值传lat 传反了后果自负(我就是在这里栽跟头的 谨记谨记)</font>
*/
String bmapBase64Encode =
"http://api.map.baidu.com/ag/coord/convert?from=0&to=4<font color="
#00f000
">&x=%1$s&y=%2$s"
</font>;
/**
* 转换百度地图坐标
* @param baiduLat
* 百度地图坐标 纬度
* @param baiduLon
* 百度地图坐标 经度
* @throws IOException
* @throws HWNetException
* @throws JSONException
*/
private
void
tran(
double
baiduLat,
double
baiduLon)
throws
IOException,
HWNetException, JSONException {
//就一个普通个的url请求封装成Client而已
AndroidClient client =
new
AndroidClient();
//获取请求后数据
String json = client.doGetWithString(String.format(bmapBase64Encode,String.valueOf(baiduLon),String.valueOf(baiduLat)));
//得到JSON对象
JSONObject object =
new
JSONObject(json);
System.out.println(object);
Double lon1 = Double.parseDouble(
new
String(Base64.decodeBase64(object.getString(
"x"
).getBytes())));
Double lat1 = Double.parseDouble(
new
String(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)坐标转换百度地图坐标只需一句话
CoordinateConvert.bundleDecode(CoordinateConvert.fromWgs84ToBaidu(
new
GeoPoint((
int
)(gpsLat*1E6), (
int
)(gpsLon*1E6))))
红色部分 血的教训啊。。。
mark一下 分享一下 顺便总结一下 ...
转载自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=185177