V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Lexgni
V2EX  ›  程序员

请问一般计算收货地址距离怎么实现?

  •  
  •   Lexgni · 2022-12-01 09:25:51 +08:00 · 3359 次点击
    这是一个创建于 708 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前用的 redis 的 geo 计算,但是用户收货地址变动性很大,不太适合长期保存,且订单完结后数据就用不上了,每次请求去新增,计算完成后删除的话又感觉有些啰嗦,有什么两全其美的办法吗?
    21 条回复    2022-12-02 09:04:21 +08:00
    christin
        1
    christin  
       2022-12-01 09:36:11 +08:00 via iPhone
    你说的收货地址距离是快递那种全国内的还是外卖那种一个区内的?
    Lexgni
        2
    Lexgni  
    OP
       2022-12-01 09:40:15 +08:00
    @christin 外卖那种短距离的,计算配送员当前位置距离多个目的地的实时距离
    Cheons
        3
    Cheons  
       2022-12-01 09:43:09 +08:00 via Android
    外卖好像只是计算商家和用户、骑手和用户的直线距离。派单是另外的算法。
    Lexgni
        4
    Lexgni  
    OP
       2022-12-01 09:47:41 +08:00
    @Cheons 现在的场景类似于骑手去多个商家取餐,计算到每个商家的距离
    christin
        5
    christin  
       2022-12-01 09:48:30 +08:00 via iPhone   ❤️ 1
    @Lexgni
    如果是外卖的话我记得显示的都是预估时间吧,因为同一段路不同时间点走拥堵程度是不一样的。
    美团公开过时间预估模型,你可以参考一下
    https://mp.weixin.qq.com/s/LgXP2IRbyidRSSH9U7q5RQ

    https://tech.meituan.com/2019/02/21/meituan-delivery-eta-estimation-in-the-practice-of-deep-learning.html

    如果你要的是距离的话可以考虑接入地图平台。
    opengps
        6
    opengps  
       2022-12-01 09:53:33 +08:00
    直线距离直接程序里用球面公式计算就行,路线距离调用地图厂商接口
    xintianyou
        7
    xintianyou  
       2022-12-01 09:56:12 +08:00
    @opengps 嗯 这个靠谱
    Lexgni
        8
    Lexgni  
    OP
       2022-12-01 10:07:20 +08:00
    @christin 谢谢,目前需求还没有这么复杂
    yxzblue
        9
    yxzblue  
       2022-12-01 10:58:26 +08:00
    地图厂商 SDK 计算骑行距离
    kingjpa
        10
    kingjpa  
       2022-12-01 11:57:29 +08:00   ❤️ 2
    外卖都是接入 地图提供的计算平台。 两坐标直接返回 道路距离和时间。
    你自己算就图个乐, 立交桥下掉头,修路什么的,真自己算。
    用户和 骑手 一起骂
    Jooooooooo
        11
    Jooooooooo  
       2022-12-01 12:22:51 +08:00
    两点距离确实是缓存住的, 一直实时去算肯定不行.
    cwliang
        12
    cwliang  
       2022-12-01 12:49:04 +08:00
    turf.js
    zoharSoul
        13
    zoharSoul  
       2022-12-01 13:36:38 +08:00
    为什么要删除?
    XXWHCA
        14
    XXWHCA  
       2022-12-01 14:39:43 +08:00
    一般都是直线距离,像外卖都是直线距离,如果是导航需要用到路径规划这些,两个需求需要的算力是没办法比的
    Lexgni
        15
    Lexgni  
    OP
       2022-12-01 14:43:40 +08:00
    @zoharSoul 因为收货地址变动性太大
    Lexgni
        16
    Lexgni  
    OP
       2022-12-01 14:46:14 +08:00
    @XXWHCA 目前的需求确实是计算直线距离,现在的方案是把进行中的订单放在一个组里,完结后删除
    Lexgni
        17
    Lexgni  
    OP
       2022-12-01 14:46:47 +08:00
    @cwliang 谢谢,不过后端处理没办法用这个
    sheeta
        18
    sheeta  
       2022-12-01 15:03:31 +08:00
    xiaohundun
        19
    xiaohundun  
       2022-12-01 15:21:55 +08:00
    两点间直线距离,是这种么?

    public static Double distance(String lat, String lng, String lat2, String lng2) {
    if (StringUtils.isBlank(lat) || StringUtils.isBlank(lng) || StringUtils.isBlank(lat2) || StringUtils.isBlank(lng2)) {
    return 0d;
    }
    double d = 6378.138 * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin((Double.parseDouble(lat) * Math.PI / 180 - Double.parseDouble(lat2) * Math.PI / 180) / 2), 2) + Math.cos(Double.parseDouble(lat) * Math.PI / 180) * Math.cos(Double.parseDouble(lat2) * Math.PI / 180) * Math.pow(Math.sin((Double.parseDouble(lng) * Math.PI / 180 - Double.parseDouble(lng2) * Math.PI / 180) / 2), 2)));
    BigDecimal bigDecimal = new BigDecimal(d);
    return bigDecimal.setScale(2, RoundingMode.HALF_UP).doubleValue();
    }
    iosyyy
        20
    iosyyy  
       2022-12-01 15:29:16 +08:00
    地址距离实际上有经度纬度一般直接算或者有地图厂商的 api 就行吧 例如 https://www.imooc.com/article/322807
    Lexgni
        21
    Lexgni  
    OP
       2022-12-02 09:04:21 +08:00
    @xiaohundun 是的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1014 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:42 · PVG 03:42 · LAX 11:42 · JFK 14:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.