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


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

開始一想,這不是很簡單嗎, 高德地圖有可以把經緯度轉換成坐標點的方法

/**

* @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 左右, 完美

 

// 因為文件太大就 不上傳了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM