高德 android 百度转高德,记一次百度和高德经纬度互转(不是你想的那样)

本文讲述了在项目中遇到的经纬度转换问题,即App使用高德SDK,但服务端存储的经纬度为百度格式。为解决此问题,作者通过Java注解实现自动经纬度转换,简化了转换工作。在请求接口前和处理返回值后,自动将经纬度转化为所需格式,避免了忘记转换和重复转换导致的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,这里绝不是跟你讲如何百度和高德经纬度转换的算法。

其次,我在这里想抛下我的痛,不知道大家有没有遇到过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){

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值