功能描述
项目需要判断某个地点是否在某个区域范围内,区域范围需要支持用户编辑,所以不能直接对地址进行解析。本文采用的技术方案是利用百度地图将地址进行编码成经纬度,然后判断经纬度是否在用户绘制的区域范围内即可。
前期准备
申请百度地图账号,获取对应的key,此流程用户自行百度,操作非常简便,就不对此进行详细说明了。
技术实现
地理编码
将地址信息进行地理编码,由实际地理位置转化为经纬度信息,百度地图每天有5000额度的免费转化,如果用户量大需要用户申请额度。
@Value("${map.baidu.key}")
private String key;
@Value("${map.baidu.coordinateUrl:https://api.map.baidu.com/geocoding/v3/?address=%s&output=json&ak=%s}")
private String coordinateUrl;
/**
* 输入地址信息, 返回该地址的经纬度信息
* 地址编码
*
* @param address 地址参数
* @return 经纬度参数
*/
public CoordinateDTO getCoordinate(String address) {
String requestUrl = String.format(coordinateUrl, address, key);
String response = restTemplate.getForObject(requestUrl, String.class);
if (response == null) {
log.error("百度地图地址解析错误,解析地址是:{}, 请求结果为空", address);
throw new BizException("百度地图地址解析错误,请求地址是" + address, GlobalErrorInfo.THIRD_ERROR);
}
JSONObject jsonObject = JSONObject.parseObject(response);
if (jsonObject.getInteger("status") != 0) {
log.error("百度地图地址解析错误,解析地址是:{}, 请求结果是:{}", address, jsonObject.toJSONString());
throw new BizException("百度地图地址解析错误,请求地址是" + address, GlobalErrorInfo.THIRD_ERROR);
}
// 百度地图有精确度字段,但同一地址多次请求返回值一致,所以精确度导致的问题需要人工处理
JSONObject result = jsonObject.getJSONObject("result");
return result.getObject("location", CoordinateDTO.class);
}
坐标位置转化
如果地址信息是其他地图的经纬度,可以将其经纬度信息转化为百度地图的经纬度信息,然后再进行判断点是否在区块范围内。
/**
* 坐标装换, 将坐标进行转换
*
* @param coordinate 需要转换的坐标
* @param from 需要转换坐标的类型
* @param to 转换后的坐标类型
* @return 转换后的坐标值
*/
public CoordinateDTO geoConv(CoordinateDTO coordinate, BaiduMapEnums from, BaiduMapEnums to) {
String params = coordinate.getLng() + "," + coordinate.getLat