注: 高德地图提供了完善的API 在这里我是对之前的项目进行经验总结。
首先 创建地图
在此基础上进行坐标点标记的生成
icon 其实也可以是实例化的对象 ,可以灵活的定义icon尺寸,大小,偏移量
最后在地图上生成
注:要么是对象 要么是数组噢
线的绘制其实更简单一些,相当于无数个点的相连
注意:这里的参数 点用的是this.map. 线用的是map。 写法问题 而已
轨迹回放
综上 关键点在于获取到 经纬度坐标数据!
最后 提示一下 我们引入高德地图的时候 通常在左下角会显示高德的icon 标记。如果想要隐藏掉 可以自己写个css
// 开始,公司要求制作一段跑步轨迹 在地图上的 动画回放, 传入一段经纬度,
开始一想,这不是很简单吗, 高德地图有可以把经纬度转换成坐标点的方法
/**
* @brief 将经纬度转换为指定view坐标系的坐标
* @param coordinate 经纬度
* @param view 指定的view
* @return 基于指定view坐标系的坐标
*/
- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view
// 我把经纬度转换成坐标点, 然后构建 path
/* 构建path, 调用着负责释放内存. */
- (CGMutablePathRef)pathForPoints:(CGPoint *)points count:(NSUInteger)count
{
if (points == NULL || count <= 1)
{
return NULL
}
CGMutablePathRef path = CGPathCreateMutable()
CGPathAddLines(path, NULL, points, count)
return path
}
// 在然后直接用 path ,初始化一个 CAShapeLayer ,做成动画不就成了 吗, 在它跑完之后直接删除, 再用 高德地图的折线替换,
// 这种方法也可以, 但是后来需求改了, 要求地图旋转,并且地图中心点一直在跑动的点上,
这样,我以屏幕坐标构建的 path 一旦地图旋转, 就全乱了,
// 后来我又想到一个办法, 我从地图手机上定位画线得到的灵感, 我把经纬度点两个两个连成一个个短的折线,放到一个数组里面 ,然后定义了一个 index 属性, 再用一个定时器不停的循环, 在定时器的方法中,用
[self.mapView addOverlay:self.mapOverlayArr[self.index] level:MAOverlayLevelAboveRoads]
不停加载线路在地图上, 同时把地图的中心点, 定位在 经纬度数组取到的最新的经纬度上
CLLocation * location = self.locationArray[self.index]
[self.mapView setCenterCoordinate:location.coordinate animated:NO]
,这样就能保证地图中心一直在跑动的点上, 而且定时器 方法 加载线路够快的话, 就能产生动画效果,
然而, 又出现了问题, 定时器不停的运行
mapView 不停的加载 addOverlay ,使得屏幕非常卡, 经纬度少的话还看不出来, 一旦经纬度多了, 卡的不要不要的, 完全受不了, 而且手机非常烫, 电池都快烧坏了,, 所以这种方法不可行, 至少不完善
// 后来我研究高德地图的画线方法, 发现一个 方法
/**
* @brief 重新设置折线坐标点. since 5.0.0
* @param coords 指定的经纬度坐标点数组, C数组,内部会做copy,调用者负责内存管理
* @param count 坐标点的个数
* @return 是否设置成功
*/
- (BOOL)setPolylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger)count
// 这个方法只用一条折线, 但是可以不停的改变这条折线的位置,
终于利用这个方法 不卡了, 画线的过程中 FPS 60 左右, 完美
// 因为文件太大就 不上传了
不是的,急加速是手机感应得出的复数据,与实际转速是有出入的,这并不是超高速。这种情况是自动挡车辆时常遇到的,起步加速过快就会出现急加速的情况,只要起步时低档别拉高转速,勤换挡就不会出现这种情况了。一般转速也在1000~3500之间,在3000转左右发动机输出扭矩最大,之后和开车转速呈反比。而高德地图设置速度,是根据道路状况、距离、等级而选择的,速度最快就是选择最优、最短时间到达的线路。