项目背景
在帆船比赛中,需要实时的展示选手的行驶轨迹、排名、气象、流速、leader line、lay line(地图上画辅助线) 等等数据
技术栈
- php7
- redis
- mysql 5.6
- swoole 2.0.7
- phpgeo (必要时看一遍会更好理解)
结构流程图

phpgeo 在本项目的作用
- 能算出点对点的方位角
- 点是否包指定区域/多边形中(地理围栏计算)
- 能算出指定方位角延长对应距离的坐标点
- 计算点和线之间的垂直距离
lay line 的算法
看下图。需要计算出d、e点的经纬度,使d Mark1与 e Mark 能够连线起来
- 先算出 s1 s2 的方位角与距离
- 通过s1 到 s2 的方位角 与 s1 到 s2 的一半距离, 算出中心点 c
- 计算 Mark1 到 中心点c 浮标 的方位与距离
- 根据算出来的方位(此方位算leader line 有用) +45度 延长 Mark1 到 中心点c的距离 ,从而得出 d 点坐标
- 根据算出来的方位(此方位算leader line 有用) -45度 延长 Mark1 到 中心点c的距离 ,从而得出 e 点坐标
- 最终 Mark点 到d点, Mark点到e点 就形成一条lay line 线

leader line 的算法
看下图。需要计算出a、b点的经纬度,使 a,b点 能够连线起来
- 先算出所有选手中领先选手的坐标(下图中是牛诗茵的坐标)
- 获得lay line 当时算出的方位 + 90度 再延长一段5000米距离的点的坐标 d点
- 获得lay line 当时算出的方位 - 90度 再延长一段5000米距离的点的坐标 e点
- 算出Mark 1到 de线的距离最短距离 Mark1 c 线, 因为Mark1 a b 三点连起来是等腰直角三角形,所以点c 是 ab 线的中心点,所以 Mark1 c = ac = bc
- 根据方位 lay line 当时算出的方位 + 90度 , ac 的距离, 得出a点的坐标
- 根据方位 lay line 当时算出的方位 - 90度 , bc 的距离, 得出b点的坐标
- ab线就是 leader line

过终点算法
看下图。需要算出是否经过f1、f2 线的船只
- 算出 第一名欧阳卉昀 到 f1 f2 的距离
- 判断距离是否在10米的范围内,如图中的ABCD 长方形的区域
- 算出 第一名欧阳卉昀是否在 f1 f2 C E 这个区域内
整体步骤是 在 是否在ABCD区域内->是->是否离开f1 f2 F E 区域->是 = 过终点

系统健壮性
- 所有定位设备每秒数据的汇总再统一发送给连接中的用户,且每秒批量入库。
- 监控方案,supervisor 进程管理工具.