通过调用百度地图提供的api得到两点经纬度从而得到两点之间的距离
获取经纬度、两点之间距离工具类
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sky.constant.MessageConstant;
import com.sky.exception.OrderBusinessException;
import org.springframework.stereotype.Component;
import java.util.HashMap;
@Component
public class BaiDuUtil {
//地理编码
private static final String GEOCODIN = "https://api.map.baidu.com/geocoding/v3";
//路线规划
private static final String DIRECTIONLITE = "https://api.map.baidu.com/directionlite/v1/riding";
/**
* 获取地理坐标
*
* @param map
* @return 纬度, 经度
*/
public String getLatLng(HashMap map) {
String coordinates = HttpClientUtil.doGet(GEOCODIN, map);
JSONObject jsonObject = JSON.parseObject(coordinates);
if (!jsonObject.getString("status").equals("0")) {
throw new OrderBusinessException(MessageConstant.ADDRESS_RESOLUTION_FAILURE);
}
//获取经纬度
JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
String lat = location.getString("lat");
String lng = location.getString("lng");
return lat + "," + lng;
}
/**
* 获取两点的距离
* @param map
* @return
*/
public Integer getDistance(HashMap map){
String routePlanning = HttpClientUtil.doGet(DIRECTIONLITE, map);
JSONObject jsonObject = JSON.parseObject(routePlanning);
if (!jsonObject.getString("status").equals("0")) {
throw new OrderBusinessException(MessageConstant.ROUTE_PLANNING_FAILURE);
}
//获取两点之间路线规划的距离
JSONArray jsonArray = jsonObject.getJSONObject("result").getJSONArray("routes");
Integer distance = ((JSONObject)jsonArray.get(0)).getInteger("distance");
return distance;
}
}
实际调用示例
private void checkOutOfRange(String address) {
HashMap map = new HashMap();
//获取店铺地理编码
map.put("address", shopAddress);
map.put("output", "json");
map.put("ak", ak);
String shopLatLng = baiDuUtil.getLatLng(map);
//获取用户地址经纬度坐标
map.put("address", address);
String userLatLng = baiDuUtil.getLatLng(map);
//路线规划
map.put("origin", shopLatLng);
map.put("destination", userLatLng);
map.put("steps_info", "2");
Integer distance = baiDuUtil.getDistance(map);
if (distance > Orders.DISTRIBUTION_SCOPE) {
throw new OrderBusinessException(MessageConstant.BEYOND_DISTRIBUTION_SCOPE);
}
}
参数解释
ak:百度地图平台的访问应用AK
地址:https://lbsyun.baidu.com/apiconsole/key#/home 具体怎么创建可以百度,比较简单
address:具体地址 这个地址要在百度地图能搜索到 例如: 湖南省长沙市岳麓区金星中路383号王府井店
output:固定写法
origin:起点经纬度,格式为:纬度,经度;小数点后不超过6位
destination:终点经纬度,格式为:纬度,经度;小数点后不超过6位
steps_info:固定写法
具体参数解释请看官方文档
地理编码:https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-geocoding-base
骑行路线规划:https://lbsyun.baidu.com/faq/api?title=webapi/guide/webservice-lwrouteplanapi/cycling