vue项目天地图使用

news2025/7/10 11:01:48

最近的项目中遇到了新的需求,需要在项目中使用天地图,因为第一次接触,官方的网站引用之类的也没有进行详细的介绍,自己去找的时候发现这部分的文章也比较少,有的问题也没有讲清楚,所以发布这篇文章分享总结一下vue项目天地图的使用。

官方天地图引入

http://lbs.tianditu.gov.cn/api/js4.0/guide.html 这是天地图的官方地址,我使用的是最新的版本,4.0的api具体的可以进入官网去看看,像下面这样选择就可以

在这里插入图片描述
引入只需要在index.html页面引入

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

如果要用到热力图的效果的话还需要引入

<script src="http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/HeatmapOverlay.js" type="text/javascript"></script>

这里是官网的热力图js,顺序一定要是天地图的js引入在热力图之前,因为热力图的js会使用到天地图里面定义的东西。

这里还会有个小问题,如果你的项目地址是https的访问http的时候会不安全,访问不到,所以可以直接将这两个文件下载下来放在本地去引入

<script src="./tdt.js" type="text/javascript"></script>
<script type="text/javascript" src="./HeatmapOverlay.js"></script>

这里的tdt.jsHeatmapOverlay.js就是下载到本地的文件。这样引入也会更快,减少网络请求的时间。可以尽量使用这种引入。
到这里引入就算全部完成了。

天地图初始化

首先创建承载标签

<div id="mapContainerTD" ></div>

注意!!!!这里会存在一个问题,我当初卡了一天没有解决,这里的标签如果用v-show或者v-if时,地图初始化会加载不出来,一定要标签显示的时候才会进行加载。如果一定要用到这两个的话,这里可以提供一个解决方案,可以先将值设置为true,然后执行地图的初始化,执行完成之后在将值设置为false即可。

data中定义对象mapTD:null

var T = window.T; // 这个一定需要定义,可以直接在mounted里面定义
this.mapTD = null
let mapTD = new T.Map('mapContainerTD'); // div的id
// 传参中心点经纬度,以及放大程度
mapTD.centerAndZoom(new T.LngLat(122.225718, 30.264533), 15);
mapTD.setMinZoom(10);// 设置最小变动层级
mapTD.setMaxZoom(18);// 设置最大变动层级
mapTD.enableDrag();// 启用拖拽
mapTD.enableScrollWheelZoom();// 启用滚轮放大缩小
this.mapTD = mapTD;

这样可以直接使用了,这里也有一点需要注意的地方,官方的天地图使用的是wgs84坐标系,如果点位是其他坐标系的话需要自己转之后在使用,后面的打点图层都一样

天地图图层添加(这里以卫星图为例)

  • 初始化图层
let imageURL = "http://t0.tianditu.gov.cn/img_w/wmts?" +
       "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles" +
       "&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=您的密钥";
//创建自定义图层对象
let lay = new T.TileLayer(imageURL, {minZoom: 10, maxZoom: 18});

天地图图层 可以在这个里面选择自己需要的图层

  • 添加图层
 this.mapTD.addLayer(lay);
  • 移除图层
let layer = this.mapTD.getLayers() // 获取当前地图覆盖物
this.mapTD.removeLayer(layer[1])  //删除想要的

this.mapTD.clearLayers() // 清除所有的覆盖物

天地图聚合打点

设置聚合点基础图标

let icon = new T.Icon({
   iconUrl: require(`自己的点位图标`),
   id: 'test',   // 类型id
   iconSize: new T.Point(27, 36), // 图标大小
   iconAnchor: new T.Point(0, 0)  // 位移量
})
let marker = new T.Marker(
	new T.LngLat(xy[0], xy[1]),
	{ icon:icon })
this.markerObject = []  // 初始化聚合点集合数组
marker.clusterData = clusterData // 这里可以像这样给点位添加自定义属性

clusterData 可以为任意形式

// 添加点击事件
marker.addEventListener("click", (e) => {
  console.log(e, e.target.clusterData); // 可以从这里取出自定义的属性
  this.mapTD.panTo(new T.LngLat(e.lnglat.lng,e.lnglat.lat), zoom) // 移动中心点方法
});
this.markerObject.push(marker)
this.clustererObject = new T.MarkerClusterer(this.mapTD, { markers: that.markerObject }) 
// 将聚合点集合用变量存起来,删除的时候会用得到

因为聚合点和基础的点位不太一样,所以删除的时候地图的删除覆盖物方法不生效,必须使用聚合点自己的删除方法。

// 设置聚合图标的最大层级,也就是说当到达18级时,所有聚合的点会全部
this.clustererObject.setMaxZoom(18)
this.clustererObject.setStyles([     //这个可以自定义不同数量的点位聚合时显示的样式
  {
    url: require("../../../assets/daishan/zhongdian3.png"), // 聚合的图标
    size: [36, 36], //聚合的图标大小
    offset: new T.Point(-16, -16), //显示图片的偏移量
    // textColor: '#fff', //显示数字的颜色
    // textSize: 10,//显示文字的大小
    range: [0, 10],
  },
  {
    url: require("../../../assets/daishan/zhongdian2.png"), // 聚合的图标
    size: [36, 36], //聚合的图标大小
    offset: new T.Point(-16, -16), //显示图片的偏移量
    range: [11, 400],
  },
  {
    url: require("../../../assets/daishan/zhongdian1.png"), // 聚合的图标
    size: [48, 48], //聚合的图标大小
    offset: new T.Point(-18, -18), //显示图片的偏移量
    range: [400, 80000],
  },
])

删除聚合点

if(this.clustererObject){
	  this.clustererObject.clearMarkers(this.markerObject);
	  this.clustererObject = null
}
// 这里删除聚合点只能用clearMarkers()方法才能够删除

添加自定义弹窗

<div ref="populationInfoWindowRef" ></div> 
<!--  这里的弹窗样式可以自己自定义,定义ref  -->
let sContent = this.$refs.populationInfoWindowRef.$el  //这里使用ref取到盒子对象原型
let infoWin = new T.InfoWindow(sContent,{offset: new T.Point(-100, 480)});
this.mapTD.openInfoWindow(infoWin,new T.LngLat(e.lnglat.lng, e.lnglat.lat))
//e.lnglat.lng, e.lnglat.lat就是点击后传来的参数

这样就可以打开点击弹窗了

天地图添加网格

天地图的添加网格就是添加图层,但是设置和图层有一点区别,

let points = [] // 网格数据集合,之能有一层,

// 循环点位 例如这样
points.push(new T.LngLat(116.315000,39.964750));
points.push(new T.LngLat(116.303330,39.960810));
points.push(new T.LngLat(116.306760,39.866270));
points.push(new T.LngLat(116.328740,39.847560));

this.Polygons = new T.Polygon(points,{
	  fillColor: "#fff", // 多边形填充颜色
	  weight: 1, // 线条宽度,默认为 1
	  color: "#8B1A1A", // 线条颜色
	  fillOpacity: 0.2, //多边形透明度
});
// 如果是带洞的多边形,则如下
let points = [] // 网格数据集合,之能有一层,
let points1 = [] // 网格数据集合,之能有一层,
this.mapTD.addOverLay(this.Polygons);


this.Polygons = new T.Polygon(points,{
	  fillColor: "#fff", // 多边形填充颜色
	  weight: 1, // 线条宽度,默认为 1
	  color: "#8B1A1A", // 线条颜色
	  fillOpacity: 0.2, //多边形透明度
});
// 如果是带洞的多边形,则如下
let points = [] // 网格数据集合,之能有一层,

// 循环点位 例如这样
points.push(new T.LngLat(116.315000,39.964750));
points.push(new T.LngLat(116.303330,39.960810));
points.push(new T.LngLat(116.306760,39.866270));
points.push(new T.LngLat(116.328740,39.847560));
points.push(new T.LngLat(116.366500,39.855730));
points.push(new T.LngLat(116.442380,39.856520));
points.push(new T.LngLat(116.455080,39.865480));
points.push(new T.LngLat(116.456110,39.950020));
points.push(new T.LngLat(116.428990,39.967390));
let points1 = [] 

points1.push(new T.LngLat(116.349330,39.941590));
points1.push(new T.LngLat(116.350620,39.900650));
points1.push(new T.LngLat(116.353110,39.898670));
points1.push(new T.LngLat(116.413880,39.899990));
points1.push(new T.LngLat(116.418340,39.903150));
points1.push(new T.LngLat(116.429330,39.903940));
points1.push(new T.LngLat(116.427270,39.947910));
points1.push(new T.LngLat(116.365810,39.946600));


this.Polygons = new T.Polygon([points,points1],{
	  fillColor: "#fff", // 多边形填充颜色
	  weight: 1, // 线条宽度,默认为 1
	  color: "#8B1A1A", // 线条颜色
	  fillOpacity: 0.2, //多边形透明度
});
this.mapTD.addOverLay(this.Polygons);

这样网格就添加完成,清除网格和清除图层一样

this.mapTD.clearOverLays(this.Polygons)

结语

这就是我项目中使用到天地图的使用分享和总结,还有很多的方法及参数我都没有写出来,如果有需要用到的可以自己去官网找找对应的方法及属性。官方的网站还有示例代码,可以借鉴参考。感兴趣的小伙伴可以评论分享,有不清楚的可以直接评论区发言或者私信我,如果看到会及时回复,如果有内容写的不对可以直接指出来,共同进步。

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

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

相关文章

关于将tomcat卸载干净

这学期我们开始学习Java Web技术&#xff0c;要求安装tomcat&#xff0c;我到官网上下载的时候不小心下载了最新的测试版&#xff0c;但是安装的eclipse无法配置最新班的tomcat&#xff0c;就开启了我的下载、卸载之旅&#x1f62d;&#x1f62d; 在此之前也有在网上找了很多相…

小程序怎么自定义导航栏,导航栏放图片、设置高度

今天来说一下小程序的自定义导航栏。 1、设置导航栏style为custom&#xff1a; 2、这是刷新页面&#xff0c;页面的内容就跑到了页面的顶端&#xff0c;不留丝毫间隙&#xff1a; 3、然后定义一个components&#xff0c;就是我们自定义的导航栏组件&#xff1a; &#xff…

Vue3 + Element Plus 按需引入 - 自动导入

文章目录1 前言1.1 目的1.2 最终效果2 准备工作3 按需引入3.1 安装插件3.2 修改 vite.config.ts 文件4 其他4.1 ElMessageBox 使用时报错4.1.1 Eslint 报错&#xff1a; ElMessageBox is not defined.eslint(no-undef)4.1.2 TS 报错&#xff1a; Cannot find name ElMessageBox…

html设置背景颜色以及背景图片

背景颜色 backgroud-color:transparent color transparent : 背景色透明 color : 指定背景颜色 直接设置标签的style属性&#xff08;行内样式&#xff09; 例&#xff1a;将这个段落的背景设为红色 用选择器进行设置&#xff08;内嵌样式、外链样式&#xff0…

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…

3 分钟掌握 Node.js 版本的区别

在我们日常开发中&#xff0c;Node.js 使用场景越来越多&#xff0c;大到服务端项目&#xff0c;小到开发工具脚本&#xff0c;所以掌握 Node.js 一些基础知识是非常有必要的。 今天主要聊一下 Node.js 中 LTS 和 Current 的区别和如何选择合适的版本。 一、版本介绍 在官网上…

vue使用jsMind(思维导图)

前言 jsMind 是一个显示/编辑思维导图的纯 javascript 类库&#xff0c;其基于 html5 的 canvas 进行设计。 我们使用它可能需要在网页上单纯的使用这种图样的效果&#xff0c;而其他交互却是自定义的&#xff0c;我这边选择的是jsMind 与 网上的一个jsmind.menu.js&#xff…

Node.js 全网最详细教程 (第一章:Node学习入门必看教程)

1&#xff1a;Node的学前必知&#xff1a; 1: 在学习node之前&#xff0c;想必你应该学习过HTML&#xff0c;CSS&#xff0c;JavaScript 2: 浏览器中的JavaScript由两部分组成&#xff1a;JS核心语法和WebAPI JS核心语法WebAPI变量&#xff0c;数据类型DOM操作循环&#xff0…

Nginx静态资源部署

目录 Nginx静态资源概述 Nginx静态资源的配置指令 listen指令 server_name指令 location指令 设置请求资源的目录root / alias index指令 error_page指令 静态资源优化配置语法 Nginx静态资源压缩实战 Gzip模块配置指令 Gzip压缩功能的实例配置 Gzip和sendfil…

geoserver发布地图服务

geoserver发布地图服务发布wmts服务发布样式发布映像服务发布要素服务发布wmts服务 新建工作空间 保存后点击工作区 将shp文件上传到服务器 发布geoserver 服务 选择数据存储-》添加新的数据存储 这时可以选择两种方式 一种是直接将整个shp文件导入&#xff0c;一种是一…

【TS】object类型

object是一个对象&#xff0c;在ts中定义对象类型的语法为&#xff1a;let 变量名 &#xff1a;object { } 在object类型中&#xff0c;对象内部定义的值是不受类型约束的&#xff0c;只要是一个object类型即可&#xff0c;例如&#xff1a; let obj : object {name : 艺术概…

HTML <span>标签

HTML 中的<span>标签被视为内联元素。它类似于 div 标记&#xff0c;但 div 标记特意用于块级元素&#xff0c;而 span 用于内联元素。它主要用于用户想要将内联元素分组到其代码结构中。HTML 中的 Span 标记用于通过使用元素类或 id 属性为特定内容提供样式。使用 HTML …

element-ui table使用type=‘selection‘复选框全禁用-全选禁用

目录 问题总结&#xff1a; 当条件数据全被禁用时&#xff0c;全选按钮也变成禁用的状态&#xff0c;而不是隐藏。有会做的小伙伴希望跟帖。谢谢&#xff01; 复选框框架&#xff1a;通过调用selectable方法&#xff0c;进行禁用复选框。 1.指定行禁用&#xff1a; 2.条件禁用&…

在Tomcat中部署web项目出现http状态-404 -未找到详细解决方案

问题描述&#xff1a; 当我们向tomcat服务器发起请求时&#xff0c;出现如下的错误状态提示–404.这个问题在开发过程中可能会经常遇到&#xff0c;所以做一个归纳总结&#xff1a; 以下的内容适用于IDEA&#xff0c;使用其他编辑器的小伙伴们需要注意区别。 情景① –> …

overflow:auto的用法和实现弹性盒横向滚动

1. 前言引入&#xff1a; overflow&#xff1a;auto含义是&#xff1a;如果高度撑开了原有设定的高度&#xff0c;那么可以添加这个属性&#xff0c;让它出现滚动条滚动显示。 举例说明&#xff1a; 我们做一个京东移动端&#xff0c;以iphone-XE分辨率为准的例子&#xff…

NavMenu导航菜单el-submenu点击事件及激活状态变化

记录多级菜单时&#xff0c;NavMenu导航菜单的一级菜单点击事件以及当前激活状态变化 原因&#xff1a; 由于项目的需求变化&#xff0c;原本是点击二级子菜单才发生跳转&#xff0c;点击子菜单后&#xff0c;el-menu组件也会执行select的方法&#xff0c;导航栏的菜单也会对应…

vue全局引入scss样式文件

在vue中全局引入非功能性的scss样式文件很简单&#xff0c;只需要在main.js文件中引入对应文件就行 import { createApp } from vue import App from ./App.vue import router from ./router import store from ./store // 全局引入样式文件 import /assets/scss/index.scss cr…

Vue3点击侧边导航栏完成切换页面内组件(WEB)

Vue3点击侧边导航栏完成切换页面组件 目录效果思路过程获取当前点击DOM并添加点击class将其它的导航未点击项isclick样式类去除完整代码导航代码显示页面代码路由设置感谢效果 点击左侧导航&#xff0c;右面页面切换。 思路 使用router-view显示点击后需要切换的组件&#xf…

uniapp 改写uni-data-picker级联选择器(带搜索和多选)新增列出选择和删除功能

效果演示 注意&#xff1a;视频中的数据是模拟数据&#xff0c;请自行定义数据才可使用&#xff0c;数据格式末尾有例子 uniapp 改写uni-data-pickeruni-data-picker.vue更改 <template><view class"uni-data-tree"><view class"uni-data-tree…

【微信小程序】自定义组件(一)

&#x1f381;写在前面&#xff1a; 观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;小程序系列文章又更新了呀。 今天牛牛带来的是微信小程序的自定义组件入门知识&#xff0c;赶紧拿起小本本做笔记呀&#xff01; 文章目录一&#xff0c;创建和引用1.1 …