天地图专题二:在天地图上循环显示标注点以及悬停显示信息窗口

2023-11-09

上一文章讲了如何加载天地图。其实是很简单的,只要看一下天地图官方的代码示例就能搞出来。 只是为了保持文章系列的完整性,所以才写了出来。

官方api:http://api.tianditu.com/api-new/webIndex.html。


这一文章讲如何在天地图上标注一些点出来。 并且给这些点绑定点击事件。  直接看官方示例代码你可能很容易的就可以给一个点添加点击事件或鼠标移动上去的事件。但是给多个点添加事件,你可能就会有点理不清了。 


本文主要讲:

1.根据数据在天地图上用不同的图标循环添加标注点。

2.循环给标注点添加事件。我们这里添加的事件是鼠标移动到标注点上,悬停0.5秒钟,浮出信息窗口显示此标注点的详细信息。 鼠标移出标注点,信息窗口消失。

3.在标注点下显示出标注点的名字。


步骤:


1.按上一章的方法加载天地图。

<script type="text/javascript">
var cenL="113.3893";  //默认中心坐标经度
var cenB="23.04954"; //默认中心坐标纬度
var zoom=10; //默认缩放级别
    function LoadMap(){//加载基本地图和导航
    	try {
                              map = new TMap("mapDiv"); //初始化地图对象
                              if (zoom == 1) {  // 如果级别是1的话,就显示整张地图了。
                              	cenB = 0;
                              	cenL = 0;
                              }
                             map.centerAndZoom(new TLngLat(cenL, cenB), zoom);//设置显示地图的中心点和级别
                             map.enableHandleMouseScroll(); //允许鼠标双击放大地图   
                         } catch(err) {
                         	alert('天地图加载不成功,请稍候再试!你可以先使用其他功能!');
                         }
                     }
                 </script>

2.准备好页面需要的数据。实际应用中可能是用ajax获取过来。我们这里直接js定义好数组。

		var lnglats = [
		{"B":"23.1","L":"113.3","PName":"1111","Status":1},
		{"B":"23.2","L":"113.4","PName":"2222","Status":1},
		{"B":"22.9","L":"113.1","PName":"3333","Status":0},
		{"B":"23.7","L":"113.8","PName":"第四个点","Status":1},
		{"B":"23.8","L":"113.5","PName":"第五个点","Status":1},
		{"B":"23.3","L":"113.2","PName":"第六个点","Status":1},
		{"B":"23.1","L":"113.7","PName":"7777","Status":1},
		{"B":"23.5","L":"113.3","PName":"8888","Status":1}];
		//这是页面需要的数据。实际应用中常用ajax获取。坐标点状态。点的类型。点的名字。

3.添加标注点。这里使用了两种图标来表示在线和不在线的状态。我们在添加的过程中同时给每个标注点添加鼠标经过时候的事件。

我们要求是悬停0.5秒标注点才会有反应。而不是一经过标注点就会有反应。

处理办法是给标注点添加一个 鼠标滑过的事件mouseover。在这个mouseover中定义一个定时器 timer。 然后这个timer调用      function mover() { onMouseOver(m);} 来显示信息窗口。再给标注点添加 鼠标移出的事件mouseout。 调用onClose函数clear掉这个timer。或者关闭显示的信息窗口。 


详情看注释。添加标注点代码。以及循环添加标点和覆盖物事件。

		//绘制多个marker。
		function drawTMakers(lnglats){
			markers.length = 0;
			if (lnglats.length != 0) {
				var     iconurl ='images/pointOnline.jpg';
				var     iconurl1 = 'images/pointOffline.jpg';
		       icon = new TIcon(iconurl, new TSize(20, 20), {anchor: new TPixel(12, 12)});//两种图标,根据status判断用哪一种。
		       icon1 = new TIcon(iconurl1, new TSize(20, 20), {anchor: new TPixel(12, 12)});

		       for (var i = 0; i < lnglats.length; i = i + 1) {
		       	if (lnglats[i].Status == 1) {
		       		markers[i]  = drawTMaker(lnglats[i],icon);
		       	} else {
		       		markers[i]  = drawTMaker(lnglats[i],icon1);
		       	}
		       	markers[i].id=i;
		       }
		   }
		}

		//往地图上添加一个marker。传入参数坐标信息lnglat。传入参数图标信息。
		function drawTMaker(lnglat,icon){
			var marker =  new TMarker(new TLngLat(lnglat.L, lnglat.B), {icon: icon});
			map.addOverLay(marker);
			return marker;
		}



		//加载mouseover与mouseout事件。 
		//iconMakers是已添加的标注对象。
		//lnglats是每个点的数据对象。通常iconMakers的length等于lnglats的length。
		//eventFn是传入 鼠标移动上去要调用哪个函数。默认是onMouseOver。主要是用于鼠标移动到点上可以显示出不同样式的窗口。
		function addTEvent(iconMakers,lnglats,eventFn){
			var arrLen = lnglats.length;
			var i,eventFn = eventFn || onMouseOver;
			for (var i = 0;  i<arrLen; i++) {
				iconMakers[i].id=i;
				// 绑定事件
				(function() {
					var m = iconMakers[i];
					TEvent.addListener(m, "mouseover",function() {
			               timer = setTimeout(mover, 500);//setTimeout不能带参数,所以用下面的方法处理。
			               function mover() {
			               	eventFn(m);
			               }
			           });
					TEvent.addListener(m, "mouseout", onClose);
				})();
			}
		}


鼠标移动到标注点上悬停0.5秒之后的处理函数。 实际就是显示一个信息窗口。 要特别注意的是窗口的位置。要显示在合适的位置上去。是需要根据实际做一些微调的。而且我这里还配合了css。 可以参考官方的类参考。

            //鼠标移动到移动站上面的时候执行
            function onMouseOver(m) {
            	var html = [];
              	var status ='';
            	status = lnglats[m.id].Status == 1?'在线':'不在线';
            	html.push("	<div class='opt_station_hover' id='device_online'>");
            	html.push("		<ul class='opt_station_hover_ul'>");
            	html.push("			<li><span class='opt_li_left'>名称:</span>"+lnglats[m.id].PName +"</li>");
            	html.push("			<li><span class='opt_li_left'>在线状态:</span>"+status +"</li>");
            	html.push("			<img src='../images/arrow.png'>");
            	html.push("		</ul>");
            	html.push("	</div>");
            	var config = {
            		offset:new TPixel(3,-60),
            		position:m.getLngLat()
            	};
            	customerWinInfo=new TLabel(config);
            	customerWinInfo.setTitle('');
            	customerWinInfo.setLabel(html.join(''));
            	customerWinInfo.setAnchorPer([0.5,0]);//偏移量
            	customerWinInfo.getObject().style.zIndex = 10000;
            	map.addOverLay(customerWinInfo);
            	$('.opt_station_hover').parent().css({
            		"border":"none",
            		"padding":"0",
            		"background-color":""
            	});
            }


css:

<style type="text/css">
	.opt_station_hover{
		background: rgb(77,103,130);
		font-size: 12px;
		width: 150px;
		height: 47px;
		border-radius: 5px;
	}
	.opt_station_hover_ul{
		list-style: none;
		margin: 0;
		padding: 0;
		line-height: 23px;
		text-indent: 4px;
		color: white;
		position: relative;
	}
	.opt_station_hover_ul li{
		list-style: none;
		margin: 0;
		padding: 0;
		overflow: hidden;
		height: 23px;
	}
	.opt_station_hover img{
		position: absolute;
		left: 50%;
		margin-left: -5px;
	}
	.opt_li_left{
		width: 65px;
		display: bolck;
		float: left;
		text-align: right;
	}

</style>


鼠标移开标注点时的处理:

      	//鼠标从图标移动出去的时候执行
      	function onClose() {
      		clearTimeout(timer);//关闭定时器。
      		map.removeOverLay(customerWinInfo);//移除信息窗口。
      	}


4.在标注点下显示出标注点的名字。跟上面显示信息窗口的类似。

      	var label =[];
	//把标注点名字画到地图上
	function loadText(){
		if (lnglats.length != 0) {
			for (var i = 0; i < lnglats.length; i = i + 1) {
				var config = {
					text:lnglats[i].PName,
					offset:new TPixel(0,10),
					position:new TLngLat(lnglats[i].L,lnglats[i].B)
				};
	        			label[i]=new TLabel(config);//创建地图文本对象
	        			label[i].setAnchorPer([0.5,0]);//偏移量
	        			label[i].setBorderLine (0);
	        			map.addOverLay(label[i]);
	        			$('.stationByNum').parent().css({
	        				"padding":"0"
	        			});
	        		}
	        	}
	        }


5.依次调用            loadMap(); loadIcon(); loadText();  请一定要在页面加载完毕之后再调用。


本文效果图:



ok,到这里已基本实现本文的要求。然而我们发现我们的点并没有全部显示在我们的地图范围内,这是怎么回事呢?

因为们加载地图的时候只是给了它一个默认的缩放级别跟中心点。

所以图上甚至可能一个标注也看不到,必须要我们拖动天地图,才能把我们的标注点显示出来。


因此,我们如何根据我们的标注点的位置来控制初始的天地图中心点和缩放级别呢? 且听下回分解!

演示地址:http://runningls.com/demos/tianditu/index.html?to=loadicon

项目下载地址:https://github.com/liusaint/tiandituMap

更多的内容请关注本系列后续文章。转载请注明出处。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

天地图专题二:在天地图上循环显示标注点以及悬停显示信息窗口 的相关文章

  • 如何通过aws-sdk(javascript或node)获取s3存储桶大小

    我尝试使用 javascript nodejs aws sdk 查找 获取 s3 存储桶信息 但没有找到这样的 api 如何通过 aws sdk javascript 或 node api 获取 s3 存储桶大小 信息 每天一次向 Clou
  • 使用 npm 作为构建工具连接文件

    我最近发现我可以使用 npm 作为任务运行程序 而不是 gulp 或 grunt 到目前为止 一切都很棒 lint stylus jade uglify watch 等 但串联部分 我似乎无法实现 gulp 是这样的 gulp task s
  • 使用 jQuery / .data() 避免内存泄漏

    我正在使用 jQuery 动态创建 HTML 元素 现在需要针对它们存储 JavaScript 数据 但是 我现在担心内存泄漏 因为我实际上从未在对象上调用 删除 我 append 和 detach 它们 但从不 remove jQuery
  • 如果浏览器在 asp .net 中关闭,请从浏览器中注销?

    我的要求有点复杂 用户正在使用 Web 浏览器访问数据库 而在访问数据库时 如果用户关闭活动页面而不是注销会话 该会话需要自动注销 有人可以指导我如何做这个吗 我在母版页中使用了jquery onbeforeunload 我收到消息离开页面
  • Streamjs和linqjs有什么关系

    读完SICP后 我最近发现streamjs https github com dionyziz stream js 开发商参考linqjs http linqjs codeplex com 作为具有不同语法的替代实现 但我无法建立连接 St
  • 夜间值班。单击带有文本的元素

    我遇到问题 无法单击具有某些独特文本的网页元素 我有这样的结构 div class wg wagon type title Text div 我试试这个 click wg wagon type title contains Text 但我有
  • 如何为 HTML5 音频元素制作加载栏?

    我正在尝试为 HTML5 音频元素制作一个加载栏 显示加载 缓冲的百分比 对于视频标签 可以使用以下方法进行计算 video buffered end 0 video duration 但我无法让它与音频标签一起使用 它只是返回一个固定值
  • React/Redux bundle.js 太大

    我有一个小型的 React 项目 Webpack生成的bundle js大小为6 3Mb 如何将大小减小到 github webpack config js module exports devtool inline source map
  • 如何在一段特定时间后在后台运行 ajax 调用? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在一段特定的时间后显示警报消息 您想继续吗 如果用户同意 则 ajax 调用必须在后台运行 否则取消 ajax 调用 那么请告诉我
  • 更新 Google 地图流量层而无需重新加载页面

    我的页面中嵌入了 Google 地图 我使用 initMap js 函数来初始化地图 function initMap var map new google maps Map document getElementById t map zo
  • 删除 Laravel Mix 中的临时文件

    我想在 laravel mix 构建期间或之后删除临时构建文件 这是我目前拥有的一些代码 但是del不工作 const mix require laravel mix const del require del compile sass i
  • JavaScript:预期的赋值或函数调用,却看到了一个表达式

    我正在使用 JSHint 来确保我的 JavaScript 是 严格的 但我收到以下错误 预期是赋值或函数调用 但看到的是表达式 关于以下代码 var str A B C D var data var strArr str split fo
  • 无法在渲染器进程中使用 Node.js API

    无法在 Electron 中使用任何与 Electron 或节点相关的操作 未定义获取错误过程 我检查了他们指导添加节点支持的各个地方 但这已经完成了 所以卡在这里 我的主要应用程序代码是 const electron require el
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • JavaScript 访问密码字段值是否被视为存在安全风险?

    如果安全 正确地存储密码是良好的风格和安全性 那么对于要求用户输入密码的网页来说不应该也是如此吗 考虑这个例子
  • Javascript:更改输入值时设置光标位置

    当您输入公式时 我试图在我的应用程序中重现类似于 Microsoft Excel Google Sheets 的用户体验 并且您可以使用不同的公式和变量来自动完成下拉菜单 为此 在验证自动完成功能后 我希望能够控制光标的位置 例如 如果我输
  • JavaScript 中最长的通用前缀

    我正在尝试解决 Leet Code 挑战14 最长公共前缀 https leetcode com problems longest common prefix 编写一个函数来查找字符串数组中最长的公共前缀字符串 如果没有公共前缀 则返回空字
  • 数字和小数的输入掩码

    在测试我的程序后 我发现了以下错误 我在 sqlserver 中的表包含 价格数字 6 2 我的程序的用户输入价格 555 00 就很好了 但是当他输入 555555 时 这是错误的 所以我需要指定掩码 其中尾数是可选的 0 到 999 小
  • 跨浏览器:禁用输入字段的不同行为(文本可以/不能复制)

    我有一个被禁用的输入 html 字段 在某些浏览器 Chrome Edge Internet Explorer 和 Opera 中可以选择并复制文本 但至少在 Firefox 中这是不可能的 您可以通过在不同浏览器中执行以下代码来测试
  • 使用 JavaScript onclick 添加表格行

    我正在尝试使用 javascript 添加下面找到的完全相同的元素 我已经尝试了这里找到的所有解决方案 我什至尝试用php echo但没有运气 无需更改任何输入名称或类似内容 只需单击该按钮即可向表中添加另一行 仅此而已 这是该元素 tr

随机推荐

  • 七天LLVM零基础入门(Linux版本)------第四天

    作者 snsn1984 第一步 复习 第三天的时候 我们学习了LLVM的编程指引 在开始第四天的学习之前 需要复习之前学习过的两篇文档 LLVM IR的文档 http llvm org docs LangRef html 编程指引文档 ht
  • 使用spyder3调试python程序的简明教程

    说是简明教程 其实是我自己尝试用spyder调试python程序的过程的一个记录 因为spyder的调试功能是基于pdb 而我又没有pdb的基础 所以刚开始上手时感觉很不习惯 而且那时我又很懒 没去找官方文档 仅仅在百度和csdn上找了找
  • 腾讯云被ddos攻击解决方案

    腾讯云是国内仅此次阿里云的云服务商 很多创业者都使用他们家云服务器 自然被DDOS攻击的也不少 今天来介绍下使用腾讯云服务器被DDOS攻击的解决办法 一 购买腾讯高防IP 也称腾讯大禹BGP高防IP 是一个运行在腾讯云内网的高防IP服务 适
  • nginx (1):ubuntu下安装启动nginx

    1 安装依赖 sudo apt get install gcc zlib1g dev libpcre3 libpcre3 dev libssl dev 2 下载nginx wget https nginx org download ngin
  • 【vue 页面下滚到目标元素的位置,目标元素自动吸顶(自动悬浮吸附到页面顶部)】

    vue 页面下滚到目标元素的位置 目标元素自动吸顶 自动悬浮吸附到页面顶部 原文链接 https blog csdn net weixin 41192489 article details 112320596 1 监听页面滚动事件 监听页面
  • xxl-job(2.4.1)使用spring-mvc替换netty的功能

    xxl job 2 4 1 使用spring mvc替换netty的功能 1 xxl job core引入spring mvc的依赖
  • APP自动化测试-11.webview技术原理

    APP自动化测试 11 webview技术原理 文章目录 APP自动化测试 11 webview技术原理 前言 一 获取webview 二 根据webview启动chromedriver 总结 前言 根据日志 简单记录webview运行的机
  • Caffe 源码阅读笔记 [基本模块] Syncedmem & Blob

    syncedmem syncedmem管理一段大小为size的内存 这段内存可以从GPU或者主机内存分配 syncedmem负责GPU和主机内存之间的同步 如果数据是在GPU里而要从主机内存取出 syncedmem会先把数据从GPU内存me
  • 服务器怎么设置无线网络共享,无线路由器怎么设置usb网络共享管理

    众所周知 路由器长久以来一直是计算机网络的核心设备 其重要性不可低估 那么你知道无线路由器怎么设置usb网络共享管理吗 下面是学习啦小编整理的一些关于无线路由器设置usb网络共享管理的相关资料 供你参考 无线路由器设置usb网络共享管理的方
  • 实现一个简单的二叉树

    实现一个简单的二叉树 语言 Objective C 整体上还是挺简单的 所以就直接上代码了 1 二叉树 由 节点 和 枝干 组成 且每个节点最多只有两个子节点的树形数据结构 2 代码实现 2 1 节点类 创建一个简单的节点类 这个类可以保存
  • Chatopera王海良:大厂螺丝钉还是开源极客?年轻技术人如何选择?

    他因为追求创新毅然放弃了大厂稳定的工作 参与开源并成立了开源商业公司 他相信 开源可以极大地助力开发者成长 那么 对于年轻开发者而言 如何通过参与开源实现跳跃式发展 本期 开源访谈录 邀请到了Chatopera CEO王海良来分享他的见解
  • 手把手教会你用Python爬虫爬取网页数据!!

    其实在当今社会 网络上充斥着大量有用的数据 我们只需要耐心的观察 再加上一些技术手段 就可以获取到大量的有价值数据 这里的 技术手段 就是网络爬虫 今天就给大家分享一篇爬虫基础知识和入门教程 什么是爬虫 爬虫就是自动获取网页内容的程序 例如
  • IAR编译错误

    1 错误提示 Error e104 Failed to fit all segments into specified ranges Problem discovered in segment XDATA N Unable to place
  • Linux命令·cp

    cp命令用来复制文件或者目录 是Linux系统中最常用的命令之一 一般情况下 shell会设置一个别名 在命令行下复制文件时 如果目标文件已经存在 就会询问是否覆盖 不管你是否使用 i参数 但是如果是在shell脚本中执行cp时 没有 i参
  • 机器学习中最基本的概念之一:数据集、样本、特征和标签

    本文重点 数据集 样本 特征和标签是机器学习中的重要概念 这些概念在机器学习算法的设计和实现过程中起着至关重要的作用 在本文中 我们将对这些概念进行详细的讲解 以便更好地理解机器学习算法的基本原理和应用 一 数据集 数据集是机器学习中最基本
  • python3 requests https 请求 报 SSLContext 相关递归错误

    一 错误信息 2019 11 19 15 14 40 Provider before requests post 2019 11 19 15 14 41 error infoTraceback most recent call last F
  • iOS开发捷径学习(一)

    结合 iOS开发捷径学习 这本书 分几章系统梳理Interface Builder相关知识 整体现状 iOS界面的开发 主要是采用纯代码和Interface Builder来进行 苹果开发初期面临很少的可用内存 纯代码进行UI的绘制自己控制
  • wordpress开启子目录多站点模式并给子站绑定独立域名

    wordpress开启子目录多站点模式并 wordpress开启多站点模式 多站点模式即是使用一套wordpress程序就可以搭建多个独立 互不干扰的wordpress站点 各站点之间的用户 文章 附件等都互不干预 wordpress的多站
  • 论文阅读-DFN: Dynamic Filter Networks-动态卷积网络

    一 论文信息 论文名称 Dynamic Filter Networks 作者团队 NIPS2016 二 动机与创新 卷积层是通过将上一层的特征映射与一组过滤器进行卷积计算输出特征映射 滤波器是卷积层的唯一参数 通常用反向传播算法在训练中学习
  • 天地图专题二:在天地图上循环显示标注点以及悬停显示信息窗口

    上一文章讲了如何加载天地图 其实是很简单的 只要看一下天地图官方的代码示例就能搞出来 只是为了保持文章系列的完整性 所以才写了出来 官方api http api tianditu com api new webIndex html 这一文章