一、uniapp開發(fā)安卓App的高德地圖路線規(guī)劃導航功能探索
在uniapp開發(fā)中,實現(xiàn)高德地圖的路線規(guī)劃導航功能是一項關鍵技能,尤其在需要地圖導航的應用場景中,這一功能顯得尤為重要。掌握這項技術,不僅能提升開發(fā)效率,更能為用戶帶來更加流暢的導航體驗。
二、獲取高德地圖API密鑰
在開始開發(fā)之前,首要任務是前往高德地圖開發(fā)者平臺申請獲取地圖API密鑰(Key)。這個Key是開發(fā)過程中必不可少的,用于在應用中引入高德地圖服務。
三、安裝路線規(guī)劃插件

在uniapp的開發(fā)工具HbuilderX中,我們需要安裝路線規(guī)劃插件。通過插件市場,找到適合的路線規(guī)劃插件,進行安裝集成到開發(fā)環(huán)境中。
四、引入必要的JS文件
在頁面的script部分,我們需要引入一個特定的js文件,例如通過語句“import Amap from'@/js/lyn4ever-gaode.js';”將其導入。這個文件包含了實現(xiàn)路線規(guī)劃與標記點功能所需的函數(shù)。
五、實現(xiàn)導航路線的展示與功能
引入必要的文件后,就可以開始實現(xiàn)導航路線的展示功能了。js文件中包含的兩個主要函數(shù),一個是用于繪制路線的函數(shù),另一個是用于標記路線的點的函數(shù)。通過調(diào)用這些函數(shù),我們可以在地圖上展示出清晰的路線,并允許用戶進行導航。
在這個過程中,對uniapp的map組件的屬性和函數(shù)的深入理解與熟練運用是關鍵,這有助于避免在開發(fā)過程中遇到各種bug,確保路線的準確展示與導航的流暢性。
=================
一、繪制規(guī)劃路線函數(shù)
在地圖導航中,規(guī)劃路線的功能至關重要。我們的函數(shù)`PlanningRoute`就是為了實現(xiàn)這一目的而設計的。

函數(shù)接受起點、終點、途經(jīng)點、結果處理函數(shù)以及失敗處理函數(shù)作為參數(shù)。我們通過`AMapWX`對象調(diào)用`getDrivingRoute`方法,獲取駕駛路線。如果成功獲取到路徑信息,我們將其中的步驟(steps)分解為一系列的點(polyline),并提取其經(jīng)緯度信息。然后,將這些點作為結果返回。
二、路線標記點函數(shù)
接下來是`Makemarkers`函數(shù),它用于在地圖上標記起點、終點和途經(jīng)點。
函數(shù)接受起點坐標、終點坐標、途經(jīng)點坐標列表以及成功處理函數(shù)作為參數(shù)。我們?yōu)槠瘘c和終點創(chuàng)建標記點,并設置相應的圖標、ID、經(jīng)緯度和尺寸等屬性。然后,對于每一個途經(jīng)點,我們將其坐標轉換為經(jīng)緯度信息,并添加到標記點列表中。將所有這些標記點作為結果返回。
三 調(diào)用函數(shù)

在script中的`showRouter()`函數(shù)中,我們調(diào)用上述兩個函數(shù)來獲取規(guī)劃路線和標記點。首先調(diào)用`PlanningRoute`函數(shù)獲取路線信息,然后使用`Makemarkers`函數(shù)在地圖上標記這些點。這樣,用戶就可以清晰地看到從起點到終點的路線以及沿途的標記點了。
四、代碼實現(xiàn)
以下是這兩個函數(shù)的代碼實現(xiàn):
```javascript
// 繪制規(guī)劃路線函數(shù)

function PlanningRoute(start, end, _waypoints, result, fail) {
let myAmapFun = new amapFile.AMapWX({key: key});
myAmapFun.getDrivingRoute({
origin: start,
destination: end,

waypoints: _waypoints,
success: function(data) {
let points = [];
if (data.paths && data.paths[0] && data.paths[0].steps) {
let steps = data.paths[0].steps;

for (let i = 0; i < steps.length; i++) {
let poLen = steps[i].polyline.split(';');
for (let j = 0; j < poLen.length; j++) {
points.push({
longitude: parseFloat(poLen[j].split(',')[0]),

latitude: parseFloat(poLen[j].split(',')[1])
});
}
}
result({points: points, color: "0606ff", width: 8});

}
},
fail: function(info) {
fail(info);
}

)};
}
// 標記標記點函數(shù)
function Makemarkers(startpoi, endpoi, waypoints, success) {
let markers = [];

// 起點
let start = {
iconPath: "@/static/img/log/nav.png",
id: 0,
longitude: startpoi.split(",")[0],

latitude: startpoi.split(",")[1],
width: 23,
height: 33,
callout: {content: '起點'}
};

markers.push(start);
// 終點
let end = {
iconPath: "@/static/img/log/nav.png",
id: 1,

longitude: endpoi.split(",")[0],
latitude: endpoi.split(",")[1],
width: 23,
height: 33,
callout: {content: '終點'}

};
markers.push(end);
// 途經(jīng)點
let _waypoints = waypoints.split(';');
for (let i = 0; i < _waypoints.length; i++) {

let point = {
iconPath: "/static/tjd.png",
id: i,
longitude: parseFloat(_waypoints[i].split(",")[0]),
latitude: parseFloat(_waypoints[i].split(",")[1]),

width: 23,
height: 33,
callout: {content: '途徑點'}
};
markers.push(point);

}
success(markers);
}
一、地圖路線規(guī)劃與展示
通過簡單的操作,我們的地圖組件就能夠展示出規(guī)劃路線。只需傳入起點與終點的經(jīng)緯度,即可在map組件里展示規(guī)劃路線。通過傳入對應的路線途中打點的數(shù)組對象,路線中會顯示經(jīng)過的點。

效果圖
在實際應用中,我們曾遇到過一些技術挑戰(zhàn)。例如,導航路線展示后,地圖頁面的縮放大小控制不夠理想。為了確保地圖視角能夠涵蓋整個路線的起始點,我們采取了一系列措施來解決這一問題。
在解決過程中,我根據(jù)路線的起始點之間的距離,利用一個擬合函數(shù)來調(diào)整地圖的縮放大小。通過請求后端返回導航的距離,并設置一個surface數(shù)組來存放標記值。將距離換算成km后,遍歷surface數(shù)組。當距離大于數(shù)組的值時,將地圖的scale設置為surface對應下標值+5,從而實現(xiàn)了對地圖縮放大小的有效控制。
通過這次地圖學習,我掌握了地圖的實現(xiàn)方式、導航路線的展示方法,以及map組件的相關屬性和函數(shù)的使用??梢哉f,收獲頗豐。
二、開發(fā)類似百度地圖APP的成本考量

開發(fā)一個類似百度地圖的APP,其成本會受到多種因素的影響。
1. App本身的復雜度
App的復雜度越高,開發(fā)成本自然也會相應增加。如果App需要服務器后臺支持、涉及到3D游戲等復雜功能,其開發(fā)難度和成本會更高。
2. 工作范圍
開發(fā)成本也取決于你提供的工作范圍。如果你已經(jīng)做好了設計、界面素材和數(shù)據(jù)準備,并自備帳號自己完成上線申請,僅委托開發(fā)的話,成本會相對較低。反之,如果需要進行全新的創(chuàng)意和功能策劃,那么費用就會相應增加。

3. 質(zhì)量要求
同樣的App,質(zhì)量不同價格也會有所差異。而且App還需要考慮升級和完善的問題,這個過程中的責任和成本也會影響開發(fā)報價。
4. 參考價格
根據(jù)以往經(jīng)驗,我們可以給出一些參考價格。例如,一個簡單的生活應用App,不依賴后臺,設計加開發(fā)大約需要一個月時間,價格可能在3萬至10萬之間;一個純單機的游戲App,無應用內(nèi)購買和Push功能,價格在5萬至10萬之間;對于復雜的前后臺App,如現(xiàn)有系統(tǒng)整合或業(yè)務復雜的App開發(fā),價格可能需要十萬甚至更多,并且可能需要經(jīng)過數(shù)次升級才能達到較高的可用度。
請根據(jù)實際情況采納以上信息。開發(fā)類似百度地圖的APP是一項復雜的工程,需要綜合考慮各種因素來確定最終的成本和周期。遇到高德地圖在API 31及以上版本崩潰的問題

一、問題背景
在開發(fā)新的Android應用時,我們選擇了嵌入高德地圖。之前使用百度地圖的經(jīng)驗告訴我們,嵌入地圖是一個相對簡單的任務。在實際操作中,我們遇到了在特定API版本下的崩潰問題。
二、問題描述與嘗試
按照高德地圖的開發(fā)文檔,我們迅速創(chuàng)建了一個測試項目,并成功導入了依賴。地圖顯示正常,但在嘗試退出顯示地圖的Activity時,應用立即崩潰。追蹤錯誤源頭,我們發(fā)現(xiàn)是在銷毀地圖時,即調(diào)用mapView.onDestroy()這行代碼時出現(xiàn)了問題。
三、困惑與比較

我們反復查閱文檔,檢查代碼,試圖找到問題的根源。令人困惑的是,與高德地圖SDK提供的DEMO相比,我們的代碼在顯示地圖的關鍵部分并沒有任何不同。當我們比較build.gradle文件時,發(fā)現(xiàn)DEMO的targetSdkVersion是26,而我們項目的targetSdkVersion是32。
四、問題可能與目標SDK版本有關
我們開始懷疑問題可能與目標SDK版本有關。查閱相關資料,我們發(fā)現(xiàn)其他SDK在Android 11(對應API級別30)上也曾出現(xiàn)過崩潰現(xiàn)象。有一種解決方案是在AndroidManifest.xml文件中加入android:allowNativeHeapPointerTagging="false"。我們嘗試在我們的項目中應用這一解決方案,問題得到了解決。
五、總結與啟示
這次經(jīng)歷讓我們認識到,即使是常見的操作,在不同的環(huán)境和配置下也可能遇到意想不到的問題。解決問題時,除了檢查自己的代碼和配置,還需要關注外部因素,如SDK的版本和特定系統(tǒng)的兼容性。對于遇到類似問題的開發(fā)者,我們建議檢查目標SDK版本是否與SDK的兼容性有關,并嘗試調(diào)整配置或?qū)ふ姨囟ǖ慕鉀Q方案。

這次經(jīng)歷雖然有些波折,但我們最終找到了解決問題的方法,也學到了很多寶貴的經(jīng)驗。希望我們的經(jīng)歷能對其他開發(fā)者有所幫助。