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

2022-12-01 09:25:51 +08:00
 Lexgni
目前用的 redis 的 geo 计算,但是用户收货地址变动性很大,不太适合长期保存,且订单完结后数据就用不上了,每次请求去新增,计算完成后删除的话又感觉有些啰嗦,有什么两全其美的办法吗?
3406 次点击
所在节点    程序员
21 条回复
christin
2022-12-01 09:36:11 +08:00
你说的收货地址距离是快递那种全国内的还是外卖那种一个区内的?
Lexgni
2022-12-01 09:40:15 +08:00
@christin 外卖那种短距离的,计算配送员当前位置距离多个目的地的实时距离
Cheons
2022-12-01 09:43:09 +08:00
外卖好像只是计算商家和用户、骑手和用户的直线距离。派单是另外的算法。
Lexgni
2022-12-01 09:47:41 +08:00
@Cheons 现在的场景类似于骑手去多个商家取餐,计算到每个商家的距离
christin
2022-12-01 09:48:30 +08:00
@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
2022-12-01 09:53:33 +08:00
直线距离直接程序里用球面公式计算就行,路线距离调用地图厂商接口
xintianyou
2022-12-01 09:56:12 +08:00
@opengps 嗯 这个靠谱
Lexgni
2022-12-01 10:07:20 +08:00
@christin 谢谢,目前需求还没有这么复杂
yxzblue
2022-12-01 10:58:26 +08:00
地图厂商 SDK 计算骑行距离
kingjpa
2022-12-01 11:57:29 +08:00
外卖都是接入 地图提供的计算平台。 两坐标直接返回 道路距离和时间。
你自己算就图个乐, 立交桥下掉头,修路什么的,真自己算。
用户和 骑手 一起骂
Jooooooooo
2022-12-01 12:22:51 +08:00
两点距离确实是缓存住的, 一直实时去算肯定不行.
cwliang
2022-12-01 12:49:04 +08:00
turf.js
zoharSoul
2022-12-01 13:36:38 +08:00
为什么要删除?
XXWHCA
2022-12-01 14:39:43 +08:00
一般都是直线距离,像外卖都是直线距离,如果是导航需要用到路径规划这些,两个需求需要的算力是没办法比的
Lexgni
2022-12-01 14:43:40 +08:00
@zoharSoul 因为收货地址变动性太大
Lexgni
2022-12-01 14:46:14 +08:00
@XXWHCA 目前的需求确实是计算直线距离,现在的方案是把进行中的订单放在一个组里,完结后删除
Lexgni
2022-12-01 14:46:47 +08:00
@cwliang 谢谢,不过后端处理没办法用这个
sheeta
2022-12-01 15:03:31 +08:00
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
2022-12-01 15:29:16 +08:00
地址距离实际上有经度纬度一般直接算或者有地图厂商的 api 就行吧 例如 https://www.imooc.com/article/322807

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/899243

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX