vue2使用天地图

需求:用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.rhkb.cn/news/404549.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:C/C++的内存管理

目录 C/C内存分布 C语言中动态内存管理方式 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 定位new表达式 常见问题 malloc/free和new/delete的区别 内存泄漏 C/C内存分布 我们先来看以…

【机器学习】(基础篇七) —— 神经网络

神经网络 神经网络是一种模仿人脑神经元结构的计算模型&#xff0c;用于处理复杂的数据模式识别和预测问题。它由大量简单的处理单元&#xff08;称为“神经元”或“节点”&#xff09;组成&#xff0c;这些单元通过连接权重相互连接。神经网络可以学习从输入数据到输出结果之…

GitLab Merge Request流水线

GitLab Merge Request 流程文档 为了提升代码质量&#xff0c;让开发人员参与代码review&#xff0c;现在输出Merge Request的流程文档&#xff1a; 1.项目创建各自开发者的分支&#xff0c;命名规则是dev_名字首字母&#xff0c;比如我是dev_cwq.然后把本地分支推到远端orgin…

2024.8.19 学习记录 —— 作业

一、TCP机械臂测试 #include <myhead.h>#define SER_PORT 8888 // 与服务器保持一致 #define SER_IP "192.168.0.114" // 服务器ip地址int main(int argc, const char *argv[]) {// 创建文件描述符打开键盘文件int fd open("/dev/input/event1…

【数学建模】趣味数模问题——舰艇追击问题

问题描述 某缉私舰位于走私船以东 d 10 km&#xff0c;走私船以匀速 u 8 km/h 向北沿直线行驶。缉私舰立即以速度 v 12 km/h 追赶。缉私舰使用雷达进行跟踪&#xff0c;保持瞬时速度方向始终指向走私船。求解缉私舰的追逐路线和追上走私船所需的时间。 方法 理论求解&…

NIO中的异步—ChannelFuture、CloseFuture以及异步提升在NIO中的应用

ChannelFuture 客户端调用connect后返回值为ChannelFuture对象&#xff0c;我们可以利用ChannelFuture中的channel()方法获取到Channel对象。 由于上述代为为客户端实现&#xff0c;若想启动客户端实现连接操作&#xff0c;必须编写服务端代码&#xff0c;实现如下&#xff1a;…

python中的randint如何使用

python中的randint用来生成随机数&#xff0c;在使用randint之前&#xff0c;需要调用random库。random.randint()是随机生成指定范围内的整数&#xff0c;其有两个参数&#xff0c;一个是范围上限&#xff0c;一个是范围下限。 具体用法如下&#xff1a; import random print…

USB3.2 摘录(四)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; 文章目录 系列文章目录8 协议层&#xff08;Protocol Layer&#xff09;8.8 三个参数地址信息&…

苍穹外卖项目DAY07

苍穹外卖项目Day07 1、缓存菜品 1.1、问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 1.2、实现思路 通过Redis来缓存菜品的数据&#xff0c;减少数据库查询操作 缓存逻辑分析&#xff…

未来视界,触手可及:揭秘数字透明屏的奇幻之旅

在这个日新月异的科技时代&#xff0c;每一项创新都如同星辰般璀璨&#xff0c;引领着我们向更加智能、更加梦幻的未来迈进。今天&#xff0c;就让我们一起揭开一项颠覆传统视觉体验的前沿科技——数字透明屏的神秘面纱&#xff0c;探索它如何将未来视界&#xff0c;化为触手可…

IDEA:如何在idea中设置自动导包

这里使用的是idea2020版本,但是不同版本操作不会有较大的差别. 在Editer中展开General之后,选中Auto Import,最后勾选中Add unambiguous imports on the fly.

微信视频号评论如何快速采集?三种高效实用的方法

本文将深入探讨如何高效地采集微信视频号评论&#xff0c;通过揭秘三种实用方法&#xff0c;助您迅速掌握这一营销利器。从自动化工具到智能策略&#xff0c;每一步都旨在提升您的市场分析效率&#xff0c;让您在竞争激烈的社交媒体领域中脱颖而出。 一、引言&#xff1a;为何…

探索顶级PDF水印API:PDFBlocks(2024年更新)

引言 在一个敏感信息常常面临风险的时代&#xff0c;能够轻松高效地保护文档的能力至关重要。PDF水印已成为企业和个人寻求保护其知识产权、确保文件保密性的基本工具。 PDFBlocks 文字水印 API是什么&#xff1f; PDFBlocks API 提供了一个强大的解决方案&#xff0c;用于在…

day06——前后端交互

一、计算属性 计算属性就是基于现有的数据推算出来的新属性&#xff0c;只要依赖的数据变化&#xff0c;新属性就会自动更新&#xff0c;而且计算属性多次调用的情况下只会计算一次&#xff0c;效率非常高 简化写法 const app new Vue({ el: #app, data: {}, methods: {//跟da…

记录一次生产jvm问题的排查

记录一次生产问题的排查 第一天晚上 现象 1、前援反馈页面有接口陆续出现请求超时 2、登录后台服务器top命令查看发现java进程发生高cpu占用情况 3、查看对应业务日志&#xff0c;报数据库连接等待超时-数据库连接池连接无空闲 对应处理 1、临时调大数据库连接池最大连接数限…

Chat App 项目之解析(三)

Chat App 项目介绍与解析&#xff08;一&#xff09;-CSDN博客文章浏览阅读76次。Chat App 是一个实时聊天应用程序&#xff0c;旨在为用户提供一个简单、直观的聊天平台。该应用程序不仅支持普通用户的注册和登录&#xff0c;还提供了管理员登录功能&#xff0c;以便管理员可以…

【三维重建汇总】NeRF和GS重建中,如何排除干扰物?(提升质量)

汇总最近NeRF与GS提升质量的论文 文章目录 前言一、NeRF On-the-go&#xff1a;利用不确定性落地真实世界&#xff08;CVPR24&#xff09;摘要1.DINOv2特征的不确定性预测2.NeRF中干扰物去除的不确定性3.优化4. Dilated Patch 扩大采样5.实验结果 二、Pixel-GS:像素感知的梯度密…

unity程序简易框架

1. 框架基本结构 2. 单例模式基类模块 2.1 BaseManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class BaseManager<T> where T:new() {private static T instance;public static T GetInstance(){if (instance == …

高防服务器配置要素

高防服务器配置通常包括硬件资源、网络资源、防护能力、弹性防护、清洗能力和业务支持等方面。下面将详细介绍高防服务器的配置要素&#xff0c;rak部落小编为您整理发布。 高防服务器是设计用来抵御各种网络攻击&#xff0c;特别是分布式拒绝服务(DDoS)攻击的服务器配置。这些…

伊朗通过 ChatGPT 试图影响美国大选, OpenAI 封禁多个账户|TodayAI

OpenAI 近日宣布&#xff0c;他们已经封禁了一系列与伊朗影响行动有关的 ChatGPT 账户&#xff0c;这些账户涉嫌利用该 AI 工具生成并传播与美国总统选举、以色列 – 哈马斯战争以及奥运会等相关的内容。 OpenAI 表示&#xff0c;这些账户与一个名为 “Storm-2035” 的秘密伊朗…