微信小程序地图的标记和轨迹

 

1.标记图标

 

 

 

   <view class="top">
        <map wx:if="{{markersStatus}}" class="map" id="myMap" scale="{{scale}}" longitude="{{longitude}}" latitude="{{latitude}}" markers="{{datatlist}}" bindregionchange="mapChange"  show-location='true'>
        </map>
        // 这个是上图灰色图标  点击可回到初始位置
        <view class="nav-panel">
            <image class="icon-location" bindtap="getCenterLocation" src="https://applets.jinchehui.com/static/images/icon_location_2.svg" bindtap="getCenterLocation"></image>
        </view>
    </view>
    <van-dialog id="van-dialog" />

小程序地理定位qqmap-wx-jssdk.js:qqmap-wx-jssdk.js
点击可进行下载里边的 :下载微信小程序JavaScriptSDK

var QQMapWX = require('../../utils/qqmap-wx-jssdk.min.js'); //自行根据文件放置
var qqmapsdk;
qqmapsdk = new QQMapWX({
    key: '申请的key'
});
import Dialog from '../../miniprogram_npm/@vant/weapp/dialog/dialog';
Page({

    /**
     * 页面的初始数据
     */
    data: {
        lat: '', //纬度
        lng: '', //经度
        latitude: '',
        longitude: '',
        keyword: '',
        scale: 16, //5-18
        markersStatus: false,
        datatlist: {}
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {
        this.getLocation();
        this.bindAuthLocation(); //授权位置
    },

    //授权位置按钮
    bindAuthLocation() {
        //获取授权结果查看是否已授权位置
        wx.getSetting({
            success: (res) => {
                if (res.authSetting['scope.userLocation'] == undefined && !res.authSetting['scope.userLocation']) //未授权位置(首次进来页面)
                    this.getLocation(); //获取当前位置信息
                else if (res.authSetting['scope.userLocation'] === false) //未授权位置(点击官方授权弹框取消按钮后)
                    Dialog.confirm({
                        title: '提示',
                        message: '需要获取你的地理位置,你的位置信息将用于位置显示',
                    })
                    .then(() => {
                        this.bindConfirmLocation()
                        // on confirm
                    })
                    .catch(() => {
                        // on cancel
                    });
                else //已授权
                    this.getLocation(); //获取当前位置信息
            }
        })
    },
    //定位授权框确认按钮
    bindConfirmLocation(e) {
        //打开设置页面进行授权设置
        wx.openSetting({
            success: (res) => {
                if (res.authSetting['scope.userLocation']) {
                    //获取当前位置信息
                    this.getLocation(); //获取当前位置信息
                }
            }
        });
    },
    //获取位置
    getLocation() {
        this.mapCtx = wx.createMapContext('myMap')
        // 调用接口
        wx.getLocation({
            type: 'gcj02',
            success: (res) => {
                // console.log("res", res)
                if (res) {
                    this.data.lat = res.latitude;
                    this.data.lng = res.longitude;
                    this.setData({
                        latitude: this.data.lat,
                        longitude: this.data.lng,
                        markersStatus: true
                    })
                } else {
                    wx.showToast({
                        title: '定位失败',
                        icon: 'none',
                        duration: 1500
                    })
                }
                qqmapsdk.reverseGeocoder({
                    success: (res) => {
                        console.log('=============', res)
                    },
                });
                this.getFood(res.longitude, res.latitude)

                this.setData({
                    markersStatus: true
                })
            },
            fail(err) {
                wx.hideLoading({});
                console.log("asafasfs", err)
                // wx.showToast({
                //     title: '定位失败',
                //     icon: 'none',
                //     duration: 1500
                // })
                setTimeout(function () {
                    // wx.navigateBack({
                    //     delta: 1
                    // })
                }, 1500)
            }
        })
    },
    //点击回到初始位置
    getCenterLocation: function () {
        var that = this;
        that.mapCtx.moveToLocation()
    },
    //滑动获取周围的店铺
    mapChange(e) {
        if (e.type === 'end') {
            this.mapCtx.getCenterLocation({
                success: res => {
                    console.log(res);
                    this.getFood(res.longitude, res.latitude)
                }
            })
        }
    },
    //搜索附近的店铺
    getFood(longitude, latitude) {
        qqmapsdk.search({
            location: {
                latitude: latitude,
                longitude: longitude,
            },
            keyword: '',
            success: (res) => {
                console.log('地理位置:', res);
                var mark = []
                for (let i in res.data) {
                    mark.push({
                        iconPath: '/images/adr.png', //周边的图标    根据自己需要换
                        alpha: 1,
                        title: res.data[i].title,
                        id: Number(i),
                        longitude: res.data[i].location.lng,
                        latitude: res.data[i].location.lat,
                        width: parseInt(31.91) + 'px',//设置图标的大小
                        height: parseInt(31.91) + 'px',
                    })
                }
                mark.push({
                    iconPath: '/images/address.png', //中心的图标     根据自己需要换
                    id: Number(res.data.length),
                    alpha: 1,
                    longitude: longitude,
                    latitude: latitude,
                    width: parseInt(43.87) + 'px',
                    height: parseInt(43.87) + 'px',
                })
                this.setData({
                    datatlist: mark,
                })
            },
            fail: function (res) {
                console.log(res);
            },
            complete: function (res) {
                // console.log(res);
            }
        });
    },
})

2.画线画轨迹polyline

如果在地图上画出轨迹,需要先规划路径,规划线路会得到一个polyline的数组(有时需要解压),添加到map组件的polyline属性

https://developers.weixin.qq.com/miniprogram/dev/component/map.html#polyline

<map id="map"
  style="width:100vw;height:70vh;"
  longitude="{{longitude}}"
  latitude="{{latitude}}"
  scale="{{scale}}"
  markers="{{markersList}}"
  polyline="{{polyline}}"
  include-points='{{points}}'
  show-location
  bindtap='mapTap'
  bindmarkertap="markerTap"
  bindregionchange="regionChange"
>
  <cover-view class="cover-view" bindtap="controltap">
    <cover-image class="station" src="https://linli-oss.vecommunity.com/xchx/icon/position.jpg"></cover-image>
  </cover-view>
</map>

 

 例子:

 

 

 

 map_text.wxml

<!--pages/map_test/map_test.wxml-->
<view>
<!--wxml页面代码 已授权获取位置-->
<map id="map"
  style="width:100vw;height:70vh;"
  longitude="{{longitude}}"
  latitude="{{latitude}}"
  scale="{{scale}}"
  markers="{{markersList}}"
  polyline="{{polyline}}"
  include-points='{{points}}'
  show-location
  bindtap='mapTap'
  bindmarkertap="markerTap"
  bindregionchange="regionChange"
>
  <cover-view class="cover-view" bindtap="controltap">
    <cover-image class="station" style="width: 60rpx;height: 60rpx;" src="https://linli-oss.vecommunity.com/xchx/icon/position.jpg"></cover-image>
  </cover-view>
</map>

<form bindsubmit="formSubmit">
    <!--输入起点和目的地经纬度坐标,格式为string格式-->
    <!--起点输入框,同终点,不填默认当前位置-->
    <label>起点坐标:<input style="border:1px solid #000;" value="34.19,108.95" name="start"></input></label>
    <!--终点输入框,例:39.984060,116.307520-->
    <label>终点坐标:<input style="border:1px solid #000;" value="34.21,108.95" name="dest"></input></label> 
    <!--提交表单数据-->
    <button form-type="submit">路线规划</button>
</form>

</view>

 

 map_test.js  ( 文件中addPolyline()方法话出来的是直线,如上面的直线图,点击规划线路才是正确的路径 )

// pages/map_test/map_test.js
// 引入SDK核心类,js文件根据自己业务,位置可自行放置
var QQMapWX = require('../../utils/qqmap-wx-jssdk.js');
var qqmapsdk;// 实例化API核心类
qqmapsdk = new QQMapWX({key: '自己的key'});
var that ;
Page({

  /**
   * 页面的初始数据
   */
  data: {
    lat: '', //纬度
    lng: '', //经度
    latitude: '',
    longitude: '',
    keyword: '',
    scale: 16, //5-18
    markersStatus: false,
    datatlist: {},

  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    that = this;
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    that.mapCtx = wx.createMapContext('map');
    that.getLocation();
    that.addMarks();//添加标记
    that.addPolyline();//测试画直线 
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },
  getLocation(){
    // 调用接口
    wx.getLocation({
      type: 'gcj02',
      success: (res) => {
          console.log("res", res)
          if (res) {
              this.data.lat = res.latitude;
              this.data.lng = res.longitude;
              this.setData({
                  latitude: this.data.lat,
                  longitude: this.data.lng,
                  markersStatus: true
              });
          } else {
            wx.showToast({title: '定位失败',icon: 'none',duration: 1500})
          }

        },
        fail(err) {
          wx.hideLoading({});
          console.log("未获定位", err)
          wx.showToast({title: '定位失败',icon: 'none',duration: 1500})
          setTimeout(function () {
              // wx.navigateBack({
              //     delta: 1
              // })  
          }, 1500)
        }
    })

  },
  //添加标记
  addMarks(){
    let mark = [];
    let res = {data:[
      {title:'坐标1',location:{lng:108.95,lat:34.19}},
      {title:'坐标2',location:{lng:108.95,lat:34.20}},
      {title:'坐标3',location:{lng:108.95,lat:34.21}},
    ]};

    for(let i=0;i<res.data.length;i++){
      mark.push({
        iconPath: '/images/car.png', //周边的图标    根据自己需要换
        alpha: 1,
        title: res.data[i].title,
        id: Number(i),
        longitude: res.data[i].location.lng,
        latitude: res.data[i].location.lat,
        width: parseInt(31.91) + 'px',//设置图标的大小
        height: parseInt(31.91) + 'px',
    });

    that.setData({markersList:mark});

    }

  },
  //描绘路径(画直线测试)
  addPolyline(){
    let points = [{longitude:108.95,latitude:34.19},{longitude:108.95,latitude:34.20},{longitude:108.95,latitude:34.21}];
    let polyline = [{
      points:points,
      width: parseInt(10.91) + 'px',//设置图标的大小
      color: "#FA6400",
      arrowLine: true,
      borderWidth: 2 //线的边框宽度,还有很多参数,请看文档 
    }];

    that.setData({polyline:polyline});
    that.setData({points:points});

    //地图绘制
    var mapCtx = wx.createMapContext("map");
    mapCtx.includePoints({
      points: points
    })

  },
  //在Page({})中使用下列代码
//触发表单提交事件,调用接口
formSubmit(e) {
  var _this = this;
  //调用距离计算接口
  qqmapsdk.direction({
    mode: 'transit',//'transit'(公交路线规划)
    //from参数不填默认当前地址
    from: e.detail.value.start,
    to: e.detail.value.dest, 
    success: function (res) {
      console.log(res);
      var ret = res.result.routes[0];
      var count = ret.steps.length;
      var pl = [];
      var coors = [];
      //获取各个步骤的polyline
      for(var i = 0; i < count; i++) {
        if (ret.steps[i].mode == 'WALKING' && ret.steps[i].polyline) {
          coors.push(ret.steps[i].polyline);
        }
        if (ret.steps[i].mode == 'TRANSIT' && ret.steps[i].lines[0].polyline) {
          coors.push(ret.steps[i].lines[0].polyline);
        }
      }       
      //坐标解压(返回的点串坐标,通过前向差分进行压缩)
      var kr = 1000000;
      for (var i = 0 ; i < coors.length; i++){
        for (var j = 2; j < coors[i].length; j++) {
          coors[i][j] = Number(coors[i][j - 2]) + Number(coors[i][j]) / kr;
        }
      }
      //定义新数组,将coors中的数组合并为一个数组

      var coorsArr = [];
      for (var i = 0 ; i < coors.length; i ++){
        coorsArr = coorsArr.concat(coors[i]);
      }
      //将解压后的坐标放入点串数组pl中
      for (var i = 0; i < coorsArr.length; i += 2) {
        pl.push({ latitude: coorsArr[i], longitude: coorsArr[i + 1] })
      }
      //设置polyline属性,将路线显示出来,将解压坐标第一个数据作为起点
      _this.setData({
        latitude:pl[0].latitude,
        longitude:pl[0].longitude,
        polyline: [{
          points: pl,
          color: '#FF0000DD',
          width: 4
        }]
      })
    },
    fail: function (error) {
      console.error(error);
    },
    complete: function (res) {
      console.log(res);
    }
  });
}


})

 

 

转 : https://www.jianshu.com/p/24e95ac0e6e3

https://blog.csdn.net/weixin_46653486/article/details/124444537

https://blog.csdn.net/flyestcoder/article/details/109532523

https://blog.csdn.net/heavenz19/article/details/128456228

 

posted @ 2023-02-03 15:21  与f  阅读(2385)  评论(0编辑  收藏  举报