外卖开发(七)——校验收货地址是否超出配送范围

外卖开发(七)------校验收货地址是否超出配送范围

一、环境准备

注册账号并登录百度地图开放平台:百度

进入控制台,创建应用,获取AK:

二、地理编码接口

计算距离前,先要获取点地点的经纬度,找到刚刚地理编码里面的接口文档,查看这个接口文档的描述;

不难理解,只要把这个链接中的这两个地方替换成我们需要计算的地点信息,加上AK就可以了。

用postman测试一下,果然可以得到经纬度坐标;

三、计算距离接口

找到驾车路线规划的接口文档,查看接口文档说明,也不难理解,这个接口也是访问一个链接,把链接中的信息,换成需要计算距离的两个地点的经纬度,加上自己的AK;

按照接口文档中提供的地址,用postman测试一下,可以看到返回的结果信息很多,有距离和驾驶时长,待会儿我们就用代码取出距离这个信息;

四、代码开发

application.yml

配置外卖商家店铺地址和百度地图的AK:

OrderServiceImpl

改造OrderServiceImpl,注入上面的配置项:

java 复制代码
    @Value("${sky.shop.address}")
    private String shopAddress;

    @Value("${sky.baidu.ak}")
    private String ak;

在OrderServiceImpl中提供校验方法:

java 复制代码
/**
     * 检查客户的收货地址是否超出配送范围
     * @param address
     */
    private void checkOutOfRange(String address) {
        Map map = new HashMap();
        map.put("address",shopAddress);
        map.put("output","json");
        map.put("ak",ak);

        //获取店铺的经纬度坐标
        String shopCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        JSONObject jsonObject = JSON.parseObject(shopCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("店铺地址解析失败");
        }

        //数据解析
        JSONObject location = jsonObject.getJSONObject("result").getJSONObject("location");
        String lat = location.getString("lat");
        String lng = location.getString("lng");
        //店铺经纬度坐标
        String shopLngLat = lat + "," + lng;

        map.put("address",address);
        //获取用户收货地址的经纬度坐标
        String userCoordinate = HttpClientUtil.doGet("https://api.map.baidu.com/geocoding/v3", map);

        jsonObject = JSON.parseObject(userCoordinate);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("收货地址解析失败");
        }

        //数据解析
        location = jsonObject.getJSONObject("result").getJSONObject("location");
        lat = location.getString("lat");
        lng = location.getString("lng");
        //用户收货地址经纬度坐标
        String userLngLat = lat + "," + lng;

        map.put("origin",shopLngLat);
        map.put("destination",userLngLat);
        map.put("steps_info","0");

        //路线规划
        String json = HttpClientUtil.doGet("https://api.map.baidu.com/directionlite/v1/driving", map);

        jsonObject = JSON.parseObject(json);
        if(!jsonObject.getString("status").equals("0")){
            throw new OrderBusinessException("配送路线规划失败");
        }

        //数据解析
        JSONObject result = jsonObject.getJSONObject("result");
        JSONArray jsonArray = (JSONArray) result.get("routes");
        Integer distance = (Integer) ((JSONObject) jsonArray.get(0)).get("distance");

        if(distance > 5000){
            //配送距离超过5000米
            throw new OrderBusinessException("超出配送范围");
        }
    }

在OrderServiceImpl的submitOrder方法中调用上面的校验方法:

相关推荐
Quantum&Coder4 分钟前
Objective-C语言的计算机基础
开发语言·后端·golang
五味香5 分钟前
Java学习,List 元素替换
android·java·开发语言·python·学习·golang·kotlin
Joeysoda8 分钟前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
迂幵myself9 分钟前
14-6-1C++的list
开发语言·c++·list
扫地僧00911 分钟前
(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
java·开发语言
天乐敲代码12 分钟前
JAVASE入门九脚-集合框架ArrayList,LinkedList,HashSet,TreeSet,迭代
java·开发语言·算法
追Star仙1 小时前
基于Qt中的QAxObject实现指定表格合并数据进行word表格的合并
开发语言·笔记·qt·word
DaphneOdera172 小时前
Git Bash 配置 zsh
开发语言·git·bash
Code侠客行2 小时前
Scala语言的编程范式
开发语言·后端·golang
lozhyf2 小时前
Go语言-学习一
开发语言·学习·golang