首页 > 其他分享 >uniapp- map组件监听地图缩放

uniapp- map组件监听地图缩放

时间:2022-10-12 12:11:47浏览次数:54  
标签:uniapp map 缩放 item let result data id

需求:根据地图缩放比例大小判断展示maker气泡(地图缩小时只显示maker,放大到一定数值时再显示气泡)

 

 

 官方提到的这个回调只能监听拖拽,并不能监听缩放,这样做的效果就是在指定级别内气泡会拖一下闪烁一下,特难受!!!!

 

解决办法:使用地图对象定时获取地图的缩放级别,然后再判断是否该显示还是隐藏,并且该方式不能让气泡经常闪烁:

完整代码:

<template>
    <view>
        <map style="width: 100%;" id="map":style="{height:mapheight}" :show-location='true' :latitude="latitude"
            :longitude="longitude" :markers="marker" :joinCluster="true" :scale="scale" @markertap="markertap"
            >
        </map>
        <view class="legend_fixed">
            <view class="legend_box">
                <view v-for="(item,index) in legendList" :key="index" class="legend_items" @tap="choiceFn(item,index)">
                    <u-icon :name="item.icon" :color="item.color" size="30"></u-icon>
                    <view class="right">
                        <view class="name">{{item.name}}</view>
                        <view class="flex">
                            <view class="infos">
                                站点:<text>{{item.site_number>99?'99+':item.site_number}}</text>
                            </view>
                            <view class="infos">
                                评论:<text>{{item.comment_number>99?'99+':item.comment_number}}</text>
                            </view>
                        </view>

                    </view>
                </view>
            </view>
        </view>
    </view>
</template>

<script>
    export default {
        data() {
            return {
                latitude: 29.587311, //纬度
                longitude: 106.532555, //经度
                scale: 12, //缩放级别
                current_legend: 0, //当前分类
                legendList: [],
                bottomData: false,
                marker: [],
                mapContext: null // 地图对象
            }
        },
        onl oad() {
            this.getLegendList();
        },
        onReady() {
            this.mapContext = uni.createMapContext("map", this);
            this.intervalFn();
        },
        computed: {
            mapheight() {
                let data = ''
                if (this.bottomData) {
                    if (this.upTop) {
                        data = '50px'
                    } else {
                        data = '200px'
                    }
                } else {
                    data = '85vh'
                }
                return data
            },
            coverbottom() {
                let data = ''
                if (this.bottomData) {
                    data = '20rpx'
                } else {
                    data = '100rpx'
                }
                return data
            }
        },
        methods: {
            /* 站点分类 */
            getLegendList() {
                this.$myRequset({
                    url: this.$requestApi.get_classify
                }).then((res) => {
                    this.legendList = res.data.data;
                    this.getSiteList(0);
                }).catch((err) => {});
            },
            /* 站点列表 */
            getSiteList(_id) {
                uni.showLoading({
                    title: '站点数据加载中...',
                    icon: "none"
                })
                this.$myRequset({
                    url: this.$requestApi.get_site_list,
                    data: {
                        classify_id: _id
                    },
                }).then((res) => {
                    uni.hideLoading();
                    let _list = res.data.data;
                    let _result = [];
                    _list.map((item) => {
                        let _obj = {
                            id: Number(item.id),
                            latitude: item.latitude, //纬度
                            longitude: item.longitude, //经度
                            iconPath: this.legendList[this.current_legend].icon,
                            name: item.name,
                            address: item.address,
                            rotate: 0, // 旋转度数
                            width: 30, //宽
                            height: 30, //高
                            alpha: 0.9, //透明度
                            title: item.title,
                            /* callout: {
                                content: item.title,
                                color: '#000', //文字颜色
                                fontSize: 16, //文本大小
                                borderRadius: 2, //边框圆角
                                borderWidth: '8',
                                padding: 10,
                                bgColor: '#fff', //背景颜色
                                display: 'ALWAYS', //常显
                            } */
                        }
                        _result.push(_obj);
                    });
                    this.marker = _result;
                }).catch((err) => {
                    uni.showToast({
                        title: err.msg,
                        icon: "none"
                    });
                });
            },
            
            /* 获取地图缩放级别-定时判断 */
            intervalFn(){
                setInterval(() => {
                    this.mapContext.getScale({
                        success:(res) => {
                           let _result = [];
                           let _obj = {};
                           if (this.marker.length > 0) {
                               let _result = [];
                               this.marker.map((item) => {
                                   _obj = {
                                       id: Number(item.id),
                                       latitude: item.latitude, //纬度
                                       longitude: item.longitude, //经度
                                       iconPath: this.legendList[this.current_legend].icon,
                                       name: item.name,
                                       address: item.address,
                                       rotate: 0, // 旋转度数
                                       width: 30, //宽
                                       height: 30, //高
                                       alpha: 0.9, //透明度
                                       title: item.title,
                                   }
                                   if (res.scale >= 14.5) { // 放大地图显示气泡,缩小地图不显示
                                       _obj.callout = {
                                           content: item.name,
                                           color: '#000', //文字颜色
                                           fontSize: 16, //文本大小
                                           borderRadius: 2, //边框圆角
                                           borderWidth: '8',
                                           padding: 10,
                                           bgColor: '#fff', //背景颜色
                                           display: 'ALWAYS', //常显
                                       }
                                   }
                                   _result.push(_obj);
                               });
                               this.marker = _result;
                           }
                        }
                    })
                }, 500)
            },
            choiceFn(_item, _index) {
                this.current_legend = _index;
                if (_index == 0) {
                    this.getSiteList(0);
                } else {
                    this.getSiteList(this.legendList[this.current_legend].id);
                }
            },
            //地图点击事件
            markertap(e) {
                uni.navigateTo({
                    url: '../../pageA/listDetail/listDetail?site_id=' + e.markerId
                });
            },
        }
    }
</script>
<style>
    @import url("index.css");
</style>

总结:官方稍微有点坑了,只能监听拖拽开始和结束,跟正常的交互不太统一,好在还能通过获取地图对象这条路来走,但是说实话轮循是下下策,如果有伙伴能有更好的解决方案欢迎交流额。

标签:uniapp,map,缩放,item,let,result,data,id
From: https://www.cnblogs.com/LindaBlog/p/16784086.html

相关文章

  • Java 做项目能用到 Map 哪些功能?这篇总结全了
    在Java的集合框架里除了Collection类族外还有Map类族,在Java中Collection类族表示存储着对象的各种集合数据结构,而Map类族则表示存储着键值对的映射表数据结构。......
  • Stream流的特点_只能使用一次与Stream流中的常用方法_map
    Stream流的特点_只能使用一次Stream流属于管道流,只能被消费(使用)一次第一个Stream流调用完毕方法,数据就会流转到下一个Stream上而这时第一个Stream流已经使用完毕,就会......
  • CSS - 11 变形:平移,旋转与缩放
    11.变形:平移,旋转与缩放变形是指通过css来改变元素的形状或位置,变形不会影响到页面的布局transform用来设置元素的变形效果11.1平移语法translateX()沿着x轴......
  • Ceph使用---Crush Map进阶
    一、CephCrushMap介绍ceph集群中由mon服务器维护的的五种运行图:Monitormap#监视器运行图OSDmap#OSD运行图PGmap#PG运行图Crushmap#(Controllersrepl......
  • Nmap诸神之眼深度解析
    Nmap诸神之眼深度解析本章内容概括:​ 1.1NMAP简介​ 1.2NMAP基本参数​ 1.3图形界面zenmap的高级使用技巧​ 1.4NMAP绕过防火墙​ 1.5Nmap脚本渗透测试......
  • SpringBoot+MyBatis Plus对Map中Date格式转换的处理
    在SpringBoot项目中,如何统一JSON格式化中的日期格式问题现在的关系型数据库例如PostgreSQL/MySQL,都已经对JSON类型提供相当丰富的功能,项目中对于不需要检索但是......
  • CSS3 -2D转换之translate (移动:translate、旋转:rotate、缩放:scale)
    CSS3-2D转换之translate转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果,可以简单理解为变形移动:translate旋转:rotate缩放:scale1......
  • mAP定义及相关概念
    mAP定义及相关概念P=>precision,即准确率R=>recall,即召回率PR曲线=>即以precision和recall作为纵、横轴坐标的二维曲线。一般来说,precision和recall......
  • Map.Entry详解及List的流Stream
    Map.Entry详解Map是java中的接口,Map.Entry是Map的一个内部接口。Map提供了一些常用方法,如keySet()、entrySet()等方法。keySet()方法返回值是Map中key值的集合;entrySet(......
  • Java集合TreeMap红黑树一生只爱一次(三天彻底理解应用TreeMap)
    一、那么为什么需要树呢?仔细想一下TreeSet、TreeMap,为什么要用他们。HashSet速度快,TreeSet则方便排序。HashMap速度快,TreeMap方便排序。同时,在树中查找数据项的速度和在有......