美文网首页
轨迹地图:信息窗口点击和非点击

轨迹地图:信息窗口点击和非点击

作者: 衬fzy | 来源:发表于2023-02-09 17:59 被阅读0次
微信图片_20230210180047.png

引入

 <script type="text/javascript" src="//webapi.amap.com/maps?v=2.0&key=dd2aa020f5cffa027de1c19ce5d7a3f1"></script>
  <script src="https://webapi.amap.com/ui/1.1/main.js?v=1.1.1"></script>
  <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>

html

<template>
  <div class="lineMap" id="select-map"></div>
</template>
<style lang="less" src="./lineMap.less" scoped></style>
<script src="./lineMapJs.js"></script>

js

import { linePointList, relationList } from "@/api/fzyMap";
import mapIcon from "@/assets/images/mapIcon1.png";
export default {
  data() {
    return {
      line_id: "",
      dataList: [], //点位
      relaCategory: 1, //1文物,2文保单位,3相关新闻,4文献,5其他
      dataList: [],
      listLi1: [],
      listLi2: [],
      marList: [],
      polyline: null,
      clickId: "",
      select1Id: ""
    };
  },
  mounted() { },
  methods: {
    /**根据父级传的线路id显示地图线路 */
    showLine(item) {
      this.$nextTick(() => {
        this.createMap();
        console.log(item);
        this.line_id = item.id;

        //假数据1----------------------------------------
        // this.dataList = [
        //   {
        //     name: "金牛区金牛区金牛区金牛区",
        //     id: 1,
        //     lng: 104.398543,
        //     lat: 30.329472,
        //     update_time: "2022-05-08 12:12:12"
        //   },
        //   {
        //     name: "郫都区",
        //     id: 2,
        //     lng: 103.843262,
        //     lat: 30.821168
        //   },
        //   {
        //     name: "新都区",
        //     id: 3,
        //     lng: 104.138519,
        //     lat: 30.820578
        //   }
        // ];
        this.relationListFun();
        //假数据0----------------------------------------

        linePointList({ page: 1, limit: 999, line_id: this.line_id }).then((res) => {
          this.dataList = res.data.data.list;
          this.relationListFun();
        });
      });
    },
    /**查询点的绑定内容 */
    async relationListFun() {
      await this.dataList.forEach(async (v) => {
        v.select1 = [
          {
            id: 1,
            name: "文物",
            select2: []
          },
          {
            id: 2,
            name: "文保单位",
            select2: []
          },
          {
            id: 3,
            name: "相关新闻",
            select2: []
          },
          {
            id: 4,
            name: "文献",
            select2: []
          },
          {
            id: 5,
            name: "其他",
            select2: []
          }
        ];
        await relationList({ page: 1, limit: 999, point_id: v.id }).then((res) => {
          res.data.data.list.forEach((v2) => {
            v.select1[v2.relaCategory - 1].select2.push(v2);
          });
        });
      });
      this.showLin();
      console.log("dataList", this.dataList);
    },
    /**显示已配置点连线 */
    showLin() {
      this.clickId = "";
      this.dataList.forEach((v) => {
        v.modify = false;
      });
      if (this.polyline) {
        this.map.remove(this.polyline);
      }
      let arr = []; //经纬度坐标数组
      this.dataList.forEach((v) => {
        arr.push(new AMap.LngLat(v.lng, v.lat, true));
      });
      this.polyline = new AMap.Polyline({
        path: arr,
        strokeWeight: 12,
        geodesic: true,
        lineJoin: "round",
        showDir: true,
        strokeColor: "#29b6f6",
        outlineColor: "white",
        isOutline: true,
        strokeWeight: 6.0,
        zIndex: 2,
        isOutline: true
      });
      this.map.add(this.polyline);
      this.showMarkList();
    },
    /**显示已配置点位点标记 */
    showMarkList(type) {
      this.marList.forEach((v) => {
        v.remove();
      });
      this.marList = [];
      this.dataList.forEach((v) => {
        // 自定义弹出信息窗体样式和数据绑定
        let mark = new AMap.Marker({
          extData: { item: v },
          map: this.map,
          zIndex: this.clickId === v.id ? 11 : 10,
          position: [v.lng, v.lat],
          offset: new AMap.Pixel(-17, -30), // 便宜了设置图片的一半
          content: this.contentHtml(v)
        });
        mark.on("click", this.marker_clickFun);
        this.marList.push(mark);
      });
      let clickDiv = document.querySelectorAll(".clickDiv"); //元素显示后绑定事件
      if (clickDiv) {
        console.log(clickDiv, clickDiv.length);
        for (var i = 0; i < clickDiv.length; i++) {
          clickDiv[i].onclick = (e) => {
            let itemId = e.currentTarget.id;
            let item = this.listLi2.find(
              (item0) => item0.id === Number(itemId)
            );
            this.$emit("infoDivFun", item);
          };
        }
      }
      if (!type) {
        this.map.setFitView(); // 自适应标记点显示
      }
    },
    /** 信息框 */
    contentHtml(item) {
      let img = `<div class="imgBox">`;
      img += `<img  src="${mapIcon}" />`;
      img += `</div>`;
      let infoDiv = "";
      // console.log(this.clickId, item.id)
      if (this.clickId == item.id) {
        infoDiv =
          '<div class="divBox" onmouseenter="onmouseenterFun()" onmouseleave="onmouseleaveFun()">';
        window.onmouseenterFun = () => {
          console.log("鼠标移入");
          this.map.setStatus({ zoomEnable: false });
        };
        window.onmouseleaveFun = () => {
          console.log("鼠标出");
          this.map.setStatus({ zoomEnable: true });
        };
        infoDiv += `<div class="x" onclick="xFun()">关闭</div>`;
        window.xFun = () => {
          this.clickId = "";
          console.log("关闭");
          this.map.setStatus({ zoomEnable: true });
          this.showMarkList();
        };
        infoDiv += `<div class="tableBox" >${item.name}</div>`;
        infoDiv += `<div class="selectBody">`;
        let select1 = "";
        if (this.listLi1.length > 0) {
          select1 += `<div class="selectBox">`;
          select1 += `<span>类型选择:</span>`;
          select1 += `<div class="selectDiv"><select id="1select${item.id}" onchange="
            select1Fun(${item.id}) ">`;

          this.listLi1.forEach((v2) => {
            select1 += `<option value="${v2.id}">${v2.name}</option>`;
          });
          select1 += `</select></div>`;
          this.$nextTick(() => {
            $(`#1select${item.id}`).val(this.select1Id); // 设置选中项
          });
          window.select1Fun = (id) => {
            console.log("id", id);
            let val = $(`#1select${id}`).find("option:selected").text();
            console.log(val, "选择类型");
            this.select1Id = $(`#1select${id}`).find("option:selected").val();
            this.listLi2 = this.listLi1.find(
              (res1) => res1.id == this.select1Id
            ).select2;
            this.showMarkList(true);
          };
          select1 += "</div>";
        }
        infoDiv += select1 + `</div>`;
        let infoBox = `<div class="infoBox" id="infoBox">`;
        if (this.listLi2.length > 0) {
          this.listLi2.forEach((v) => {
            infoBox += `<div class="liDiv"><div id="${v.id}" title="${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}${v.title}" class="clickDiv" ><span>${v.title}</span></div><div><img src="${v.showPath}" /></div></div>`;
          });
        } else {
          infoBox += `<div class="liDiv0">无数据</div>`;
        }
        infoBox += `</div>`;
        infoDiv += infoBox + `</div>`;
      } else {
        infoDiv = `<div class="info">${item.name}</div>`;
      }
      let html = `<div class="contentBox">` + img + infoDiv + `</div>`;
      return html;
    },
    onFun(e) {
      console.log(e);
    },
    /** 点击放大标记点 */
    marker_clickFun(e) {
      let keyId = e.target.getExtData().item.id;
      if (this.clickId != keyId) {
        this.clickId = keyId;
        let item = this.dataList.find((res) => res.id == this.clickId);
        this.map.setCenter([item.lng, item.lat], false, 100);
        this.select1Id = "";
        this.select2Id = "";
        this.select1Id = item.select1[0].id;
        this.listLi1 = item.select1;
        this.listLi2 = item.select1[0].select2;
        this.showMarkList(true);
        // this.map.setFitView(e.target) // 自适应标记点显示
      }
    },
    /**创建地图*/
    createMap() {
      this.center = [104.398543, 30.329472];
      this.$nextTick(() => {
        // 地图加载
        this.map = new AMap.Map("select-map", {
          // zoom: 10,
          zoom: 7,
          pitch: 0, // 地图俯仰角度,有效范围 0 度- 83 度
          viewMode: "3D", // 地图模式
          center: this.center
        });
        AMap.plugin(
          [
            "AMap.ToolBar",
            "AMap.Scale",
            "AMap.OverView",
            "AMap.MapType",
            "AMap.Geolocation"
          ],
          () => {
            // 在图面添加比例尺控件,展示地图在当前层级和纬度下的比例尺
            this.map.addControl(new AMap.Scale());
          }
        );
      });
    }
  }
};

css

.lineMap {
  width: 100%;
  height: 100%;
}

::v-deep {
  .contentBox {
    position: relative;
    text-align: center;

    .imgBox {
      display: inline-block;
      width: 30px;
      height: 30px;
      display: flex;
      align-items: center;
      justify-content: center;

      >img {
        width: 30px;
        height: 30px;
      }
    }

    .info {
      box-shadow: 0px 0px 15px #3e89fc;
      position: absolute;
      top: -30px;
      left: 50%;
      transform: translateX(-50%);
      background: rgba(248, 248, 248, 0.8);
      padding: 5px;
      border-radius: 4px;
      margin: 0;
      font-weight: 600;
      color: #000;
      white-space: nowrap;
    }
  }
}

::v-deep {
  .contentBox {
    position: relative;
    cursor: default;

    div {
      box-sizing: border-box;
    }

    .imgBox {
      display: inline-block;
      width: 30px;
      height: 30px;
      display: flex;
      align-items: center;
      justify-content: center;
      position: relative;
      z-index: 100;

      >img {
        width: 30px;
        height: 30px;
        cursor: pointer;
      }
    }

    .divBox {
      box-shadow: 0px 0px 15px #ddd;
      position: absolute;
      z-index: 999;
      width: 400px !important;
      // height: 200px;
      min-width: 0 !important;
      bottom: 55px;
      left: 50%;
      transform: translateX(-50%);
      padding: 10px 15px;
      border-radius: 4px;
      margin: 0;
      box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
      background: #f2f2f2;

      .x {
        position: absolute;
        right: 20px;
        top: 10px;
        color: #666;
        cursor: pointer;
        font-size: 16px;
      }

      .tableBox {
        font-weight: 600;
        padding: 5px 0 0 0;
        text-align: left;
        font-size: 16px;
      }

      .selectBody {
        display: flex;
      }

      .selectBox {
        flex: 1;
        display: flex;
        padding: 10px 0;

        >span {
          display: inline-block;
          padding-top: 5px;
        }

        .selectDiv {
          flex: 1;
          border-color: #ddd;

          select {
            width: 100%;
            height: 25px;
          }
        }
      }

      .selectBox :after {
        color: #ddd;
      }

      .infoBox {
        border-top: 1px solid #999;
        padding: 10px 0;
        max-height: 190px;
        overflow-y: auto;

        .liDiv {
          margin: 5px 0;
          position: relative;
          width: 100%;
          display: flex;
          height: 70px;
          padding: 5px 10px;
          box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2);

          >div:nth-of-type(1) {
            z-index: 8888;
            flex: 1;
            height: 60px;
            text-align: left;
            color: #3e89fc;
            font-size: 18px;
            font-weight: 600;
            line-height: 60px;
            text-overflow: -o-ellipsis-lastline;
            overflow: hidden;
            text-overflow: ellipsis;
            -webkit-line-clamp: 1;
            line-clamp: 1;
            -webkit-box-orient: vertical;
            word-break: break-all;
            word-wrap: break-word;
            text-overflow: ellipsis;
            white-space: nowrap;

            >span {
              cursor: pointer;
            }
          }

          >div:nth-of-type(2) {
            margin-left: 20px;
            flex: none;
            width: 85px;
            height: 60px;

            >img {
              display: inline-block;
              position: relative;
              top: 50%;
              left: 50%;
              max-width: 100% !important;
              max-height: 100% !important;
              transform: translate(-50%, -50%);
            }
          }
        }

        .liDiv0 {
          text-align: center;
          padding: 10px;
          color: #666;
        }

        .aDiv {
          >div {
            text-align: left;
            color: #666;
            font-weight: 600;
            padding-bottom: 5px;
          }

          a {
            width: 100%;
            white-space: pre-wrap;
            word-break: break-all;
            text-align: left !important;
            color: #3e89fc;
          }
        }
      }

      .infoBox::-webkit-scrollbar {
        width: 10px;
      }

      .infoBox::-webkit-scrollbar-thumb {
        border-radius: 10px;
      }
    }
  }

  .el-popover {
    transform: translateX(-50px) !important;
  }
}  

相关文章

网友评论

      本文标题:轨迹地图:信息窗口点击和非点击

      本文链接:https://www.haomeiwen.com/subject/ndrhkdtx.html