vue2使用天地图

news2024/9/19 10:35:34

需求:用vue2使用天地图展示对应点位数据以及开发中出现的问题等,其实天地图的写法和百度地图差不多

注意!!!天地图的接口不稳定,时常报错418,官网也是一样的情况,推荐还是使用百度或者高德吧。

 以下是拷贝的网上的地图坐标系,仅作参考

(1)天地图:CGCS2000,2000国家大地坐标系;我们其实很多时候直接用WGS84的坐标来代替CGCS2000坐标。因为CGCS2000的定义与WGS84实质一样。采用的参考椭球非常接近。扁率差异引起椭球面上的纬度和高度变化最大达0.1mm。当前测量精度范围内,可以忽略这点差异。可以说两者相容至cm级水平,但若一点的坐标精度达不到cm水平,则不认为CGCS2000和WGS84的坐标是相容的。

(2)百度地图:bd09II坐标。首先了解一下火星坐标,它是在国际标准坐标WGS-84上进行的一次加密,由于国内的电子地图都要至少使用火星坐标进行一次加密,百度直接就任性一些,直接自己又研究了一套加密算法,来了个二次加密,这就是我们所熟知的百度坐标(BD-09)。

(3)高德地图:gcj02坐标,也称为火星坐标。火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图、导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的。

原文地址如下:

常用的几种在线地图(天地图、百度地图、高德地图)坐标系之间的转换算法_天地图坐标系-CSDN博客

1.效果

2.申请天地图的TK

步骤我就不贴了,直接点击下方链接就可以申请注册开发者了

天地图API (tianditu.gov.cn)

3.项目引入

3.1在vue2的public文件下的index.html中引入天地图(引入后建议重新运行代码)

      <!-- // 这里的tk为你在天地图的官网申请的tk -->
        <script src="https://api.tianditu.gov.cn/api?v=4.0&tk=" type="text/javascript"></script>

4.关键代码讲解

引入成功后页面就可以使用new T.Map了,也就是把百度地图的bmap给为了t.map,这个mapDiv是<div id="mapDiv"></div>,也就是存放天地图的容器

centerAndZoom:设置地图中心点和缩放级别

 loadMap() {
            let that = this;
            let zoom = 16;
            //初始化地图对象
            this.map = new T.Map('mapDiv');
            //设置显示地图的中心点和级别
            let lng = 116.849;
            let lat = 28.202988;
            if (that.lnglat) {
                lng = that.lnglat.split(',')[0];
                lat = that.lnglat.split(',')[1];
            }
            this.map.centerAndZoom(new T.LngLat(lng, lat), zoom);
            //创建缩放平移控件对象
            let control = new T.Control.Zoom();
            //添加缩放平移控件
            this.map.addControl(control);
            // this.map.setMinZoom(10);
            // this.map.setMaxZoom(17);
            this.$nextTick(() => {
                this.setPoint();
            });
        },

4.1地图类型控件(只展示个别类型)

官网地图控件代码(默认展示全部):

一共分为

TMAP_NORMAL_MAP(普通)

TMAP_SATELLITE_MAP(卫星视图)

TMAP_HYBRID_MAP(卫星和路网混合)

TMAP_TERRAIN_MAP(地形视图)

TMAP_TERRAIN_HYBRID_MAP(地形和路网混合)

  //初始化地图对象
            map = new T.Map("map", {datasourcesControl: true});
            //设置显示地图的中心点和级别
            map.centerAndZoom(new T.LngLat(116.40969, 39.89945), 12);
            //创建对象
            var ctrl = new T.Control.MapType();
            //添加控件
            map.addControl(ctrl);

需求:只想要卫星混合和卫星的 

  var ctrl = new T.Control.MapType([
        {
          title: "卫星混合",
          icon: "http://api.tianditu.gov.cn/v4.0/image/map/maptype/satellitepoi.png",
          layer: TMAP_HYBRID_MAP,
        },
        {
          title: "卫星",
          icon: " http://api.tianditu.gov.cn/v4.0/image/map/maptype/satellite.png",
          layer: TMAP_SATELLITE_MAP,
        },
      ]);
      // this.map.addControl(ctrl);
      // 创建对象
      // var ctrl = new T.Control.MapType();
      //添加控件
      this.map.addControl(ctrl);

      this.map.setMapType(TMAP_HYBRID_MAP);

全部的地图样式我都找到了,有需要自己改下就可以了,代码如下:

  controls: [ { name: "mapType", position: "bottomright", mapTypes: [ { title: "地图", icon: "http://api.tianditu.gov.cn/v4.0/image/map/maptype/vector.png", layer: "TMAP_NORMAL_MAP" }, { title: "卫星", icon: " http://api.tianditu.gov.cn/v4.0/image/map/maptype/satellite.png", layer: "TMAP_SATELLITE_MAP" }, { title: "卫星混合", icon: "http://api.tianditu.gov.cn/v4.0/image/map/maptype/satellitepoi.png", layer: "TMAP_HYBRID_MAP" }, { title: "地形", icon: " http://api.tianditu.gov.cn/v4.0/image/map/maptype/terrain.png", layer: "TMAP_TERRAIN_MAP" }, { title: "地形混合", icon: " http://api.tianditu.gov.cn/v4.0/image/map/maptype/terrainpoi.png", layer: "TMAP_TERRAIN_HYBRID_MAP" } ] } ]

4.2给地图添加标点(并且保证首次加载地图所有点都展示在视图中) 

标点只需要设置点的经纬度就行

       setPoint() {
            const site = this.siteArr;
            site.forEach((item) => {
                // 创建标注对象
                const marker = new T.Marker(new T.LngLat(item.longitude, item.latitude));
                console.log(marker, '标记点');
                item.marker = marker;
                // 向地图上添加标注
                this.map.addOverLay(marker);
                // 点位的点击事件,展示弹窗
                this.addClickHandler(item, marker);
            });
        },

 首次加载地图所有点都展示在视图中,需要修改上面的代码,主要添加new T.LngLat,和setViewport

     setPoint() {
            const site = this.siteArr;
            let points = [];
            site.forEach((item) => {
                // 创建标注对象
                const marker = new T.Marker(new T.LngLat(item.longitude, item.latitude));
                var lnglat = new T.LngLat(item.lng, item.lat);
                points.push(lnglat);
                console.log(marker, '标记点');
                item.marker = marker;
                // 向地图上添加标注
                this.map.addOverLay(marker);
                // 点位的点击事件,展示弹窗
                this.addClickHandler(item, marker);
            });
            this.map.setViewport(points);
        },

4.3 点击标点后弹出信息

主要代码,需要在setPoint中调用该方法:new T.InfoWindow(); // 创建信息窗口对象

that.map.openInfoWindow(markerInfoWin, e.lnglat); // 开启信息窗口

 // 相对于点偏移的位置(可以不设置)

 markerInfoWin.setContent(sContent, { offset: new T.Point(0, -30) });

   // 点位弹窗
        addClickHandler(content, marker) {
            var T = window.T;
            const that = this;
            marker.addEventListener('click', function (e) {
                var markerInfoWin = new T.InfoWindow(); // 创建信息窗口对象
                // 弹窗模版
                const sContent = `<div class="module-title" style="color: black;font-size: 14px;">网关名称:${content.name}</div>
         <div class="module-title" style="color: black;font-size: 14px;">分组:${content.group}</div>
         <div class="module-title" style="color: black;font-size: 14px;">SN:${content.sn}</div>
        `;
                // 相对于点偏移的位置
                markerInfoWin.setContent(sContent, { offset: new T.Point(0, -30) });
                that.map.openInfoWindow(markerInfoWin, e.lnglat); // 开启信息窗口
            });
        }

4.4使用插件 wgs84转国测局坐标

npm install coordtransform

 只需要传经纬度就行,第一个是经度,第二是纬度,最后得到的是转换后的wgs84togcj02=[110.983,28.3832](我这是随便写的,主要是格式是这样的)

  var wgs84togcj02 = this.COORDTRANSFORM.wgs84togcj02(
                   110.3054265898,
                   28.1871
                );

5.完整代码

<template>
    <div class="equipmentMap">
        <div class="mapBox" v-if="gatewayData.length">
            <div class="mapBox_frame" v-for="(item, index) in gatewayData" :key="index">
                <div class="name ellipsis" :title="item.name">网关名称:{{ item.name }}</div>
                <div class="other ellipsis">分组:{{ item.group.toString() }}</div>
                <div class="other ellipsis">SN:{{ item.sn }}</div>
            </div>
        </div>
        <div id="mapDiv"></div>
    </div>
</template>
<script>
export default {
    name: 'EquipmentOverview',
    data() {
        return {
            gatewayData: [],
            siteArr: [
                {
                    longitude: 110.3054265898,
                    latitude: 28.202988,
                    name: '测试',
                    group: ['测试'],
                    sn: '123456789'
                },
                {
                    longitude: 111.3054265898,
                    latitude: 39.3945170337,
                    name: '测试',
                    group: ['测试'],
                    sn: '123456789'
                }
            ],
            map: null
        };
    },
    filters: {},
    mounted() {
        // this.getGatewayData();
        this.$nextTick(() => {
            this.loadMap();
        });
    },
    methods: {
        loadMap() {
            let that = this;
            let zoom = 16;
            //初始化地图对象
            this.map = new T.Map('mapDiv');
            //设置显示地图的中心点和级别
            let lng = 116.849;
            let lat = 28.202988;
            if (that.lnglat) {
                lng = that.lnglat.split(',')[0];
                lat = that.lnglat.split(',')[1];
            }
            this.map.centerAndZoom(new T.LngLat(lng, lat), zoom);
            //创建缩放平移控件对象
            let control = new T.Control.Zoom();
            //添加缩放平移控件
            this.map.addControl(control);
            var ctrl = new T.Control.MapType([
                {
                    title: '卫星混合',
                    icon: 'http://api.tianditu.gov.cn/v4.0/image/map/maptype/satellitepoi.png',
                    layer: TMAP_HYBRID_MAP
                },
                {
                    title: '卫星',
                    icon: ' http://api.tianditu.gov.cn/v4.0/image/map/maptype/satellite.png',
                    layer: TMAP_SATELLITE_MAP
                }
            ]);
            // this.map.addControl(ctrl);
            // 创建对象
            // var ctrl = new T.Control.MapType();
            //添加控件
            this.map.addControl(ctrl);

            this.map.setMapType(TMAP_HYBRID_MAP);
            // this.map.setMinZoom(10);
            // this.map.setMaxZoom(17);
            this.$nextTick(() => {
                this.setPoint();
            });
        },
        setPoint() {
            const site = this.siteArr;
            let points = [];
            site.forEach((item) => {
                // 创建标注对象
                const marker = new T.Marker(new T.LngLat(item.longitude, item.latitude));
                var lnglat = new T.LngLat(item.lng, item.lat);
                points.push(lnglat);
                console.log(marker, '标记点');
                item.marker = marker;
                // 向地图上添加标注
                this.map.addOverLay(marker);
                // 点位的点击事件,展示弹窗
                this.addClickHandler(item, marker);
            });
            this.map.setViewport(points);
        },
        // 点位弹窗
        addClickHandler(content, marker) {
            var T = window.T;
            const that = this;
            marker.addEventListener('click', function (e) {
                var markerInfoWin = new T.InfoWindow(); // 创建信息窗口对象
                // 弹窗模版
                const sContent = `<div class="module-title" style="color: black;font-size: 14px;">网关名称:${content.name}</div>
         <div class="module-title" style="color: black;font-size: 14px;">分组:${content.group}</div>
         <div class="module-title" style="color: black;font-size: 14px;">SN:${content.sn}</div>
        `;
                // 相对于点偏移的位置
                markerInfoWin.setContent(sContent, { offset: new T.Point(0, -30) });
                that.map.openInfoWindow(markerInfoWin, e.lnglat); // 开启信息窗口
            });
        }
    }
};
</script>
<style lang="scss" scoped>
#mapDiv {
    width: 100%;
    height: 94vh;
}
.seachInput {
    position: absolute;
    z-index: 9999;
    margin: 0.6% 0px 0px 3%;
    width: 300px;
}
.mapBox {
    border: 1px solid #eaecf0;
    background-color: white;
    height: 303px;
    overflow: auto;
    width: 300px;
    position: absolute;
    z-index: 9999;
    margin: 2.7% 0px 0px 3%;
}
.mapBox_frame {
    height: 100px;
    width: 294px;
    background-color: white;
    border-bottom: 1px solid #efeded;
    padding: 14px;
    line-height: 24px;
    .name {
        font-weight: 400;
        font-size: 16px;
        color: #333333;
        cursor: pointer;
    }
    .ellipsis {
        width: 240px;
        overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 1; /*3表示只显示3行*/
        -webkit-box-orient: vertical;
    }
    .other {
        font-weight: 400;
        font-size: 14px;
        color: #666666;
        cursor: pointer;
    }
}
.mapBox_frame:hover {
    background-color: rgb(221, 239, 250); /* 鼠标滑过时的背景颜色 */
    color: white; /* 鼠标滑过时的文本颜色 */
}
::-webkit-scrollbar {
    width: 4px;
    height: 6px;
}
::-webkit-scrollbar-thumb {
    border-radius: 10px;
    box-shadow: inset 0 0 5px rgba(97, 184, 179, 0.1);
    background: rgba(144, 147, 153, 0.3);
}
.easy-scrollbar__wrap::-webkit-scrollbar-track {
    box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
    border-radius: 20px;
    background: #ededed;
}
/deep/ .tdt-control-container {
    display: none !important;
}
</style>

文章到此结束,希望对你有所帮助~

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一种基于物联网(IoT)的生物多样性监测系统

目录 摘要 第一部分&#xff1a;引言 第二部分&#xff1a;相关工作 第三部分&#xff1a;贡献 第四部分&#xff1a;提出的系统架构 第五部分&#xff1a;BN使用的消息框架 第六部分&#xff1a;系统实施 第七部分&#xff1a;实验场景和结果 第八部分&#xff1a;结…

游戏开发之性能优化

游戏开发中的性能优化是一个复杂且多方面的过程&#xff0c;涉及到多个层面的改进和调整。以下是一些主要的优化技巧和方法&#xff1a; 代码优化&#xff1a; 缓存计算结果&#xff1a;对于那些耗费大量CPU计算而计算结果无需每帧变化的逻辑&#xff0c;使用缓存可以显著提高性…

Java——反射(4/4):反射的作用、应用场景(案例需求、实现步骤、代码实现)

目录 作用 应用场景 案例需求 实现步骤 代码实现 作用 基本作用&#xff1a;可以得到一个类的全部成分然后操作。可以破坏封装性。最重要的用途是&#xff1a;适合做Java的框架&#xff0c;基本上&#xff0c;主流的框架都会基于反射设计出一些通用的功能。 通过反射能够…

Springboot+vue 建筑资质证书管理系统

建筑企业资证管理系统&#xff0c;简称证书管理软件&#xff0c;基于springbootvue开发&#xff0c;数据库采用mysql&#xff0c;。以建筑企业证书管理为核心&#xff0c;包含投证书管理、证书过期提醒&#xff0c;辅助建筑企业高效完成证书管理、人员信息、投标经营活动等管理…

全功能知识付费小程序源码系统 支持视频课程、音频课程、图文课程 附带代码包以及搭建部署教程

系统概述 “全功能知识付费小程序源码系统”是一款专为知识创作者、教育机构及企业内训部门设计的全方位解决方案。该系统基于当前最流行的小程序技术构建&#xff0c;无需下载安装&#xff0c;用户只需通过微信等社交平台即可轻松访问&#xff0c;极大地降低了使用门槛。同时…

CentOS 7 安装流程详细教程

目录 前言1. CentOS 7 概述2. 安装环境准备2.1 硬件要求2.2 安装介质准备 3. CentOS 7 安装步骤3.1 引导安装程序3.2 选择语言和键盘布局3.3 配置安装源和软件包3.4 配置分区3.5 设置网络和主机名3.6 设置时间和日期3.7 设置 root 密码和创建用户3.8 开始安装并完成配置 4. 安装…

8-11章节复习总结

文章目录 数据库技术三级模式两级映射数据设计数据模型E-R模型关系模型练习题 关系代数关系代数运算符练习题 SQL语句练习题 数据库控制练习题 数据库故障和备份函数依赖函数依赖的公理系统键与约束 规范化第一范式1NF第二范式2NF第三范式3NF练习题 模式分解练习题 标准化与知识…

R语言统计分析——回归诊断2

参考资料&#xff1a;R语言实战【第2版】 R语言的car包提供的大量函数&#xff0c;大大增强了拟合和评价回归模型的能力。如下&#xff1a; 函数目的qqPlot()分位数比较图durbinWatsonTest()对误差自相关性做Durbin-Watson检验crPlots()成分与残差图ncvTest()对非恒定的误差方…

如何构建Java SpringBoot+Vue的宽带业务管理系统:一步一脚印教程

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

贝叶斯推理:分步指南

一、说明 让我们深入了解贝叶斯推理的迷人世界。我将通过易于遵循的示例向您介绍其实际应用。 贝叶斯推理为统计分析提供了一个强大而灵活的框架&#xff0c;特别是在存在不确定性和先验知识的情况下。通过结合先前的分布并使用贝叶斯定理根据新证据更新这些信念&#xff0c;贝…

可视耳勺值不值得买?精心总结六大选购技巧

随着生活品质逐渐提高&#xff0c;很多家庭越来越关注个护健康&#xff0c;其中包括耳道的清洁方式。以前人们常用棉签或者挖耳勺进行掏耳朵&#xff0c;但这种方式很容易导致清洁不干净引发中耳炎。可视耳勺应运而生&#xff0c;能通过可视化的操作帮助用户看清耳垢位置进行精…

python之matplotlib (4 图例)

图例 方法一 import matplotlib.pyplot as plt import numpy as npxnp.arange(1,10) yx2 yy2*x1figplt.figure() axplt.gca() ax.plot(x,y,labela,ccoral) ax.plot(x,yy,labelb,cy) plt.legend() plt.show() 在plot中的参数label注明标注名称即可实现图例的绘制&#xff0c;但…

【深度学习】直观理解AUROC

文章目录 前言如何计算直观解释常用计算方式 前言 AUROC常用于衡量二分类分类器的性能&#xff0c;本文旨在详解该指标计算过程 如何计算 设想我们有一个分类器&#xff0c;对数据做二分类。我们设输入数据为 x x x, 预测标签为 y y y, ground-truth标签为 y ^ \hat{y} y…

JAVA多场景多项目排队叫号系统小程序源码

&#x1f525;【告别长龙&#xff0c;智能排队新风尚】多场景多项目排队叫号系统大揭秘&#x1f50d; &#x1f680;【一码在手&#xff0c;轻松畅游各大场景】 还在为医院挂号、银行办事、餐厅等号的长队头疼吗&#xff1f;&#x1f629; 多场景多项目排队叫号系统&#xff0…

关于nginx标准配置参数介绍

标准配置参数&#xff1a; user root;#配置用户或者组&#xff0c;默认为nobody worker_processes 4;#允许生成的进程数&#xff0c;默认为1 项目中nginx.conf配置文件 user root; worker_processes 4; //最大的进程数&#xff0c;要看服务器的内核是多少核的&#xff0…

IEEE-802.3总线局域网

关于以太网相关基础知识&#xff0c;这批文章说的挺好的。

MacOS 阿里云docker镜像仓库无法登录的解决办法

问题情况 Error response from daemon: Get “https://registry.cn-hangzhou.aliyuncs.com/v2/”: Method Not Allowed 解决办法 MacOS下&#xff0c;打开该文件 open ~/.docker删除config.json文件 重新登录 已经提示Login Successed 接下去进行其他操作即可。 PS&…

MiDaS、ZoeDepth、Depth-Anything ai算法深度图估计

1、MiDaS 参考&#xff1a; https://github.com/isl-org/MiDaS https://pytorch.org/hub/intelisl_midas_v2/ https://colab.research.google.com/github/pytorch/pytorch.github.io/blob/master/assets/hub/intelisl_midas_v2.ipynb#scrollTo5A32CL3tocrZ 代码 import cv2 i…

如何使用midjourney?MidJourney订阅计划及国内订阅教程

国内如何订阅MidJourney 第三方代理 参考&#xff1a; zhangfeidezhu.com/?p474 使用信用卡订阅教程 办理国外信用卡&#xff1a; 这个各自找国外的银行办理就好了。 登录MidJourney&#xff1a; 登录MidJourney网站&#xff0c;进入订阅中心。如果是在Discord频道&#x…

idea启动报错Improperly specified VM option.

我本来是想解决idea启动占内存的问题&#xff0c;在网上找了个修改启动参数&#xff0c;这么改的 因为格式不正确&#xff0c;idea启动报错&#xff1a; Improperly specified VM option. To fix the problem, edit your JVM optionsand remove the options that are obsolete…