项目介绍
前期做的项目,当时公众号名为”烟台微公交“,现在改名为”烟台公交时刻“。核心功能:微公交首页,公交定位,站点查询,公交查询,网线调整,失物招领,满意度调查,随手拍等。
前端使用微信公众号,后台使用thinkphp5框架。
重点难点
对接第三方api接口实现公交定位,第三方api只提供了线路站点名、站点坐标、公交车信息、公交车坐标等信息。需要自己根据坐标信息进行转换。并实现了公交定位精确到两个站点的具体位置,用户定期刷新可实时看到公交轨迹。支持站点换向功能。
通过linux批处理的方式,定期更新线路站点信息;定期更新公交位置
对接jssdk实现用户定位;使用原生算法计算距离用户距离最近的站点进行推荐显示。
核心:坐标转换为距离;距离用户最近的车算法。
收获
坐标转化为距离算法:
<?php
/**
* 计算两点之间的距离
* @param $lng1 经度1
* @param $lat1 纬度1
* @param $lng2 经度2
* @param $lat2 纬度2
* @param int $unit m,km
* @param int $decimal 位数
* @return float
*/
function getDistance($lng1, $lat1, $lng2, $lat2, $unit = 2, $decimal = 2)
{
$EARTH_RADIUS = 6370.996; // 地球半径系数
$PI = 3.1415926535898;
$radLat1 = $lat1 * $PI / 180.0;
$radLat2 = $lat2 * $PI / 180.0;
$radLng1 = $lng1 * $PI / 180.0;
$radLng2 = $lng2 * $PI / 180.0;
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
$distance = $distance * $EARTH_RADIUS * 1000;
if ($unit === 2) {
$distance /= 1000;
}
return round($distance, $decimal);
}