uni-app中map组件自定义聚合点样式在手机端样式失效

uni-app中map组件自定义聚合点样式在手机端样式失效

信息项 详细信息
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 win10
HBuilderX类型 正式
HBuilderX版本 3.3.13
手机系统 Android
手机系统版本 Android 10
手机厂商 华为
手机机型 note9
页面类型 nvue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

示例代码:

<template>  
  <view class="content">  
    <map id="map" class="map" :show-location="true" :latitude="latitude" :longitude="longitude"></map>  
  </view>  
</template>  

<script>  
  const img = '/static/logo.png';  

  export default {  
    data() {  
      return {  
        latitude: 23.099994,  
        longitude: 113.324520,  
      }  
    },  
    onReady() {  
      this._mapContext = uni.createMapContext("map", this);  

      // 仅调用初始化,才会触发 on.("markerClusterCreate", (e) => {})  
      this._mapContext.initMarkerCluster({  
        enableDefaultStyle: false,  
        zoomOnClick: true,  
        gridSize: 60,  
        complete(res) {  
          console.log('initMarkerCluster', res)  
        }  

      });  

      this._mapContext.on("markerClusterCreate", (e) => {  

        debugger  

        let clusterMarkers = []  
            // const clusters = e.clusters // 新产生的聚合簇  
            const clusters = e // 新产生的聚合簇  
            console.log(clusters)  
             clusters.forEach((cluster,index) => {  
                const {  
                    center, // 聚合点的经纬度数组  
                    clusterId, // 聚合簇id  
                    markerIds // 已经聚合了的标记点id数组  
                } = cluster  
                debugger  
                let clusterObj = {clusterId,   
                    width: 50,  
                    height: 50,  
                    iconPath: '',  
                    label: {// 定制聚合簇样式  

                        fontSize: 16,  
                        color: '#fff',  
                        width: 50,  
                        height: 50,  
                        bgColor: '#22ac38',  
                        borderRadius: 25,  
                        textAlign: 'center',  
                        anchorX: -10,  
                        anchorY: -35,  

                    }  
                }  
                clusterMarkers.push(clusterObj)  
            })  
            // 添加聚合簇  
            this._mapContext.addMarkers({  
                markers:clusterMarkers,  
                clear: false, //是否先清空地图上所有的marker  
            })  

            console.log(clusterMarkers)  

        // console.log("markerClusterCreate", e);  
      });  

      this.addMarkers();  
    },  
    methods: {  

      addMarkers() {  
        const marker = {  
          id: 1,  
          iconPath: img,  
          width: 50,  
          height: 50,  
          joinCluster: true, // 指定了该参数才会参与聚合  
          label: {  
            width: 50,  
            height: 30,  
            borderWidth: 1,  
            borderRadius: 10,  
            bgColor: '#ffffff'  
          }  
        };  

        const positions = [{  
          latitude: 23.099994,  
          longitude: 113.324520,  
        }, {  
          latitude: 23.099994,  
          longitude: 113.322520,  
        }, {  
          latitude: 23.099994,  
          longitude: 113.326520,  
        }, {  
          latitude: 23.096994,  
          longitude: 113.329520,  
        }]  

        const markers = []  

        positions.forEach((p, i) => {  
            const newMarker = Object.assign(marker, p)  
            newMarker.id = i + 1  
            newMarker.label.content = `label ${i + 1}`  
            markers.push(newMarker)  
            this._mapContext.addMarkers({  
                markers,  
                clear: false,  
                complete(res) {  
                  console.log('addMarkers', res)  
                }  
            })  
        })  
      }  
    }  
  }  
</script>  

<style>  
  .content {  
    flex: 1;  
  }  

  .map {  
    flex: 1;  
  }  
</style>

操作步骤:

  • 在安卓手机上打开地图,聚合点样式会发生改变

预期结果:

  • 聚合点样式发生改变

实际结果:

  • 样式没变

bug描述:

  • uniapp中使用map组件自定义聚合点样式,在APP端nvue页面样式失效
18 回复

贴个图看看效果


已贴,我已经把底色换成绿色了,但是没有变化

有么有人能解决一下

聚合时也加上joinCluster: true, 安卓自定义样式可以生效,但ios不生效 [挠头] const {
center, // 聚合点的经纬度数组
clusterId, // 聚合簇id
markerIds // 已经聚合了的标记点id数组
} = cluster
let clusterObj = {clusterId,
width: 50,
height: 50,
iconPath: ‘’,
** joinCluster: true,**
label: {// 定制聚合簇样式

    fontSize: 16,    
    color: '#fff',    
    width: 50,    
    height: 50,    
    bgColor: '#22ac38',    
    borderRadius: 25,    
    textAlign: 'center',    
    anchorX: -10,    
    anchorY: -35,    

}    

}

发现ios是由于this.mapctx.on(“markerClusterCreate”, (e) => {}) 事件不触发导致的,怎搞 this.mapctx.initMarkerCluster({ enableDefaultStyle: false, zoomOnClick: true, gridSize: 60, success: (res) => { console.log(‘initMarkerCluster’, res) } }); this.mapctx.on(“markerClusterCreate”, (clusters) => { console.log(“markerClusterCreate”, clusters); if (clusters) { this.updateClusters(clusters) } });

不触发,会不会是指向有问题。定义一下let that = this, 试一下呢

回复 1***@qq.com: 一样的代码,安卓没事,ios不触发markerClusterCreate事件,换成别的比如markerClusterClick事件就会触发 [挠头]

回复 1***@qq.com: 不是指向问题,把this,换成that也没啥作用

缩放地图过程中有概率会使用默认的聚合样式,你们遇到过吗?

回复 1***@qq.com: 是的,安卓会这样

有解决这个问题吗

Android 聚合自定义样式存在问题,后续修复

顶 请问现在解决了吗?

回复 9***@qq.com: 链接失效了,请问你这个问题解决了么

回复 Geewoo_c: 解决了,链接能打开没有失效。打不开吗?

回复 9***@qq.com: 安卓好了,苹果自定义的点没了,聚合样式也很淡,裂开…

uni-app 中使用 map 组件时,自定义聚合点样式在手机端失效的问题,可能是由于以下原因导致的:

1. 平台差异

  • uni-appmap 组件在不同平台(如微信小程序、H5、App)上的实现方式不同,可能会导致样式在某些平台上失效。
  • 特别是在微信小程序中,map 组件的聚合点样式可能受到限制。

2. 样式兼容性

  • 自定义聚合点样式可能使用了某些 CSS 属性或 JavaScript 方法,这些方法在某些平台上不被支持或表现不一致。
  • 例如,微信小程序的 map 组件对自定义样式的支持有限,可能无法完全按照 H5 或 App 的方式实现。

3. 代码实现问题

  • 检查代码中是否有平台特定的逻辑,导致在某些平台上样式未正确应用。
  • 确保自定义聚合点的代码在所有平台上都能正确执行。

解决方案

1. 检查平台兼容性

  • 使用 uni-app 提供的条件编译功能,针对不同平台编写不同的代码。
  • 例如:
    // #ifdef H5
    // H5 平台的自定义聚合点样式
    // #endif
    
    // #ifdef MP-WEIXIN
    // 微信小程序平台的自定义聚合点样式
    // #endif

2. 使用平台支持的样式

  • 确保使用的样式和方法在目标平台上被支持。
  • 例如,微信小程序的 map 组件可能不支持某些 CSS 属性,需要使用小程序提供的 API 来实现类似效果。

3. 调试和日志

  • 在代码中添加日志,检查自定义聚合点的逻辑是否在手机端正确执行。
  • 使用 console.loguni.showToast 来调试代码。

4. 使用第三方库

  • 如果 uni-appmap 组件无法满足需求,可以考虑使用第三方地图库(如高德地图、腾讯地图)的 SDK,这些 SDK 通常提供更丰富的功能和更好的跨平台支持。

5. 示例代码

  • 以下是一个简单的示例,展示如何在 uni-app 中自定义聚合点样式:
    <template>
      <view>
        <map
          :latitude="latitude"
          :longitude="longitude"
          :markers="markers"
          @markertap="onMarkerTap"
        ></map>
      </view>
    </template>
    
    <script>
    export default {
      data() {
        return {
          latitude: 39.909,
          longitude: 116.39742,
          markers: [
            {
              id: 1,
              latitude: 39.909,
              longitude: 116.39742,
              iconPath: '/static/marker.png',
              width: 30,
              height: 30,
              label: {
                content: '自定义聚合点',
                color: '#ffffff',
                bgColor: '#ff0000',
                borderRadius: 10,
                padding: 5,
                textAlign: 'center'
              }
            }
          ]
        };
      },
      methods: {
        onMarkerTap(e) {
          console.log('Marker tapped:', e.markerId);
        }
      }
    };
    </script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!