在地图初始化完成并添加到视图上后,初始化导航对象。示例代码如下:
//初始化模拟导航对象
self.navigation = [[FMKSimulateNavigation alloc] initWithMapView:self.mapView];
//初始化真实导航对象
//self.navigation = [[FMKActualNavigation alloc] initWithMapView:self.mapView];
//因定位存在精度误差,所以定位点可能不会完全与终点重合,
//因此剩余路长的距离可能不会出现0,因此需要设置导航完成剩余路长阈值。
//设置导航完成距离阈值参数,该参数仅针对真实导航
//[self.navigation setCompleteDistance:5.0];
在设置代理后,当前为真实导航状态下,每次成功调用- (BOOL)locate: (FMKGeoCoord)position angle: (CGFloat)angle 方法都会触发回调,回调结果以FMKNavigationInfo参数返回;模拟导航状态下,开启模拟导航后会实时触发回调。开发者可在回调方法中根据返回信息进行功能开发。示例代码如下:
//设置导航代理,设置代理后才能触发导航事件
self.navigation.delegate = self;
设置起终点后会自动在地图起终点位置添加图片标注物,图片资源位于FMBundle.bundle中,为start.png end.png,修改图片可通过两种方式:(1)替换bundle资源包中对应图片,不可修改图片名称;(2)通过设置FMKPointOption的image属性修改图片。
//设置导航起点坐标
[_navigation setStartPoint:_startCoord];
//设置导航终点坐标
[_navigation setEndPoint:_endCoord];
//需要注意的是图片标注物的管理与FMKImageLayer一致,所以在外部清除imageLayer下的图片时需注意误操作。
//该图片标注物所在图层的layerTag为-1,可以使用该属性区分不同的图片标注物图层。
//设置起点图标样式,可不设置,则使用默认样式
//[_navigation setStartOption:startOption];
//设置终点图标样式,可不设置,则使用默认样式
//[_navigation setEndOption:endOption];
从起点到终点位置根据路径规划策略进行导航分析。代码如下:
//设置路径规划配置参数
//路径规划策略
FMKRouteSetting setting;
setting.naviModule = MODULE_SHORTEST;
setting.routeCrossGroupPriority = FMKROUTE_CGP_DEFAULT;
//路径分析并获取路径分析结果
FMKAnalyseRouteResult result = [_navigation analyseRoute:setting];
在路径规划成功后,调用该方法可绘制相应路线。示例代码如下:
if (result == FMKANALYSERESULT_SUCCESS) {
//路线绘制成功后返回路线对象,否则返回空。此对象受全局的FMKLineLayer管理。
FMKLineMarker *lineMarker = [_navigation drawNaviLine]; //在返回线对象后可设置线标注属性。
}
导航分析区分模拟导航和真实导航。
模拟导航过程包括开始、暂停、恢复、停止,模拟导航是演示导航过程的功能类。当模拟点到达终点时会自动调用stop方法,停止导航;
真实导航需要传入真实定位坐标点,导航模块内部会对位置作优化处理,同时在导航回调中返回处理结果。
示例代码如下:
//开启模拟导航,并设置模拟导航速度,速度范围0.4-5.0,单位为米/秒
[_navigation simulateWithSpeed:1.0];
//暂停模拟导航
//[_navigation pause];
//从暂停状态恢复模拟导航,从暂停状态恢复必须调用此方法
//[_navigation resume];
//停止模拟导航
//[_navigation stop];
//真实导航是在接入真实定位系统时使用的导航工具类。该工具类可对定位位置进行路径约束优化,
//将定位点纠偏到已绘制的路径线上,并在回调事件中返回导航结果:纠偏后的坐标点、剩余路长、角度值
//以及相应路段的文字描述。
//其中角度为调用- (BOOL)locate: (FMKGeoCoord)position angle: (CGFloat)angle时传入的角度参数。
//真实导航不对角度作任何处理。
//对定位坐标进行纠偏处理角度为定位系统传递回的角度,内部不对角度做处理
//[_navigation locate:FMKGeoCoordMake(groupID, position) angle:0];
//每次调用该方法若导航分析成功则返回true,同时触发导航回调方法。
导航回调方法包含导航过程方法和导航完成方法。示例代码如下:
//导航过程回调方法:
- (void)navigation:(FMKNavigation *_Nonnull)navigation walking:
(FMKNavigationInfo *_Nonnull)navigationInfo;
//若成功触发导航过程回调方法,则返回导航计算结果,计算结果存储在FMKNavigationInfo对象中。
//计算结果中包含当前定位点所在路段的文本描述,开发者可根据该属性进行语音导航。
//此回调中位置和角度更新可实现视角跟随及地图居中等功能,具体实现代码可参考导航示例。
//当前导航位置navigationInfo.position:真实导航下坐标为经过纠偏的坐标;
//角度值navigationInfo.angle:真实导航角度为处理定位坐标时传入的角度参数,内部不做任何处理;
//模拟导航状态下角度为当前路线方向与正北方向夹角;
//剩余路长navigationInfo.surplusDistance:当前位置与终点的路径长度;
//偏移距离navigationInfo.offsetDistance:仅支持真实导航;当前定位点与路线的最小偏移量;
//当前路段文本描述navigationInfo.naviText:当前定位点所在路段的文本描述;
//navigationInfo.segment:当前定位点所在路段信息。
//导航完成回调方法:
- (void)complete:(FMKNavigation *_Nonnull)navigation;
//模拟导航到达终点、真实导航剩余路长小于设定的完成距离时触发导航完成方法。
清除导航开始前的起终点图片标注物和线标注物。若当前的导航状态处于模拟导航过程中,则调用此方法前必须先停止模拟导航。代码如下:
//清除导航标注物,包括起终点图片标注和路线,同时重置内部计算参数
[self.navigation clear];