微信小程序 - 輸入起點、終點獲取距離並且進行路線規划(騰訊地圖)


 

 

更新:

2018-9-19 騰訊官方經緯度轉詳細地址詳細地址轉經緯度

 

index.wxml

<!--地圖容器-->
<map id="myMap" style="width: 100%; height: 300px;" longitude="{{longitude}}" latitude="{{latitude}}" scale='{{scale}}' polyline="{{polyline}}" markers="{{markers}}" covers="{{covers}}" show-location></map> 起點:<input placeholder='請輸入起點' bindinput='getStart'></input> 終點:<input placeholder='請輸入終點' bindinput='getEnd'></input> 兩點之間的距離:{{resultDistance}} <!--綁定點擊事件-->
<button bindtap="driving" disabled='{{openNav}}'>開始導航</button>

 

  

index.wxss

input{ border: 1px solid #aaa;
}

 

  

index.js

 

  1 // let coors;
  2 // // 引入SDK核心類
  3 let QQMapWX = require('./qqmap-wx-jssdk.min.js');
  4 
  5 // 實例化API核心類
  6 let qqmapsdk = new QQMapWX({
  7   key: '填寫地圖key'
  8 });
  9 
 10 Page({
 11 
 12   /**
 13    * 頁面的初始數據
 14    */
 15   data: {
 16     openNav: true
 17   },
 18 
 19   /**
 20    * 生命周期函數--監聽頁面加載
 21    */
 22   onLoad: function (options) {
 23     let _page = this;
 24 
 25     wx.getLocation({
 26       type: 'gcj02', //返回可以用於wx.openLocation的經緯度
 27       success: function (res) {
 28         _page.setData({
 29           latitude: res.latitude,
 30           longitude: res.longitude,
 31           scale: 10
 32         });
 33       }
 34     })
 35     wx.clearStorageSync('latlngstart');
 36     wx.clearStorageSync('latlngend');
 37   },
 38 
 39   /**
 40    * 生命周期函數--監聽頁面初次渲染完成
 41    */
 42   onReady: function () {
 43 
 44   },
 45 
 46   /**
 47    * 起點
 48    */
 49   getStart(e) {
 50     let _page = this;
 51     
 52 
 53     /**
 54      * 修改:以前示例(2018-09-15)地址轉經緯度用錯接口了
 55      */
 56     qqmapsdk.getSuggestion({
 57       keyword: e.detail.value,
 58       success: function (res) {
 59         let lat = res.data[0].location.lat;
 60         let lng = res.data[0].location.lng;
 61 
 62         wx.setStorageSync('latlngstart', {
 63           lat: lat,
 64           lng: lng
 65         });
 66       },
 67       fail: function (res) {
 68         console.log(res);
 69       },
 70       complete: function (res) {
 71         console.log(res);
 72       }
 73     });
 74 
 75 
 76     /**
 77      * 修改為(2018-09-19)
 78      */
 79 
 80 qqmapsdk.geocoder({ 81 address: res.address, 82 success: function(res) { 83 let lat = res.result.location.lat; 84 let lng = res.result.location.lng; 85 wx.setStorageSync('latlngendSend', { 86 lat: lat, 87 lng: lng 88 }); 89 90 // 起點經緯度 91 let latStart = wx.getStorageSync('latlngstartSend').lat; 92 let lngStart = wx.getStorageSync('latlngstartSend').lng; 93 94 // 終點經緯度 95 let latEnd = wx.getStorageSync('latlngendSend').lat; 96 let lngEnd = wx.getStorageSync('latlngendSend').lng; 97 98 qqmapsdk.calculateDistance({ 99 to: [{ 100 latitude: latStart, 101 longitude: lngStart 102 }, { 103 latitude: latEnd, 104 longitude: lngEnd 105 }], 106 success: function(res) { 107 console.log(res, '兩點之間的距離(代送):', res.result.elements[1].distance); 108 wx.setStorageSync('kmSend', res.result.elements[1].distance + ""); 109 } 110 }); 111 } 112 }); 113 
114 
115 
116     // 如果輸入地點為空:則不規划路線
117     if (e.detail.value == '') {
118       _page.setData({
119         openNav: true,
120         resultDistance: ''
121       });
122     } else {
123       _page.setData({
124         openNav: false
125       });
126     }
127   },
128 
129   /**
130    * 終點
131    */
132   getEnd(e) {
133     let _page = this;
134     // 輸入地點獲取經緯度,我取得是數據的第一條數據.
135     qqmapsdk.getSuggestion({
136       keyword: e.detail.value,
137       success: function (res) {
138         let lat = res.data[0].location.lat;
139         let lng = res.data[0].location.lng;
140 
141         wx.setStorageSync('latlngend', {
142           lat: lat,
143           lng: lng
144         });
145       },
146       fail: function (res) {
147         console.log(res);
148       },
149       complete: function (res) {
150         console.log(res);
151       }
152     });
153     // 如果輸入地點為空:則不規划路線
154     if (e.detail.value == '') {
155       _page.setData({
156         openNav: true,
157         resultDistance: ''
158       });
159     } else {
160       _page.setData({
161         openNav: false
162       });
163     }
164   },
165   //事件回調函數
166   driving: function () {
167 
168     let _page = this;
169 
170     // 起點經緯度
171     let latStart = wx.getStorageSync('latlngstart').lat;
172     let lngStart = wx.getStorageSync('latlngstart').lng;
173 
174     // 終點經緯度
175     let latEnd = wx.getStorageSync('latlngend').lat;
176     let lngEnd = wx.getStorageSync('latlngend').lng;
177 
178 
179     _page.setData({
180       latitude: latStart,
181       longitude: lngStart,
182       scale: 16,
183       markers: [{
184         id: 0,
185         latitude: latStart,
186         longitude: lngStart,
187         // 起點圖標
188         iconPath: '../image/location.png'
189       },
190       {
191         id: 1,
192         latitude: latEnd,
193         longitude: lngEnd,
194         // 終點圖標
195         iconPath: '../image/location.png'
196       },
197       ]
198     });
199     ``
200 
201     /**
202      * 獲取兩點的距離
203      */
204     qqmapsdk.calculateDistance({
205       to: [{
206         latitude: latStart,
207         longitude: lngStart
208       }, {
209         latitude: latEnd,
210         longitude: lngEnd
211       }],
212       success: function (res) {
213         console.log(res, '兩點之間的距離:', res.result.elements[1].distance);
214         _page.setData({
215           resultDistance: res.result.elements[1].distance + '米'
216         });
217       },
218       fail: function (res) {
219         console.log(res);
220       },
221       complete: function (res) {
222         console.log(res);
223       }
224     });
225 
226     //網絡請求設置
227     let opt = {
228       //WebService請求地址,from為起點坐標,to為終點坐標,開發key為必填
229       url: `https://apis.map.qq.com/ws/direction/v1/driving/?from=${latStart},${lngStart}&to=${latEnd},${lngEnd}&key=${qqmapsdk.key}`,
230       method: 'GET',
231       dataType: 'json',
232       //請求成功回調
233       success: function (res) {
234         let ret = res.data
235         if (ret.status != 0) return; //服務異常處理
236         let coors = ret.result.routes[0].polyline,
237           pl = [];
238         //坐標解壓(返回的點串坐標,通過前向差分進行壓縮)
239         let kr = 1000000;
240         for (let i = 2; i < coors.length; i++) {
241           coors[i] = Number(coors[i - 2]) + Number(coors[i]) / kr;
242         }
243         //將解壓后的坐標放入點串數組pl中
244         for (let i = 0; i < coors.length; i += 2) {
245           pl.push({
246             latitude: coors[i],
247             longitude: coors[i + 1]
248           })
249         }
250         //設置polyline屬性,將路線顯示出來
251         _page.setData({
252           polyline: [{
253             points: pl,
254             color: '#FF0000DD',
255             width: 4
256           }]
257         })
258       }
259     };
260     wx.request(opt);
261   }
262 })

 

 

 

 

 示例下載:點擊下載


免責聲明!

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



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