转转上门履约的LBS实践

news/2024/5/4 6:51:32/文章来源:https://blog.csdn.net/zhuanzhuantech/article/details/129302799

文章目录

    • 1 什么是LBS
    • 2 名词解释
    • 3 业务简介
    • 4 基于围栏的曝光下单和分配订单
      • 4.1 曝光下单
        • 4.1.1 初筛:最小覆盖区域矩形
        • 4.1.2 精筛:射线法精确匹配
        • 4.1.3 简单的检索流程
        • 4.1.4 检索索引介绍
      • 4.2 分配订单
    • 5 基于定位服务的路线规划、自主订单调度
      • 5.1 路线规划
      • 5.2 自主订单调度
    • 6 总结
    • 7 参考文档

1 什么是LBS

基于位置的服务(Location Based Services,LBS),是利用各类型的定位技术来获取定位设备当前的所在位置,通过移动互联网向定位设备提供信息资源和基础服务。首先用户可利用定位技术确定自身的空间位置,随后用户便可通过移动互联网来获取与位置相关资源和信息。LBS服务中融合了移动通讯、互联网络、空间定位、位置信息、大数据等多种信息技术,利用移动互联网络服务平台进行数据更新和交互,使用户可以通过空间定位来获取相应的服务。

2 名词解释

  • 工程师:上门履约小哥
  • 围栏:由点组成的闭合的多边图形,如图所示(就是由经纬度组成的多边形)

3 业务简介

转转上门履约业务主要依托于转转C2B,针对3C数码产品进行上门回收,为用户提供快速,精确的上门服务。简单流程图如下:

具体步骤:

  1. 用户打开转转APP回收页,根据用户的IP信息和GPS(用户授权情况下)获取所在城市(或地址)是否支持上门。
  2. 当用户所在城市支持上门,判断用户输入的上门地址是否支持上门。
  3. 用户对需要回收的机器进行估价。
  4. 用户下单,系统自动将订单分配给上门小哥。
  5. 上门工程师上门回收。

4 基于围栏的曝光下单和分配订单

4.1 曝光下单

基于二手3C数码场景,并不能做到全国每个城市,每个角落都支持上门小哥上门回收,所以精准地判断用户地址是否支持上门回收对业务来说至关重要。


简而言之,就是根据用户下单的地址转换成对应的经纬度坐标,根据经纬度判断当前点是否在围栏中,从而判断用户的地址是否支持上门履约。

但是将全国的地图切割成一个个不规则的多边形,在成千上万的不规则图形中,如何快速地判断某一个经纬度在哪一个围栏之中?目前我们采用的是两段匹配的方式。

4.1.1 初筛:最小覆盖区域矩形

如下图所示,任何一个不规则的多边形都能用一个矩形将其框住,只需要获取右上角的坐标,和左下角的坐标就能构建这个矩形,从而快速的判断用户地址经纬度是否在这个矩形里边,快速过滤掉大部分的干扰围栏。

4.1.2 精筛:射线法精确匹配

射线算法:从待判断的点向某一个方向引射线,计算和多边形交点的个数,如果个数是偶数或者0,则点在多边形外,如果是奇数,则在多边形内(当然,一些特殊情况需要单独判断,比如点刚好在顶点或者边上)。如图所示:

根据射线法,就可以精准判断坐标是否在围栏内。

目前常用的判断点在多边形内的方法

  • 射线法:时间复杂度O(n),适用任意多边形。
  • 转角法:时间复杂度O(n),适用任意多边形,对精度要求比较高。
  • 角度判断法:时间复杂度O(n),适用任意多边形,和转角法类似,对精度要求比较高。
  • 叉积判断法:时间复杂度O(n),适用凸多边形。
  • 面积法:时间复杂度O(n),适用凸多边形。
  • 二分法:时间复杂度O(logn),适用凸多边形。
  • 弧长法:时间复杂度O(n),适用任意多边形。

当然,还有其他的算法,如果感兴趣可以自行搜索相关资料。我们根据业务场景需求以及对算法的熟悉,理解程度,最终选择射线法作为匹配算法。为了计算的速度,所有的计算过程都是基于内存运算。

4.1.3 简单的检索流程

大体上分为两个阶段:

  • 第一阶段:服务拉取DB中的围栏信息,做初始化数据,并在内存中构建查询索引。
  • 第二阶段:用户发起查询,系统通过内存中的数据,根据上述算法规则计算是否在围栏中。

4.1.4 检索索引介绍

随着围栏的数量越来越多,暴力遍历的寻找方式会大大的降低检索的速度,所以这里我们采取的是利用R树索引的方式来加快检索的速度,主要加速的是最小覆盖区域矩形

最小覆盖区域矩形进行R树索引

主要步骤如下:

  1. 首先通过R树迅速判断用户所在位置(粗红点)是否被外包矩形覆盖(如下图,红色点代表用户所在位置;R树平均查询复杂度为O(Log(N)),N为多边形个数)。
  2. 如果不被任何外包矩形覆盖则返回不在地理围栏多边形内。
  3. 如果被外包矩形覆盖则还需要进一步判断是否在此外包矩形的多边形内部,采用上文提到的射线法判断。

R树查询示例

4.2 分配订单

不同于外卖和网约车的场景,二手回收场景的订单密度和订单量并不是非常大,那低成本地实现快速订单分配就极其重要。基于现状,还是通过围栏的匹配算法,就能找到在当前服务区域内提供服务的上门小哥。

简单匹配流程


大体步骤:

  1. 将工程师根据每个人的服务区域挂载相对应的围栏下边。
  2. 用户下单后,根据订单的经纬度匹配到围栏。
  3. 找到围栏下边挂载的工程师,再根据相应的业务规则、特殊场景分配工程师。

5 基于定位服务的路线规划、自主订单调度

5.1 路线规划

随着订单的数量越来越多,履约效率成为整个履约过程中极为重要的一环。而提高履约效率,最为关键的是要判断订单和人之间的距离。具体讲一下整个根据距离来履约的演进过程:

  • 根据两点间的坐标点计算直线距离

这是所说的直线距离,实际为球面距离,我们的地球是一个球体,球面上的两个点,可以通过纯数学的几何公式进行计算,感兴趣的可以自行搜索公式和推导过程。

根据两点之间计算和订单的距离是最简单、粗暴的方法,但是这个又会带出另一个问题,针对一些复杂地形,只是计算直线距离会带来极大的误差(如遇到河流,桥梁等等,尤其像重庆这样地形复杂的城市),如图所示:

  • 根据第三方导航服务计算距离

要计算两点间的真实距离,由于涉及到城市的道路规划,复杂路线,自己去实现一套智能导航系统不太现实,所以我们采用的是接入第三方的导航服务来实现人和订单距离之间的智能导航。但是随之也产生了问题,由于业务的特殊性,复杂性(经常需要批量调用、根据复杂业务规则计算等等),如果用同步请求第三方的导航服务的方式来做智能规划,这样请求服务的耗时会明显的增加,显然这样不能满足我们性能的要求。所以针对这种场景,我们的现在的方案如下(简图):

具体步骤如下:

  1. 用户下单。
  2. 根据LBS服务将订单分配到工程师身上。
  3. 系统根据工程师身上的所有订单情况(实际业务场景订单的属性)做订单规划。
  4. 异步调用第三方服务,根据导航结果做计算。
  5. 再根据规则,综合计算真正的路线规划,再将数据放入缓存中。
  6. 工程师从缓存中查询相关的信息。

5.2 自主订单调度

随着订单量越来越多,实际情况也越来越复杂,后台系统分配规则,计算再合理也有满足不了实际情况的时候。这个时候,一线的人员自主的对订单进行调度分配,这样可以使得整个业务流程更加的顺畅。

  • 场景1:工程师A有一订单A,但是现在工程师A临时有事过不去,发现工程师B正好在订单A附近,这个时候相联系工程师B将订单转过去。
  • 场景2:工程师A刚履约完订单A,发现这附近刚好有一订单B属于工程师B,为了提高效率,工程师A可以联系工程师B将订单抢过来。

简图如下:

那如何快速地找到在某个工程师附近的订单,或者某个订单附近的工程师呢?显然,暴力遍历是可以实现的,但是明显性能是完全不能满足我们的要求的。基于这个场景,我们使用了ES的GEO来实现,将工程师实时的位置信息,订单的地址信息存入ES,利用ES来快速计算。

简单来说,就是工程师定时上报地址经纬度,存入ES。用户下单后,将订单地址的经纬度也存入ES,查询的时候再直接使用ES提供的GEO查询范围内的数据。

          "filter": [{"geo_distance": {//查询中心点"location": {"lat": 20.12345,"lon": 100.223344}//范围"distance": "3km","distance_type": "arc",}}}]

其实很多的第三方存储引擎都提供了GEO的服务,如MySql,Redis,ES这里就不展开讲了,有兴趣可以自行搜索资料。

6 总结

本文描述了转转上门履约业务基于LBS的几种不同场景的简单使用,当然除了上面描述的场景,还有更多的复杂的使用需要根据不同的业务的场景做特殊,定制化的处理。随着数据量的不断增加,业务的实现方式,检索的方式也是需要不断的优化,服务也需要不断的升级,为业务保驾护航。

7 参考文档

  • https://www.cnblogs.com/lbser/p/4471742.html
  • https://my.oschina.net/1024bits/blog/782820
  • https://www.cnblogs.com/yym2013/p/3673616.html
  • https://blog.csdn.net/WilliamSun0122/article/details/77994526
  • https://toutiao.io/posts/4as8i9/preview

转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_76566.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ExSwin-Unet 论文研读

ExSwin-Unet摘要1 引言2 方法2.1 基于窗口的注意力块2.2 外部注意力块2.3 不平衡的 Unet 架构2.4 自适应加权调整2.5 双重损失函数3 实验结果3.1 数据集3.2 实现细节3.3 与 SOTA 方法的比较3.4 消融研究4 讨论和限制5 结论数据集来源: https://feta.grand-challenge…

任务类风险漏洞挖掘思路

任务类风险定义: 大部分游戏都离不开任务,游戏往往也会借助任务,来引导玩家上手,了解游戏背景,增加游戏玩法,提升游戏趣味性。任务就像线索,将游戏的各个章节,各种玩法,…

【JavaWeb】数据链路层协议——以太网 + 应用层协议——DNS

以太网 以太网不是一个具体的网络,而是一个技术标准,主要应用于数据链路层和物理层。 以太网数据帧结构 以太网的数据帧结构由三部分构成: 帧头 载荷 帧尾 其中的MAC地址是六位,这样就比IPV4所表示的地址大很多,…

北京移动CM311-5s-ZG_GK6323V100C_2+8_免拆一键卡刷固件包

北京移动CM311-5s-ZG_GK6323V100C_28_免拆一键卡刷固件包 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件,…

个人网站如何集成QQ快捷登录功能?

目录 一、网站集成QQ快捷登录的好处 二、网站接入QQ快捷登录具体步骤 (1)登录到QQ互联官网 (2)进行个人开发者认证 (3)创建网站应用 (4)填写网站资料 三、如何在本地开发环境…

Linux- 系统随你玩之--好用到炸裂的系统级监控、诊断工具

文章目录1、前言2、lsof介绍2.1、问题来了: 所有用户都可以采用该命令吗?3、 服务器安装lsof3.1、安装3.2、检查安装是否正常。4、lsof 命令4.1、常用功能选项4.2、输出内容4.2.1 、FD和 TYPE列5、 lsof 命令实操常见用法6 、常用组合命令7、 结语1、前言…

Android开发如何自定义View实现圆弧进度效果

在Android开发中,通过自定义View实现自己想要的效果是作为android开发程序员的一项必备技能,自定义View对于android开发来说也是比较难的一项技术。 涉及到的知识Canvas(画布),Paint(画笔),自定…

测试人员如何在测试环境数据库批量生成测试数据?方案分享

测试人员为了测试某个特定场景,往往需要在测试环境数据库中插入特定的测试数据来满足需求;性能测试时,常需要在测试环境生成大量可用测试数据来支持性能测试;建设持续集成持续交付体系时,我们往往也需要在测试环境生成…

Linux基础命令-nice调整进程的优先级

文章目录 Nice 命令介绍 语法格式 常用参数 参考实例 1 调整bash的优先级为-10 2 调整脚本的优先级为6 3 调整指令的优先级 4 默认使用nice命令调整优先级 命令总结 Nice 命令介绍 nice命令的主要功能是用于调整进程的优先级,合理分配系统资源。Linux系…

代码随想录算法训练营day47 |动态规划 198打家劫舍 213打家劫舍II 337打家劫舍III

day47198.打家劫舍1.确定dp数组(dp table)以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组213.打家劫舍II情况一:考虑不包含首尾元素情况二:考虑包含首元素,不包含尾元素情况三&#x…

taobao.item.img.delete( 删除商品图片 )

¥开放平台免费API必须用户授权 删除商品图片 公共参数 请求地址: HTTP地址:http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoClient(url…

论坛性能测试难点有哪些?

1 测试工具方面 用户和业务模型分析搭建合适的脚本开发(不根据用户和业务的模型来开发脚本,认为要回归成功即可)合适的需求分析转化为场景设计(不知道如何根据需求进行场景设计)大容量系统的数据生成和使用大型系统的…

MyBatis-Plus框架解析?

简单介绍:MyBatis-Plus(简称 MP)(由苞米豆公司开源)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MP会内置集成部分SQL方法,可以直接…

错误:PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。“+文件路径“的解决方案

最近在使用python进行筛选图片的时候,想到用python里面的os库进行图片的删除。 具体筛选方法就是,删除掉图片长度或宽度小于100像素的图片,示例代码如下所示: for file in os.listdir(img_path):if file .split( . )[ - 1 ] j…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.04-03.10 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号同时会推送最新的比赛消息,欢迎关注!更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考,以比赛官网为准目录2023-03-04&…

一文说清Kubernetes的本质

文章目录Kubernetes解决了什么问题?Kubernetes的全局架构Kubernetes的设计思想Kubernetes的核心功能Kubernetes如何启动一个容器化任务?Kubernetes解决了什么问题? 编排?调度?容器云?还是集群管理&#xf…

Python 虚拟环境的使用

PyCharm 创建的虚拟环境与使用 workon 命令创建的虚拟环境在本质上没有区别,它们都是 Python 的虚拟环境。 使用 PyCharm 创建工程时,使用可以使用曾经工程的虚拟环境,或者新建一个虚拟环境来安装 Python 的库,又或者使用 workon…

rk3288-android8-IR-mouse

IR问题: mouse按键使用不了 然后排查: 1.排查上报 ir_key6{ rockchip,usercode <0xbf00>;rockchip,key_table <0xff KEY_POWER>,<0xfe KEY_MUTE>, <0xfd KEY_1>, <0xfc KEY_2>, <0xfb KEY_3>, <0xfa KEY_4>, <0xf9 KEY_5>…

2023年天津财经大学珠江学院专升本专业课考试题型

天津财经大学珠江学院关于2023年高职升本科专业课考试时间及题型一、专业课考试 &#xff08;一&#xff09;时间安排 2023年天津财经大学珠江学院高职升本科专业课考试定于2023年3月25日14&#xff1a;00-17:00进行&#xff0c;凡报考工商管理、旅游管理、税收学专业的考生&am…

卡特兰数及常见模型

卡特兰数 英文名Catalan number&#xff0c; 是组合数学中一个常出现在各种计数问题中出现的数列。其前几项为: 1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 35357670 129644790 477638700 1767263190 6564120420 24466267020 91482563640 343…