關于網站建設的通知優(yōu)化大師有必要花錢嗎
JS API 結合 Vue 使用
高德地圖 jsapi 下載、引入
npm add @amap/amap-jsapi-loaderimport AMapLoader from '@amap/amap-jsapi-loader'
使用2.0版本的loader需要在window對象下先配置 securityJsCode? JS API 安全密鑰使用
JS?API?使用?script?標簽同步加載增加代理服務器設置腳本,并將「您申請的安全密鑰」替換為您的安全密鑰;(注意您這個設置必須是在JS?API?腳本加載之前進行設置,否則設置無效。)
window._AMapSecurityConfig = {securityJsCode: '「您申請的安全密鑰」'
}使用ts時,上面這里會顯示類型錯誤,因此需要在類型文件中配置Window的類型
interface Window {_AMapSecurityConfig: {securityJsCode: string}
}
?頁面地圖初始化加載
自定義地圖-設置地圖顯示樣式?自定義地圖-地圖
AMapLoader.load({key: '', // 申請好的Web端開發(fā)者Key,首次調用 load 時必填version: '2.0' // 指定要加載的 JSAPI 的版本,缺省時默認為 1.4.15
}).then((AMap) => {// 地圖初始化// Map構造函數第一個傳參的map為初始化地圖的容器的id,第二個傳參是配置對象const map = new AMap.Map('map', {viewMode:"3D", //是否為3D地圖模式mapStyle: 'amap://styles/whitesmoke', //設置地圖的顯示樣式zoom: 12 //設置地圖的縮放級別}) }).catch((e) => {console.error(e) //加載錯誤提示})
根據后臺返回的經緯度數組,自定義繪制行車路徑,參考官方文檔 -?路線規(guī)劃
使用插件 AMap.Driving-根據起點和終點規(guī)劃自動行車路徑
AMapLoader.load({key: '', // 申請好的Web端開發(fā)者Key,首次調用 load 時必填version: '2.0' // 指定要加載的 JSAPI 的版本,缺省時默認為 1.4.15
}).then((AMap) => {// 地圖初始化const map = new AMap.Map('map', {// viewMode:"3D", //是否為3D地圖模式mapStyle: 'amap://styles/whitesmoke', //設置地圖的顯示樣式zoom: 12 //設置地圖的縮放級別})// 使用插件 AMap.DrivingAMap.plugin('AMap.Driving', function () {const driving = new AMap.Driving({map: map, // 配置參數map,意思是在那個地圖中繪制行車路徑showTraffic: false, // 關閉道路情況(設置是否顯示實時路況信息)hideMarkers: true // 關閉沿途標記(設置隱藏路徑規(guī)劃的起始點圖標 )})// logisticsInfo是后端返回的行車路徑的數組if (logistics.value?.logisticsInfo && logistics.value.logisticsInfo.length >= 2) {const list = [...logistics.value.logisticsInfo]// 起點 startconst start = list.shift()// 終點 endconst end = list.pop()// 傳入起點和終點的經緯度信息,獲取對應的駕車路線規(guī)劃driving.search([start?.longitude, start?.latitude],[end?.longitude, end?.latitude],function () {// 未出錯時,result即是對應的路線規(guī)劃方案// 在這里繪制沿途運輸位置})}})}).catch((e) => {console.error(e) // 加載錯誤提示})
使用插件 AMap.Driving-自定義繪制路徑,也就是把路途的途徑點告知地圖讓其渲染路徑
?參考官方文檔 途經點參數?路線規(guī)劃-途經點
?
// 途經點 opts 是一個對象,屬性waypoints就是繪制途經點參數
const opts = {// 途經點參數,最多支持傳入16個途經點waypoints: list.map((item) => [item.longitude, item.latitude])
}
driving.search([start?.longitude, start?.latitude],[end?.longitude, end?.latitude],opts,function () {}
)
實現業(yè)務:關閉途徑標記(?hideMarkers: true)并且實現自定義繪制起點-終點-和當前運輸位置 ,其實就是繪制一個標記,參考官方實例?自定義圖標-點標記
讓當前的運輸位置顯示在地圖的正中間并且設置縮放比例,參考官方文檔 setFitView-setZoom方法
參考手冊-地圖 JS API
// 創(chuàng)建一個標記點函數
const getMarker = (point: Location, image: string, width = 25, height = 30) => {// 創(chuàng)建一個 Icon,這種方式可以設置圖標的大小const Icon = new AMap.Icon({// 圖標尺寸size: new AMap.Size(width, height),// 圖標的取圖地址image: image,// 圖標所用圖片大小imageSize: new AMap.Size(width, height)})// 將 icon 傳入 markerconst marker = new AMap.Marker({position: [point?.longitude, point?.latitude],// 將一張圖片的地址設置為 iconicon: Icon,// 設置了 icon 以后,設置 icon 的偏移量,以 icon 的 [center bottom] 為原點offset: new AMap.Pixel(-width / 2, -height)})return marker
}
const startMarker = getMarker(start!, startImg) // 起點icon標記
const endMarker = getMarker(end!, endImg) // 終點icon標記// 往地圖上增加標記
map.add([startMarker, endMarker])driving.search(function () {// 繪制當前運輸位置,后端返回 currentLocationInfo 就是當前的運輸位置 標記const curr = logistics.value?.currentLocationInfo // 當前的運輸位置經緯度const currMarker = getMarker(curr!, carImg, 33, 20) // 當前運輸位置標記map.add([currMarker]) // 往地圖上增加當前運輸位置標記// 2s后定位當中間進行縮放setTimeout(() => {map.setFitView([currMarker]) // 定位到當前運輸的位置map.setZoom(10) // 一定比例的縮放}, 2000)}
)
?下面貼出完整繪制物流信息地圖的代碼
import startImg from '@/assets/start.png'
import endImg from '@/assets/end.png'
import carImg from '@/assets/car.png'const initMap = () => {AMapLoader.load({key: '', // 申請好的Web端開發(fā)者Key,首次調用 load 時必填version: '2.0' // 指定要加載的 JSAPI 的版本,缺省時默認為 1.4.15}).then((AMap) => {// 地圖初始化const map = new AMap.Map('map', {// viewMode:"3D", //是否為3D地圖模式mapStyle: 'amap://styles/whitesmoke', //設置地圖的顯示樣式zoom: 12 //設置地圖的縮放級別})AMap.plugin('AMap.Driving', function () {const driving = new AMap.Driving({map: map,// panel: 'panel'showTraffic: false,hideMarkers: true})if (logistics.value?.logisticsInfo && logistics.value.logisticsInfo.length >= 2) {const list = [...logistics.value.logisticsInfo]// 創(chuàng)建標記函數const getMarker = (point: Location, image: string, width = 25, height = 30) => {// 創(chuàng)建一個 Icon,這種方式可以設置圖標的大小const Icon = new AMap.Icon({// 圖標尺寸size: new AMap.Size(width, height),// 圖標的取圖地址image: image,// 圖標所用圖片大小imageSize: new AMap.Size(width, height)})// 將 icon 傳入 markerconst marker = new AMap.Marker({position: [point?.longitude, point?.latitude],// 將一張圖片的地址設置為 iconicon: Icon,// 設置了 icon 以后,設置 icon 的偏移量,以 icon 的 [center bottom] 為原點offset: new AMap.Pixel(-width / 2, -height)})return marker}// 起點 startconst start = list.shift()const startMarker = getMarker(start!, startImg)// 終點 endconst end = list.pop()const endMarker = getMarker(end!, endImg)map.add([startMarker, endMarker])// 途經點 optsconst opts = {// 途經點參數,最多支持傳入16個途經點waypoints: list.map((item) => [item.longitude, item.latitude])}driving.search([start?.longitude, start?.latitude],[end?.longitude, end?.latitude],opts,function () {// 未出錯時,result即是對應的路線規(guī)劃方案// 繪制運輸位置const curr = logistics.value?.currentLocationInfoconst currMarker = getMarker(curr!, carImg, 33, 20)map.add([currMarker])// 2s后定位當中間進行縮放setTimeout(() => {map.setFitView([currMarker])map.setZoom(10)}, 2000)})}})}).catch((e) => {console.error(e) //加載錯誤提示})
}