首先,这里绝不是跟你讲如何百度和高德经纬度转换的算法。
其次,我在这里想抛下我的痛,不知道大家有没有遇到过App用的高德sdk,然而项目中服务端存储的各种资源信息中的经纬度却是百度的(其实也有部分是高德的),而且App和内嵌Web打交道,内嵌Web有的用百度有的用高德,由于特殊历史原因变得如此,而且未来也基本不能变过来,怎么办,只能继续。
在请求接口时候,传给接口的经纬度必须先转成百度的格式再发,获取到接口返回的经纬度必须先转成高德的再用,否则必定是BUG,可能你觉得没啥,但是现实中经常发现有人忘记转换导致了BUG,还有重复转换也导致了BUG,得非常非常细心才行,很累是不是?
于是,某天突然想到通过java注解来简化此工作,做到让经纬度自动转换成想要的格式:
// GD:高德, BD:百度
@LatLngInside(ConvertTo.GD)
private static class SearchParams {
public String cityId;
public String poiId;
@Lat
public double lat;
@Lng
public double lon;
public String starIndex;
}
很显然以上注解的作用是将百度经纬度转成高德的。反之,想把高德转化成百度改成@LatLngInside(ConvertTo.BD)即可;
以JSON方式请求接口,在将请求对象转化成JSON之前先用LatLngConvertor转化一遍,以及获取接口返回值后生成的对象先通过LatLngConvertor转化一遍再抛给业务层处理。
经纬度变量单位都是double。所以,能实现自动经纬度转化必须保证经纬度是double类型,且加上对应注解。
public void doHttpRequest(Object reqBody){
// 请求网络前先经纬度转换
LatLngConvertor.autoConvertLatLng(reqBody);
// 网络请求
String resJson = doHttpRequest(reqBody);
T response = decodeJSON(resJson);
// 返回解析对象前先经纬度转换
LatLngConvertor.autoConvertLatLng(response);
handlerSuccess(response);
}
public void handlerSuccess(response){