转转上门履约的LBS实践

2023-10-17 09:30
文章标签 实践 lbs 转转 上门 履约

本文主要是介绍转转上门履约的LBS实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 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),更多干货实践,欢迎交流分享~

这篇关于转转上门履约的LBS实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/224463

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

【HarmonyOS】-TaskPool和Worker的对比实践

ArkTS提供了TaskPool与Worker两种多线程并发方案,下面我们将从其工作原理、使用效果对比两种方案的差异,进而选择适用于ArkTS图片编辑场景的并发方案。 TaskPool与Worker工作原理 TaskPool与Worker两种多线程并发能力均是基于 Actor并发模型实现的。Worker主、子线程通过收发消息进行通信;TaskPool基于Worker做了更多场景化的功能封装,例

vue2实践:第一个非正规的自定义组件-动态表单对话框

前言 vue一个很重要的概念就是组件,作为一个没有经历过前几代前端开发的我来说,不太能理解它所带来的“进步”,但是,将它与后端c++、java类比,我感觉,组件就像是这些语言中的类和对象的概念,通过封装好的组件(类),可以通过挂载的方式,非常方便的调用其提供的功能,而不必重新写一遍实现逻辑。 我们常用的element UI就是由饿了么所提供的组件库,但是在项目开发中,我们可能还需要额外地定义一

《C++中的移动构造函数与移动赋值运算符:解锁高效编程的最佳实践》

在 C++的编程世界中,移动构造函数和移动赋值运算符是提升程序性能和效率的重要工具。理解并正确运用它们,可以让我们的代码更加高效、简洁和优雅。 一、引言 随着现代软件系统的日益复杂和对性能要求的不断提高,C++程序员需要不断探索新的技术和方法来优化代码。移动构造函数和移动赋值运算符的出现,为解决资源管理和性能优化问题提供了有力的手段。它们允许我们在不进行不必要的复制操作的情况下,高效地转移资源

Vue3+elementplus实现图片上传下载(最强实践)

图片上传子组件: 实现照片的上传,预览,以及转成以逗号隔开的图片地址,即时监听,并发送消息到父组件。 <!-- ImageUploader.vue --> <template><div><el-upload class="avatar-uploader" :http-request="customUpload" :before-upload="beforeUpload":show-fil

Banana Pi BPI-F3 进迭时空RISC-V架构下,AI融合算力及其软件栈实践

RISC-V架构下,AI融合算力及其软件栈实践 面对未来大模型(LLM)、AIGC等智能化浪潮的挑战,进迭时空在RISC-V方向全面布局,通过精心设计的RISC-V DSA架构以及软硬一体的优化策略,将全力为未来打造高效且易用的AI算力解决方案。目前,进迭时空已经取得了显著的进展,成功推出了第一个版本的智算核(带AI融合算力的智算CPU)以及配套的AI软件栈。 软件栈简介 AI算法部署旨