zoukankan      html  css  js  c++  java
  • arcgis jsapi接口入门系列(9):可以同时显示多个的地图popup

    jsapi有提供popup功能,但缺点很多,例如地图上只能同时显示一个popup,popup内容有限制等

    本文提供另一个方法,原理不用jsapi,在地图外用一个普通的div放在地图上面,再监听地图的鼠标移动等时间控制这div跟着地图联动

    本文代码可能存在跟框架的css等绑定,不一定能直接运行,在此只提供实现思路

    本文代码用到vue的绑定

    初始化,写入popup的数据也在此

            popupInit: function () {
                //popup初始化
    
                //填入popup的数据
                this.popupInfos = [];
    
                this.popupInfos.push({
                    //地图坐标
                    x: 113.566806,
                    y: 22.22445,
                    //popup内容的文字,只是个示范,当然格式不限
                    text: "我是第一个",
                    //是否显示,不是必须的
                    show: true,
                    //样式
                    style: {
                        //div的位置,单位是屏幕坐标
                        top: "-1000px",
                        left: "-1000px",
                    },
                });
    
                this.popupInfos.push({
                    x: 113.57418,
                    y: 22.2234205,
                    text: "我是第2222个",
                    show: true,
                    style: {
                        top: "-1000px",
                        left: "-1000px",
                    },
                });
    
                this.popupInfos.push({
                    x: 113.5928,
                    y: 22.226853,
                    text: "我不显示的",
                    show: false,
                    style: {
                        top: "-1000px",
                        left: "-1000px",
                    },
                });
            },

    移动popup位置的方法

            //移动popup位置
            relocatePopup: function () {
                for (let i = 0; i < this.popupInfos.length; i++) {
                    let popupInfo = this.popupInfos[i];
    
                    //把popup所在的地图坐标转为屏幕坐标
                    let point = mapUtil.geometry.xyToPoint(this.apiInstance, popupInfo.x, popupInfo.y, this.mapView.spatialReference);
                    let screenPoint = this.mapView.toScreen(point);
    
                    let x = screenPoint.x;
                    let y = screenPoint.y;
                    //重新设置popup的div的位置
                    popupInfo.style.top = y - 114 + 'px';
                    popupInfo.style.left = x - 100 + 'px';
                }
            },

    监听地图事件以实现popup和地图位置联动,这段代码通常在map加载完成时执行

                        //地图弹窗移动的实现
                        //由于popup只是一个在jsapi外部的一般的div,因此这div的移动要自行编码实现
                        //原理是监听地图所有的会改变地图显示范围的事件(也就是popup需要移动的事件),然后根据地图坐标转换为屏幕坐标,最终重新设置div的位置
                        //地图拖动事件
                        this.mapView.on('drag', function (e) {
                            this.relocatePopup();
                        }.bind(this));
                        //滚轮事件
                        this.mapView.on('mouse-wheel', function (e) {
                            this.relocatePopup();
                        }.bind(this));

    html部分,地图和popup的代码截取,用了vue和element-ui实现绑定

    <div style="height: 100%;">
        <el-row style="height: 100%;">
            <el-col :span="20" style="height: 100%;">
                <el-row style="height: 100%;overflow: hidden;">
                    <!--地图的div-->
                    <div class="mapContainer" id="mapDemo1"></div>
                    <!--地图弹窗的html部分-->
                    <!--popupInfos是弹窗的数据源,其他跟一般的div没区别-->
                    <!--PS:注意,要使popup不会超出地图以外是通过父级div的overflow: hidden来实现-->
                    <div class="infoWindowItem" v-for="(popupInfo,index) in popupInfos" :style="popupInfo.style"
                         v-show="popupInfo.show">
                        <div class="item">
                            <span class="content">{{popupInfo.text}}</span>
                        </div>
                    </div>
                </el-row>
            </el-col>

    实现效果,底图是天地图

  • 相关阅读:
    hdu2037 今年暑假不AC[贪心][区间调度问题]
    Features Track[STL map]
    Characters with Hash[签到题]
    hdu2094产生冠军[STL set]
    2018ECNA Difference[时空复杂度]
    hdu1276士兵队列训练问题[简单STL list]
    20190815网络与信息安全领域专项赛线上赛misc WriteUp
    hdu1873 看病要排队[优先队列]
    Pygame 贪吃蛇
    Windows安装Python3 curses模块
  • 原文地址:https://www.cnblogs.com/cannel/p/11078008.html
Copyright © 2011-2022 走看看