• vue 调用高德地图api实现标点和显示窗体


    一、前期工作

    1.注册高德地图成为开发者

    2.创建一个新应用、获取秘钥

    二、引入

    1.找到public  index.html文件插入js

    1  <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=秘钥&&plugin=AMap.Geocoder,AMap.AutoComplete,AMap.PlaceSearch"></script> 

    需要地图工具类的把变量加入到plugin中

    三、初始化地图,显示多个点标记,点击出现窗体

    1.amap.vue

    <template>
      <div class="my-container">
        <div id="map-demo"></div>
      </div>
    </template>
        
    <script>
    import createInfoWindow from "@/utils/amap";
    export default {
      data() {
        return {
          map: null,
          infoWindow: null,
          closeImg: require("@/assets/close.png"),
          pointList: [
            {
              address: "郑州市收到货爽肤水1",
              local: [113.651398, 34.767445],
            },
            {
              address: "郑州市收到货爽肤水2",
              local: [113.851398, 34.767445],
            },
            {
              address: "郑州市收到货爽肤水3",
              local: [113.751398, 34.667445],
            },
            {
              address: "郑州市收到货爽肤水4",
              local: [113.641398, 34.747445],
            },
          ],
          winInfo: [],
          winTitle: "",
          markList: [],
        };
      },
      mounted() {
        this.carGPSIP();
      },
      methods: {
        carGPSIP() {
          let self = this;
          this.map = new AMap.Map("map-demo", {
            resizeEnable: true,
            zoom: 8, //级别
            center: [113.663221, 34.7568711], //中心点坐标
            viewMode: "2D", //使用3D视图
            mapStyle: "amap://styles/darkblue",
          }); //初始化地图
    
          //遍历生成多个标记点
          for (var i = 0, marker; i < this.pointList.length; i++) {
            var marker = new AMap.Marker({
              position: this.pointList[i].local, //不同标记点的经纬度
              map: self.map,
            });
    
            marker.title = `<span>大厅车间</span><span>设备名称</span>`;
            marker.content = JSON.stringify([
              "电话:" + "123456789",
              "地址:" + this.pointList[i].address,
              "位置:" + this.pointList[i].local,
            ]);
            marker.on("click", self.markerClick);
            // marker.emit("click", { target: marker }); //默认初始化不出现信息窗体,打开初始化就出现信息窗体
          }
    
          //实例化信息窗体
          this.infoWindow = new AMap.InfoWindow({
            isCustom: true, //使用自定义窗体
            content: self.winInfo,
            offset: new AMap.Pixel(15, -35),
          });
          this.map.setFitView();
        },
        // 点标记点击事件
        markerClick(e) {
          let self = this;
          this.winInfo = JSON.parse(e.target.content);
          this.winTitle = e.target.title;
          // 设置窗体内容
          this.infoWindow.setContent(
            createInfoWindow.createInfoWindow(
              self.winTitle,
              self.winInfo.join("<br/>"),
              function () {
                // 关闭窗体
                self.map.clearInfoWindow();
              }
            )
          );
          // 打开窗体
          self.infoWindow.open(self.map, e.target.getPosition());
        },
      },
    };
    </script>
        
    <style scoped>
    #map-demo {
       500px;
      height: 500px;
    }
    </style>

    2.utils/amap.js

    封装窗体结构样式

    function createInfoWindow(title, content,callback) {
        var info = document.createElement("div");
        info.className = "custom-info input-card content-window-card";
    
        //可以通过下面的方式修改自定义窗体的宽高
        info.style.width = "400px";
        // 定义顶部标题
        var top = document.createElement("div");
        // var titleD = document.createElement("div");
        var closeX = document.createElement("img");
        top.className = "info-top";
        
        closeX.src = require("@/assets/close.png");
        closeX.onclick = callback;
    
        // top.appendChild(titleD);
        top.innerHTML = title;
        top.appendChild(closeX);
        info.appendChild(top);
    
        // 定义中部内容
        var middle = document.createElement("div");
        middle.className = "info-middle";
        middle.style.backgroundColor = "white";
        middle.innerHTML = content;
        info.appendChild(middle);
    
        // 定义底部内容
        var bottom = document.createElement("div");
        bottom.className = "info-bottom";
        bottom.style.position = "relative";
        bottom.style.top = "0px";
        bottom.style.margin = "0 auto";
        info.appendChild(bottom);
        return info;
      }
      
      export default {
        createInfoWindow
    }

    3.amap.scss

    地图窗体的样式文件

    .content-window-card {
        position: relative;
        box-shadow: none;
        bottom: 0;
        left: 0;
         auto;
        padding: 0;
      }
      
      .content-window-card p {
        height: 2rem;
      }
      
      .custom-info {
        /* border: solid 1px silver; */
      }
      
      div.info-top {
        position: relative;
        background: #0f49b5;
        height: 30px;
        line-height: 30px;
        font-size: 14px;
        color: #fff;
        padding: 0 10px;
      }
      
      div.info-top span:nth-child(2) {
        position: absolute;
        left: 50%;
        transform: translateX(-50%);
         200px;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        text-align: center;
      }
      
      div.info-top img {
        position: absolute;
        top: 8px;
        right: 10px;
        transition-duration: 0.25s;
         15px;
      }
      
      div.info-top img:hover {
        box-shadow: 0px 0px 5px #000;
      }
      
      div.info-middle {
        background: rgba(0,54,98,.8)!important;
        font-size: 12px;
        padding: 10px 6px;
        line-height: 20px;
        color: #fff;
      }
      
      div.info-bottom {
        height: 0px;
         100%;
        clear: both;
        text-align: center;
         0;
          height: 0;
          border-left: 5px solid transparent;
          border-right: 15px solid transparent;
          border-top: 20px solid rgba(0,54,98,.8);
      }
      
      div.info-bottom img {
        position: relative;
        z-index: 104;
      }
      
      
      .info-middle img {
        float: left;
        margin-right: 6px;
      }
     
  • 相关阅读:
    thinkphp url生成
    thinkphp url大小写
    thinkphp 伪静态
    thinkphp action参数绑定
    thinkphp 前置和后置操作
    thinkphp 控制器定义
    thingkphp 路由实例
    thinkphp 闭包支持
    thinkphp 静态路由
    thinkphp 正则路由
  • 原文地址:https://www.cnblogs.com/yangxiaobai123/p/15434142.html
Copyright © 2020-2023  润新知