博客> 打车项目问题总结(高德地图)
打车项目问题总结(高德地图)
2020-02-25 09:17 评论:0 阅读:1906 飞翔信念
ios 打车项目问题总结(高德地图)
    之前做的打车项目现在终于可以总结下了,项目中基本用到了高德地图的大部分功能,大致有11点:

1.定位精度,指针和搜索的区别

    为什么滴滴打车或者其他打车软件都有指针选取起点位置,起点可以通过poi搜索出来,也可以直接用拖动地图指针选取位置,这两个的区别就是:

指针选取:精度高,double类型,小数点之后四十几位(项目中安卓是十四位,所以我们用的时候是保留了十四位小数),一般用于选择起点,司机去接乘客的时候一般能准确的接到乘客。 poi搜索:精度够用,但不够精确,CGFloat类型,小数点后六位,一般用于搜索出来的目的地。(有人说为什么目的地不用指针呢,这个时候用户就在车上,一般快到的时候用户都会跟司机讲在哪哪哪停车,精度高了反而没什么作用)

2.用户端用户位置实时追踪

    这个就是用户的位置小蓝点,可以通过以下代码开启,图标可替换为小车图标,显示效果类似小车移动,但只适合司机端显示

representation = [[MAUserLocationRepresentation alloc] init];
representation.showsAccuracyRing = NO;///精度圈是否显示,默认YES
representation.showsHeadingIndicator = YES;///是否显示方向指示(MAUserTrackingModeFollowWithHeading模式开启)。默认为YES
representation.enablePulseAnnimation = NO;///内部蓝色圆点是否使用律动效果, 默认YES
//    representation.image = [UIImage imageNamed:@"arrow"]; ///定位图标, 与蓝色原点互斥
[self.mapView updateUserLocationRepresentation:representation];

用户位置更新的代理方法:
-(void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation

3.用户端小车平滑移动

    我们在用滴滴的时候在行驶途中可以看到小车在实时的移动,过程中一共试了三种方法:

(1)当时想过用用户实时追踪位置来做,把图标换成小车的就可以,但是在实际叫车时考虑到有可能一个人用这个软件给他朋友叫车的话,那位置岂不是显示的不对了,不可取;

(2)通过服务器记录司机的实时位置,司机端每隔七八秒上传一次自己的最新位置,用户端每隔十秒从服务器获取一下最新位置,然后用户端记录上一次的点和本次请求到的最新点,两点之前绘制路线(路线样式不设置),看起来其实没有路线,然后小车沿着路线动画,这个实现了之后发现有时候小车来回跑动,虽然起终点没有错,但中间还有调头拐弯什么的,后来才发现绘制路线的话是需要考虑实时路况进行的,不是直接的两点间移动,也不可取;

(3)这点其实就是在第二点的基础上让小车在两点间直接直线移动,高德提供了两点之间平滑移动的效果,这个的话如果在拐弯的时候也是直接移动过去的,不过这种效果最好,我研究了下滴滴,发现他们在拐弯的时候也是直接移动的。

4.刚开始的三个小车随机移动

    刚打开用户端软件的时候,我们能发现自己位置附近有几辆小车在那儿移动,这个的话我们没有用服务器返回的真实位置来做,这样的好几辆车一直请求真实位置的话就有点麻烦了;我这边是请求到用户的位置后,把小数点第四位之后的数给随机生成一下起点和终点,然后随机绘制路径,让小车在自己沿不同的路线跑,这样给人的感觉就像是真实的一样。

5.司机用户相互通知(透传)

    在用户端叫车之后,司机端要做出相应的反应,这点用的是极光推送的透传,和通知不同的就是透传不会弹通知栏,其他没什么,比较简单。

6.司机端导航,偏移重新划线,获取导航数据

    司机端的导航而言,我们这块分成了两部分,一个是司机去接乘客的时候有个导航,另一个是司机去送乘客到目的地的时候是一个导航,我设置了两个代理在一个界面的时候如果同时存在会出错,高德地图导航界面的路径信息会失灵,所以用其中一个的时候需把另一个置空;

    在导航的时候我还发现高德地图sdk在偏航的时候有时管用有时不管用,这个就令我比较尴尬了,而且有时候偏航了重新导航的时候也不太对,就用了个比较保险的办法,在以下方法中手动重新开启导航
/**
 * @brief 出现偏航需要重新计算路径时的回调函数.偏航后将自动重新路径规划,该方法将在自动重新路径规划前通知您进行额外的处理.
 * @param driveManager 驾车导航管理类
 */
- (void)driveManagerNeedRecalculateRouteForYaw:(AMapNaviDriveManager *)driveManager

然而有时候实际行驶时它会不走偏航的方法,这时我定义了一个定时器,每隔一分钟导航数据不变的话就从当前位置重新导航一次(因为考虑到如果等红灯的话导航数据是不会变化的,等红灯一般不会超过60秒吧),这样最为保险。

7.大头针位置旋转了

    在某些时候发现定位大头针竟然旋转了一定的角度,偏了,像躺在那里似的,这个后来发现是定位大头针和小车大头针都是进一个代理方法,判断的时候没有判断好,有些时候小车大头针当做定位大头针设置了,可能会偏移,之后为了更好的区分两者,我定义的时候把定位大头针设置为MAPointAnnotation类型,小车大头针设置为MAAnimatedAnnotation类型,这样判断的时候直接判断是哪个类型的比较准确。

8.用户位置实时追踪

    因为地图用的是单利(要不然地图一进一出占用内存太大),有的时候发现用户实时位置追踪会失灵,是因为在地图退出去的时候没有把self.mapView.showsUserLocation = NO;设置为NO,如果不设置的话再次进入用户的实时位置追踪有可能失效;用的时候开启,不用就关闭。

9.后台运行

    地图在导航的过程中有可能用户退到后台,但是司机的实际位置还要上传给服务器,这个就需要打开后台定位Privacy - Location Always Usage Description权限,否则当应用退到后台则无法更新司机位置,这个的话在审核的时候需要提供一个视频链接,表明你的应用在后台是使用了位置信息的,否则会被残忍拒绝。项目中有些地方要用到语音播报功能来着,高德文档demo中用的是系统的AVSpeechUtterance实现的,也可以用科大讯飞实现比较稳定。为了在后台时依然可以播报,我设置了BackgoundModes中的Audio,airpay,and Picture in picrure选项,第一次可能是审核人员疏忽了,应用审核通过了,但第二次的时候他就发现了这个,说我必须是音乐软件或者使用了画中画等之类的功能才能让我使用这个权限,没办法,先取消了吧。

10.实时显示距离/时间/价格

    在送乘客的途中,为了显示实时的价钱,距离和时间,我们也是采用的司机端每隔7秒计算行驶距离传给服务器,服务器根据算法公式返回给用户端,停车的时候可以根据经纬度返回里面有个speed速度来判断,speed为0说明没有处于停车状态,不需计算进距离。

11.轨迹纠偏(定位获取经纬度,角度,速度)

    轨迹纠偏用于结束订单之后在订单中查看司机的实际行驶轨迹,订单进行时司机端每隔几秒传个服务器经纬度、角度、速度,保存下来,在查看订单的时候服务器返回一个列表,列表中模型包含上传的经纬度、角度、速度,因为轨迹纠偏就是把一些稀散的点画成一条平滑的轨迹,必须要用到角度和经纬度,貌似还有个时间戳,这样才能成功纠偏。

    总结完毕,xcode及高德sdk版本:
xcode8.3.3,
'AMapSearch', '~> 5.2.1'
'AMapLocation', '~> 2.4.0'
'AMapNavi', '~> 5.2.0'
'AMapNavi', '~> 5.2.0'

如果有什么不对的地方或者更好的建议欢迎指出,本文仅说一下自己的一些见解,详细代码请参阅高德文档或示例代码。QQ:1244262991
收藏
2
sina weixin mail 回到顶部