黑马程序员苍穹外卖项目开发收获【地图收货范围】

本文介绍了如何在外卖系统中使用百度地图API来验证用户的收货地址是否超出配送范围,包括获取商家和用户位置、进行路线规划并检查距离限制。

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

校验收货地址是否超出配送范围

1. 环境准备

登录百度地图开放平台:https://lbsyun.baidu.com/

进入控制台,创建应用,获取AK:
在这里插入图片描述

在这里插入图片描述

相关接口:

https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding

https://lbsyun.baidu.com/index.php?title=webapi/directionlite-v1

2. 代码开发

2.1 application.yml

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

在这里插入图片描述

2.2 OrderServiceImpl

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

    @Value("${sky.shop.address}")
    private String shopAddress;

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

在OrderServiceImpl中提供校验方法:

/**
     * 检查客户的收货地址是否超出配送范围
     * @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方法中调用上面的校验方法:
在这里插入图片描述

总结

1、主要还是要看得懂各大地图平台的API接口,和会使用。

如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要追加额外费用) 微信小程序是腾讯公司基于微信平台推出的一种轻量级应用形态,它无需用户下载安装即可在微信内直接使用。自2017年正式上线以来,小程序凭借其便捷性、易获取性和出色的用户体验迅速获得市场认可,并成为连接线上线下服务的重要桥梁。 小程序的核心特点包括: 零安装:用户只需通过微信扫一扫或搜索功能,即可打开和使用小程序,大大降低了用户的使用门槛和手机存储空间压力。 速度快:加载速度相较于传统的HTML5网页更快,依托于微信强大的基础设施,能够实现近乎原生应用的流畅体验。 跨平台兼容:开发者一次开发,即可在多种终端设备上运行,免除了复杂的适配工作,大大提高了开发效率。 社交属性强:小程序可以无缝嵌入微信生态,支持分享至聊天窗口、朋友圈等社交场景,有利于用户间的传播和裂变增长。 丰富接口能力:提供丰富的API接口,可调用微信支付、位置服务、用户身份识别等多种功能,方便企业进行商业服务的集成与拓展。 目前,微信小程序已经覆盖了电商购物、生活服务、娱乐休闲、教育学习、工具助手等多个领域,为数以亿计的用户提供便捷的服务入口,也为众多商家和开发者提供了新的商业模式和创业机会。随着技术的不断升级和完善,小程序已成为现代移动互联网生态中不可或缺的一部分。
### 苍穹外卖百度地图地址解析失败解决方案 在处理苍穹外卖项目的订单提交功能时,`OrderServiceImpl.submitOrder()` 方法中的地址验证逻辑存在缺陷。当用户填写的是直辖市的地址而非省辖市时,由于未正确拼接完整的省份名称,导致发送到百度地图API的查询字符串不完整,从而引发地址解析错误[^1]。 为了修复这一问题并确保所有类型的中国城市都能被正确定位,建议采取如下措施: #### 修改后的代码实现 通过调整现有代码,在构建请求参数前先判断输入的城市是否属于四个直辖区之一(北京、天津、上海、重庆),如果是,则自动补充相应的省级行政区划名作为前缀;对于其他地区则保持原有逻辑不变。 ```java private String formatAddressForBaiduApi(String address){ // 定义直辖市区列表 List<String> municipalities = Arrays.asList("北京市", "天津市", "上海市", "重庆市"); // 判断当前address是否包含上述任何一个直辖市关键字 boolean isMunicipality = municipalities.stream().anyMatch(address::contains); if(isMunicipality){ // 如果是直辖市, 返回原样返回即可(因为已经包含了省市信息) return address; }else{ // 否则尝试从中提取具体区县部分,并在其前面加上默认的“省” int lastIndex = address.lastIndexOf('区'); if(lastIndex != -1 && lastIndex > 0){ String districtName = address.substring(0,lastIndex+1); return "省"+districtName; } // 对于无法识别的情况,默认加“省”,防止异常发生 return "省"+address; } } ``` 此函数会在调用百度地图服务之前预处理用户的收货地址字段,保证最终传递给第三方平台的数据格式统一且有效。 另外值得注意的一点是在配置文件中可能存在占位符未能正确替换的问题,这同样可能导致外部资源加载失败或响应不符合预期。因此还需要确认 `application.properties` 或者 `application.yml` 文件内关于店铺位置的相关设置项已正确赋值,避免因环境变量缺失而影响程序正常运作[^2]。 最后提醒开发者们注意版本管理的重要性,及时将修改过的源码同步至云端仓库以便团队协作开发以及后续维护工作顺利开展[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥小哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值