1、問題
最近在使用高德地圖的API,有一個需求是畫出物件的歷史軌跡,採用了高德地圖API中的折線polyline函式。但如果需要跨180度經度線的折線,會出現不能跨越的情況,如下圖所示:
圖中有三個標記點,從西向東座標點依次為[135, 21],[165, 23],[195, 25]。我們想要畫出物件的歷史軌跡方向應該一直是從西向東,依次連線三個點,由圖可知第一個點到第二個點是從西向東,但是第二個點到第三個點是從東向西,繞了大半個地球到達第三個點
2、解決方案
首先需要了解一下高德地圖中的座標系是如何建立的:
在高德地圖中,座標用類AMap.LngLat表示,為了方便理解,我們用[longitude,latitude]表示AMap.LngLat類中的經緯度,longitude為經度,latitude為緯度,[0,0]為座標原點,經度範圍為[-180,180],緯度範圍為[-90,90]
AMap.LngLat的建構函式為AMap.LngLat(lng:Number,lat:Number,noAutofix:bool)。其中noAutoFix表示是否自動將經度修正到 [-180,180] 區間內,預設為false,此時會自動將經度修正到[-180,180]範圍內
在問題的例子中,我們傳入的軌跡點的經緯度陣列為
1 let pathInfo = [[135, 21],[165, 23],[195, 25]];
使用折線函式畫出軌跡折線,並檢視軌跡點的經緯度陣列
1 //物件軌跡 2 let Polyline = new AMap.Polyline({ 3 map: map, //指定目標地圖 4 path: pathInfo, //折線的節點座標陣列 5 showDir: true, //是否延路徑顯示白色方向箭頭,預設false(Canvas繪製時有效,建議折線寬度大於6時使用) 6 strokeColor: "red", //線顏色 7 strokeOpacity: 1, //線透明度 8 strokeWeight: 6, //線寬 9 // strokeStyle: "solid" //線樣式 10 }); 11 12 console.log("pathInfo", pathInfo);
此時由控制檯可以看到,pathInfo陣列的元素型別已經被自動轉換為了物件,即傳入時是陣列,使用Amap.Polyline函式後自動將陣列轉換為了AMap.LngLat物件
pathInfo仍然為一個陣列,但是陣列元素轉換為了AMap.LngLat物件,可以看到第三個點,即pathInfo[2]元素的經度從195修改為了-165。造成這種情況的原因就是pathInfo的陣列元素在自動轉換時預設將經度修改到了[-180,180]範圍內。解決這種問題的方法很簡單,即Amap.Polyline類的path屬性我們直接傳入的是物件陣列,而不是二維陣列
對pathInfo的賦值操作進行修改
1 let pathInfo = []; 2 pathInfo.push(new AMap.LngLat(135, 21, true)); 3 pathInfo.push(new AMap.LngLat(165, 23, true)); 4 pathInfo.push(new AMap.LngLat(195, 25, true));
pathInfo仍為陣列,只不過陣列元素手動建立為Amap.LngLat物件,而不交給程式自動轉換。此處注意AMap.LngLat(lng:Number,lat:Number,noAutofix:bool)第三個引數即noAutofix設為true,表示不需要自動將經度修正到[-180,180]範圍內
此時檢視pathInfo陣列的值
第三個點,即pathInfo[2]元素的經度仍然為195,那麼就可以達成跨越180經度線的目的了。軌跡效果圖如下