vue2中引入天地图及相关配置

前言

项目中需要引入特殊用途的地图,发现天地图比高德地图、百度地图要更符合需求,于是看了看天地图。

正文

vue2项目中如何引入天地图并对相关的配置进行修改使用呢?官方给的4.0版本的使用说明。

  1. 引入:

进入到public/index.html中:

<script src="http://api.tianditu.gov.cn/api?v=4.0&tk=去天地图官网申请你的tk"
        type="text/javascript"></script>
  1. template代码:

<template>
  <div class="TiandiMap">
    <div class="Map_conter" id="map" style="height: 60vh"></div>
    <!-- <div class="Draw_draw__pv">
      <a-tooltip class="item" effect="dark" content="测距" placement="top">
        <div class="point" @click="lineTool.open()">
          <img class="pointImg" src="../../../../src/assets/img/alarmSystem.png" alt="" />
        </div>
      </a-tooltip>
      <a-tooltip class="item" effect="dark" content="测面" placement="top">
        <div class="point" @click="polygonTool.open()">
          <img class="pointImg2" src="../../../../src/assets/img/bellSystem.png" alt="" />
        </div>
      </a-tooltip>
    </div> -->
  </div>
</template>
  1. javascript全部代码

地图标记点的数据格式如下

_this.plantDataList = [
          {
          longitude: "81.120445",
          latitude: "43.922741",
          plantStatus: "0", //0正常 1离线 2异常
          prjName: "一号牧场", //项目名称
          prjId: 1, //站点id
          plantStatus: 0,
          square: 2000, //面积
          prjaddress: "新疆维吾尔自治区伊犁哈萨克自治州伊宁市1号地",
          pump: 2, //传感器
          valve: 2, //阀门数量
        }
]

js代码如下

<script>
var marker,
  tmapContainer,
  infoWindow,
  T = window.T;

export default {
  data() {
    return {
      map: {}, //地图
      infoWin: "",
      lineTool: "", // 测距工具
      polygonTool: "", // 测面工具
      pubOneData: {}, // GEOJSON格式数据
      ID: "",
      plantDataList: [],
    };
  },

  methods: {
    //获取站点-return false后面是接口请求标记点相关信息的数据
    getPlantList() {
      return new Promise((resolve, reject) => {
        let _this = this,
          queryParams = {
            page: 1,
            limit: 1000,
            _t: new Date().getTime(),
          };
        _this.plantDataList = [
          {
          longitude: "81.120445",
          latitude: "43.922741",
          plantStatus: "0", //0正常 1离线 2异常
          prjName: "一号牧场", //项目名称
          prjId: 1, //站点id
          plantStatus: 0,
          square: 2000, //面积
          prjaddress: "新疆维吾尔自治区伊犁哈萨克自治州伊宁市1号地",
          pump: 2, //传感器
          valve: 2, //阀门数量
        },
        {
          longitude: "81.139345,",
          latitude: "43.928195",
          plantStatus: "1", //0正常 1离线 2异常
          prjName: "二号牧场", //项目名称
          prjId: 2, //站点id
          plantStatus: 1,
          square: 2200, //面积
          prjaddress: "新疆维吾尔自治区伊犁哈萨克自治州伊宁市2号地",
          pump: 3, //传感器
          valve: 3, //阀门数量
        },
        {
          longitude: "81.152353",
          latitude: "43.934064",
          plantStatus: "2", //0正常 1离线 2异常
          prjName: "三号牧场", //项目名称
          prjId: 1, //站点id
          plantStatus: 2,
          square: 2000, //面积
          prjaddress: "新疆维吾尔自治区伊犁哈萨克自治州伊宁市",
          pump: 2, //传感器
          valve: 2, //阀门数量
        },
        ];
        _this.$nextTick(() => {
          _this.loadMap(); //初始化天地图
        });
         return false
        getPlantList(queryParams)
          .then((res) => {
            if (res.data.list.length > 0) {
              _this.plantDataList = res.data.list;
              _this.$nextTick(() => {
                _this.loadMap(); //初始化天地图
              });
            }
          })
          .catch((error) => {
            console.log(error);
            return false;
          });
      });
    },

    //创建
    createPolygon(coors, option) {
      let points = [];
      coors.forEach((lonlat) => {
        points.push(new T.LngLat(lonlat[0], lonlat[1]));
      });
      this.clearAll();
      let polygon = new T.Polygon(points, {
        color: "#167FFD",
        weight: 2,
        opacity: 1,
        fillColor: "#167FFD",
        fillOpacity: 0.5,
      });
      return polygon;
    },

    //清空地图及搜索列表
    clearAll() {
      this.map.clearOverLays();
      this.map.centerAndZoom(new T.LngLat(81.189723, 43.920969), 14); //设置中心点和放大倍数
    },

    //初始化天地图
    loadMap() {
      let _this = this;
      try {
        var T = window.T;
        var imageURL =
          "http://t0.tianditu.gov.cn/img_w/wmts?" +
          "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles" +
          "&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}" +
          "&tk=去天地图官网申请你的tk"; //影像底图
        var lay = new T.TileLayer(imageURL, { minZoom: 1, maxZoom: 18 });
        var config = { layers: [lay], name: "TMAP_SATELLITE_MAP" };
        _this.map = new T.Map("map", config); // 创建地图实例

        var ctrl = new T.Control.MapType();
        _this.map.addControl(ctrl);
        _this.map.setMapType(window.TMAP_HYBRID_MAP); // 设置地图位地星混合图层
        _this.map.centerAndZoom(new T.LngLat(81.189723, 43.920969), 14); //设置中心点和放大倍数
        //允许鼠标双击放大地图
        _this.map.enableScrollWheelZoom();
        _this.map.enableDrag();
        //添加缩放控件
        var ctrlZoom = new T.Control.Zoom();
        _this.map.addControl(ctrlZoom);
        ctrlZoom.setPosition(T_ANCHOR_BOTTOM_RIGHT);
        //添加比例尺控件
        let ctrlScale = new T.Control.Scale();
        _this.map.addControl(ctrlScale);
        var config = {
          showLabel: true,
          color: "red",
          weight: 3,
          opacity: 0.5,
          fillColor: "#FFFFFF",
          fillOpacity: 0.5,
        };
        //创建标注工具对象
        _this.lineTool = new T.PolylineTool(_this.map, config);
        //创建标注工具对象
        _this.polygonTool = new T.PolygonTool(_this.map, config);
        _this.GetMaps(); //加载天地图
      } catch (error) {
        _this.$message.warning("加载失败!");
      }
    },

    addClickHandler(content, marker) {
      marker.addEventListener("click", function (e) {
        openInfo(content, e);
      });
    },

    openInfo(content, e) {
      var point = e.lnglat;
      marker = new T.Marker(point); // 创建标注
      var markerInfoWin = new T.InfoWindow(content, {
        offset: new T.Point(0, -30),
      });
      that.map.openInfoWindow(markerInfoWin, point); // 开启信息窗口
    },

    //天地图定位详情信息设置
    GetMaps() {
      var T = window.T,
        _this = this,
        markObj = {},
        autoPanMarker = null;
      if (_this.plantDataList.length > 0) {
        _this.map.clearOverLays();
        _this.map.centerAndZoom(new T.LngLat(81.189723, 43.920969), 14); //设置中心点和放大倍数
        let linePoints = [];
        _this.plantDataList.forEach((markItem, markItemIndex) => {
          markObj["marker" + (markItemIndex + 1)] = new T.Marker(
            new T.LngLat(markItem.longitude, markItem.latitude),
            {
              icon: new T.Icon({
                // iconUrl: "https://webapi.amap.com/theme/v1.3/m1.png",
                iconSize: new T.Point(30, 30),
                iconAnchor:
                  markItemIndex == 0 ? new T.Point(10, 56) : new T.Point(30, 30),
                iconUrl: markItem.plantStatus == '0' ? 'https://webapi.amap.com/theme/v1.3/m1.png' : markItem.plantStatus == '1' ? 'https://webapi.amap.com/theme/v1.3/m2.png' : markItem.plantStatus == '2' ? 'https://webapi.amap.com/theme/v1.3/m3.png' : '',
                // iconSize: new T.Point(30, 30),
                // iconAnchor: new T.Point(30, 30)
              }),
            }
          );
          markObj["marker" + (markItemIndex + 1)].prjId = markItem.id;
          markObj["marker" + (markItemIndex + 1)].prjName = markItem.prjName;
          markObj["marker" + (markItemIndex + 1)].plantStatus = markItem.plantStatus
            ? markItem.plantStatus
            : 0;
          markObj["marker" + (markItemIndex + 1)].square = markItem.square
            ? markItem.square
            : 2;
          markObj["marker" + (markItemIndex + 1)].prjaddress = markItem.prjaddress;
          markObj["marker" + (markItemIndex + 1)].pump = markItem.pump
            ? markItem.pump
            : 2;
          markObj["marker" + (markItemIndex + 1)].valve = markItem.valve
            ? markItem.valve
            : 2;

          _this.map.addOverLay(markObj["marker" + (markItemIndex + 1)]);

          // 添加连线
          linePoints = linePoints.concat(
            markObj["marker" + (markItemIndex + 1)].getLngLat()
          );
          let line = new T.Polyline(linePoints, {
            strokeColor: "green",
            strokeWeight: 10,
            strokeOpacity: 1,
          });
          _this.map.addOverLay(line);

          //鼠标移入
          markObj["marker" + (markItemIndex + 1)].addEventListener(
            "mouseover",
            function (e) {
              let winHtml =
                "<ul style='list-style-type: none;padding: 10px; background: #061830; font-size: 14px; color: #fff;'><li style='display: flex; justify-content: space-between;'><span>" +
                e.target.prjName +
                "</span></li>" +
                "<li style='display: flex; justify-content: space-between;'>运行状态: <span>" +
                (e.target.plantStatus == 0
                  ? "正常"
                  : e.target.plantStatus == 1
                  ? "离线"
                  : e.target.plantStatus == 2
                  ? "异常"
                  : "停机") +
                "<li style='display: flex; justify-content: space-between;'>面积: <span>" +
                e.target.square +
                "㎡" +
                "<li style='display: flex; justify-content: space-between;'>地址: <span>" +
                e.target.prjaddress +
                "<li style='display: flex; justify-content: space-between;'>泵: <span>" +
                e.target.pump +
                "个" +
                "<li style='display: flex; justify-content: space-between;'>阀门: <span>" +
                e.target.valve +
                "个" +
                "</span></li></ul>";
              autoPanMarker = new T.InfoWindow(winHtml, { autoPan: true });
              markObj["marker" + (markItemIndex + 1)].openInfoWindow(autoPanMarker);
            }
          );

          markObj["marker" + (markItemIndex + 1)].addEventListener(
            "mouseout",
            function (e) {
              markObj["marker" + (markItemIndex + 1)].closeInfoWindow();
            }
          );

          //单击
          markObj["marker" + (markItemIndex + 1)].addEventListener("click", function (e) {
            console.log("单击", e);
          });

          //双击
          markObj["marker" + (markItemIndex + 1)].addEventListener(
            "dblclick",
            function (e) {
              console.log("e", e);
              _this.$router
                .push({ path: "/我这里是双击标记点可以跳转到某个页面中去" })
                .catch((error) => {});
            }
          );
        });
      }
    },
  },

  mounted() {
    this.getPlantList();
  },
};
</script>

其中,关于地图中的事件中,基本名称都是js原生的名字,然后通过 addEventListener()监听事件,比如mouseover(鼠标移入)、mouseout(鼠标移出)、click(单击)、dblclick(双击)

  1. less代码

<style lang="less" scoped>
.TiandiMap {
  position: relative;
}

.Map_conter {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  overflow: hidden;
}

.Draw_draw__pv {
  position: absolute;
  top: 10px;
  left: 10px;
  z-index: 10000;
}
</style>

效果

1.可以通过接口获取不同状态地图标记点,分别用蓝、黄、红图标表示正常、离线、异常等状态

2.为所有的标记点添加信息浮窗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31046.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cocos Creator3D:制作可任意拉伸的 UI 图像

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 制作可任意拉伸的 UI 图像 UI 系统核心的设计原则是能够自动适应各种不同的设备屏幕尺寸&#xff0c;因此我们在制作 UI 时需要正确设置每个控件元素的尺寸&#xff08;size&#…

TypeScript ~ TS 掌握自动编译命令 ③

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

【CV 向】OpenCV 图形绘制指南

文章目录 引言1. 创建画布2. 绘制线段3. 绘制矩形4. 绘制圆5. 绘制椭圆6. 绘制多边形7. 绘制字体结论 引言 Python OpenCV 是一个功能强大的计算机视觉库&#xff0c;除了图像处理和计算机视觉任务外&#xff0c;它还提供了丰富的功能来绘制各种图形。无论是在计算机视觉应用中…

Springboot程序开启远程DEBUG

一、远程debug的原理 Spring Boot程序远程debug的原理主要是通过在启动时指定JVM参数来启用远程调试模式&#xff0c;并在调试器中连接到程序所在的调试地址&#xff0c;从而实现对程序的远程调试。 具体步骤如下&#xff1a; 在运行Spring Boot程序时&#xff0c;在启动命令…

软考高级系统架构设计师(四) 计算机网络2磁盘阵列

目录 磁盘阵列RAID RAID级别 ​IPV6 网络接入技术 综合布线 磁盘阵列RAID 磁盘阵列&#xff08;Redundant Arrays of Independent Disks&#xff0c;RAID&#xff09;&#xff0c;有"数块独立磁盘构成具有冗余能力的阵列”之意。 磁盘阵列是由很多块独立的磁盘&#…

P35[10-5]硬件IIC配置+读写MPU6050(软)(此处注意与软件iic区别)

接线图如下: 注:硬件读写iic的连接位置固定,可参考引脚定义表(如下) 声明:I2C1重映射时,有一次更换机会,但是此面包板由于OLED的该引脚无法接线,因此只能接在PB10 PB11的I2C2上 软件iic初始化部分:(此处即可替代掉整个软件iic.c初始化的底层) void MPU6050_Init(vo…

MyCat总结

目录 什么是mycat 核心概念 逻辑库 逻辑表 分片节点 数据库主机 用户 mycat原理 目录结构 配置文件 读写分离 搭建读写分离 搭建主从复制&#xff1a; 搭建读写分离&#xff1a; 分片技术 垂直拆分 实现分库&#xff1a; 水平拆分 实现分库&#xff1a; ER表 全局表 分…

IDEA新UI速览,成了VS Code的样子?

IntelliJ IDEA 2023.1 现已发布。此版本包括对新 UI 的改进&#xff0c;根据从用户那里收到的反馈进行了彻底改造。此外还实现了性能增强&#xff0c;从而在打开项目时更快地导入 Maven 和更早地使用 IDE 功能。由于采用了 background commit checks&#xff0c;新版本提供了简…

【学习学习】NLP理解层次模型

NLP&#xff08;Neuro-Linguistic Programming&#xff0c;神经语言程序学&#xff09;&#xff0c;由两位美国人理查得.班德勒&#xff08;Richard Bandler&#xff09;与约翰.葛瑞德&#xff08;John Grinder&#xff09;于1976年创办&#xff0c;并在企业培训中广泛使用。美…

Vue3的计算属性和监听属性

目录 computed 语法介绍 简写版 完整版 watch 介绍 监听ref式数据代码示例 监听reactive式数据 watchEffect函数 computed 语法介绍 与Vue2.x中computed配置功能一致 import {computed} from vuesetup(){...//计算属性——简写let fullName computed(()>{return per…

【C++篇】C++新增的一些基础特性

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

改进YOLOv8 | 优化器篇 | YOLOv8 引入谷歌 Lion 优化器

论文地址:https://arxiv.org/pdf/2302.06675.pdf 代码地址:https://github.com/google/automl/tree/master/lion 我们提出了一种将算法发现作为程序搜索的方法,并将其应用于发现用于深度神经网络训练的优化算法。我们利用高效的搜索技术来探索一个无限且稀疏的程序空间。为了…

2022前端趋势报告(上)

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 一、前言 本文内容来自于《St…

Python在不同领域中的应用

Python 是一种功能强大且易于使用的编程语言&#xff0c;因此在各个领域都有广泛的应用。以下是 Python 在不同领域中的应用&#xff1a; 数据科学&#xff1a;Python 是数据科学家和机器学习专家的首选工具之一。它有成熟的数据分析库和工具包&#xff0c;如 Pandas、NumPy、S…

【前端知识】React 基础巩固(十五)——书籍购物车简单案例

React 基础巩固(十五)——书籍购物车简单案例 案例代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"v…

C国演义 [第六章]

第六章 最长递增子序列题目理解步骤dp含义递推公式初始化遍历顺序 代码 最长连续递增序列题目理解步骤dp含义递推公式初始化遍历顺序 代码 最长递增子序列 力扣链接 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&am…

Linux->线程同步

目录 前言&#xff1a; 1 线程同步引入 2 条件变量 2.1 线程饥饿 2.2 条件变量接口 2.3 添加条件变量 3 生产者和消费者模型 前言&#xff1a; 本篇主要讲解了关于线程同步的相关知识&#xff0c;还有生产者和消费者模型的认识和使用。 1 线程同步引入 在讲解线程同步之…

数仓架构“瘦身”,Hologres 5000CU时免费试用

Hologres基于创新的HSAP架构&#xff0c;可以将您原先数仓架构中的OLAP系统&#xff08;Greenplum、Presto、Impala、ClickHouse&#xff09;、KV数据库/Serving系统&#xff08;HBase、Redis&#xff09;统一在一个大数据计算引擎中&#xff0c;并提供快速的离线实时一体化分析…

智能家居APP软件开发有何优势?

传统家居行业营销模式已经无法满足现代人多样化个性化的需求&#xff0c;也跟不上互联网时代的发展步伐了&#xff0c;很多传统家居行业都陷入了营销困境。通过智能家居APP软件开发&#xff0c;可以利用互联网改造传统模式&#xff0c;探索新的发展模式&#xff0c;可以说智能家…

近期煤矿事故及电力综合自动化系统的介绍

安科瑞虞佳豪 5月29日&#xff0c;山西灵石红杏鑫鼎泰煤业有限公司发生一起死亡1人的安全事故&#xff1b;5月24日&#xff0c;山西华阳集团新能股份有限公司二矿发生一起死亡1人的安全事故。 ​山西省应急管理厅、山西省地方煤矿安全监督管理局责令山西灵石红杏鑫鼎泰煤业有…