【微信小程序】自定义marker并点击获得自定义信息

代码改自微信小程序官方文档markers代码片段

wxml

页面由地图,和下方自定义的信息框组成,地图中心点坐标及信息框信息都由current_info当前选中marker组成

<map 
  id="mapId"
  class="map"
  latitude="{{current_info.latitude}}"
  longitude="{{current_info.longitude}}"
  bindmarkertap="onMarkerTap"
></map>


<view class="infoCard">
 <image src="/img/handing/roomphoto.png"></image>
 <view class="fixed-right">
    <view class="fixed-name">{{current_info.roomName==null? "" : current_info.roomName}}</view>
    <view class="fixed-content">{{current_info.address==null? "" : current_info.address}}</view>
  </view>
  <view class="bottom-info">
    <view>开放时间:9:00 - 12:00; 14:00 - 17:00</view>
    <view>距您{{current_info.dis>=1000? (current_info.dis/1000) +'km' : current_info.dis+'m'}}</view>
  </view>
</view>

js

const app = getApp()
const img = '../../img/icon/marker.png'

Page({
  data: {
    latitude: null,
    longitude: null,
    markers: [],
    current_info: null,
    info: [],
    baseUrl: getApp().globalData.baseUrl,

  },

  //获取marker位置信息
  getMarkerInfo(latitude,longitude){//传入自身定位坐标,返回多个marker,内包含dis(与自己的距离)
    var that = this;
    wx.request({
      method: 'GET',
      header: {
        "Authorization": wx.getStorageSync('Authorization'),
      },
      url:  that.data.baseUrl+"/xxx",
      data: {
        lat: latitude,
        lon: longitude
      },
      success(response){
        that.info = response.data.result;
        console.log(response)
        that.setData({
          info:that.info
        });
        that.addMarkers();
    // 使用默认聚合效果时可注释下一句
        that.bindEvent();

      }
    })
  },

  onLoad: function () {
    //定位
    var that = this;
    wx.getLocation({//获取自身坐标
      type: 'wgs84',
      success (res) {
        that.setData({
          latitude: parseFloat(res.latitude),
          longitude: parseFloat(res.longitude)
        });
        that.getMarkerInfo(res.latitude, res.longitude);
      }
     }),
     
     
    this.mapCtx = wx.createMapContext('mapId')

    this.mapCtx.on('markerClusterClick', res =>{
      console.log('markerClusterClick', res)
    })

    // this.addMarkers();

    // // 使用默认聚合效果时可注释下一句
    // this.bindEvent();
  },

  bindEvent() {
    this.mapCtx.initMarkerCluster({
      enableDefaultStyle: false,
      zoomOnClick: true,
      gridSize: 60,
      complete(res) {
        console.log('initMarkerCluster', res)
      }
    })

    // enableDefaultStyle 为 true 时不会触发改事件
    this.mapCtx.on('markerClusterCreate', res => {
      console.log('clusterCreate', res)
      const clusters = res.clusters
      const markers = clusters.map(cluster => {
        const {
          center,
          clusterId,
          markerIds
        } = cluster
        return  {
          ...center,
          width: 0,
          height: 0,
          clusterId, // 必须
          label: {
            content: markerIds.length + '',
            fontSize: 20,
            width: 60,
            height: 60,
            bgColor: '#1C8CFE',
            borderRadius: 30,
            textAlign: 'center',
            anchorX: 0,
            anchorY: -30,
          }
        }
      })
      this.mapCtx.addMarkers({
        markers,
        clear: false,
        complete(res) {
          console.log('clusterCreate addMarkers', res)
        }
      })
    })
    
  },

  addMarkers() {
    const marker = {//可在此处自定义getMarkerInfo中获得的info中不存在却需要的属性名,因为后面会用到Object.assign将对象合并在一起
      iconPath: img,
      width: 40,
      height: 50,
      joinCluster: false, // 指定了该参数才会参与聚合
      latitude:null,
      longitude:null,
      roomId:null//房间id
    }
    const markers = []
    this.data.info.forEach((p, i, array) => {
      const a = {};
      const newMarker = Object.assign(a, marker, p); //小程序开发文档Object.assign(marker, p)因为浅拷贝的问题会出现markers数组内元素完全一样的现象,改成这样即可
      newMarker.latitude = parseFloat(newMarker.lat);
      newMarker.longitude = parseFloat(newMarker.lon);//可任意修改
      newMarker.roomId = newMarker.id;
      newMarker.id = i+1;//mark标记id
      //newMarker.label.content = `label ${i + 1}`
      markers.push(newMarker)//将newMarker push到markers中
    })
    this.mapCtx.addMarkers({//原小程序开发文档因为Object.assign的问题将这个方法写进了forEach中,现在可以拿到循环外
      markers,
      clear: false,
      complete(res) {
        console.log('addMarkers', res)
      }
    }),
      this.setData({
        markers: markers
      })
      this.setData({
        current_info: markers[0]
      });
      

  },
  // removeMarkers() {
  //   this.mapCtx.addMarkers({
  //     clear: true,
  //     markers: []
  //   })
  // },

  onMarkerTap(e) {
    this.setData({
      current_info: this.data.markers[e.detail.markerId-1]
    })
  },
})

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现这个功能,可以按照以下步骤进行操作: 1. 在微信开发者工具中创建一个新的小程序项目,并且勾选上“使用微信云开发”选项。 2. 在小程序页面中引入地图组件。可以使用微信提供的组件`<map>`来实现。 3. 在小程序页面中添加标点。可以使用微信提供的`<map>`组件的`markers`属性来添加标点。 4. 为每一个标点添加点击事件。可以使用微信提供的`<map>`组件的`bindmarkertap`属性来添加点击事件,并且指定一个函数来处理点击事件。 5. 在点击事件的处理函数中,使用微信提供的`wx.navigateTo`函数来跳转到指定页面。 下面是一个示例代码,可以帮助你实现这个功能: ```html <!-- 在小程序页面中添加地图组件 --> <map id="myMap" latitude="{{latitude}}" longitude="{{longitude}}" markers="{{markers}}" bindmarkertap="onMarkerTap"></map> ``` ```javascript // 在小程序页面中添加以下代码 Page({ data: { latitude: 39.912345, // 初始化地图的中心点纬度 longitude: 116.123456, // 初始化地图的中心点经度 markers: [{ id: 1, latitude: 39.912345, longitude: 116.123456, title: '这是一个标点', iconPath: '/images/marker.png' }] }, onMarkerTap: function(event) { // 获取点击的标点的信息 var markerId = event.markerId; var marker = this.data.markers[markerId]; // 跳转到指定页面 wx.navigateTo({ url: '/pages/detail/detail?latitude=' + marker.latitude + '&longitude=' + marker.longitude + '&title=' + marker.title }) } }) ``` 在上面的代码中,我们首先在小程序页面中添加了一个地图组件,并且设置了地图的中心点和一个标点。然后为`<map>`组件添加了`bindmarkertap`属性,并且指定了一个`onMarkerTap`函数来处理点击事件。当用户点击了某一个标点时,`onMarkerTap`函数会被触发,然后获取点击的标点的信息,并且使用`wx.navigateTo`函数跳转到一个指定的页面。在这个页面中,我们可以根据传入的经纬度和标题等信息来显示地图的具体位置和相关信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值