iOS 高德地圖軌跡回放的 思路, 及方法

// 開始,公司要求製做一段跑步軌跡 在地圖上的 動畫回放, 傳入一段經緯度,數組

開始一想,這不是很簡單嗎, 高德地圖有能夠把經緯度轉換成座標點的方法動畫

/**內存

* @brief 將經緯度轉換爲指定view座標系的座標it

* @param coordinate 經緯度內存管理

* @param view 指定的viewio

* @return 基於指定view座標系的座標table

*/循環

- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;map

 

// 我把經緯度轉換成座標點, 而後構建 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 左右, 完美

 

// 由於文件太大就 不上傳了

相關文章
相關標籤/搜索