天地图三,地图视野随标记切换,文章末尾给出切换颜色和视野切换的完整代码。

该文章展示了如何使用天地图API创建多个标记点并在地图上进行切换,同时实现视野的动态变化。通过非阻塞异步调用来循环播放标记,每次切换删除上一个标记并更新当前选中的标记。此外,还包括自定义地图主题颜色和隐藏水印的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

天地图三,地图视野随标记切换,文章末尾给出切换颜色和视野切换的完整代码。

官方不支持标记点切换,这个地方稍微有点绕,下边是实现的步骤(以下实现是基于第一篇文章的基础):
1:先将所有的标记点进行一次初始化

		//绘制多个marker。
			function drawTMakers() {
				markers.length = 0;
				if (lnglats.length != 0) {
					var iconurl = 'images/pointOnline.jpg';
					var iconurl1 = 'images/pointOffline.jpg';
					//创建图片对象
					var icon = new T.Icon({
						iconUrl: "http://api.tianditu.gov.cn/img/map/markerA.png",
						iconSize: new T.Point(19, 27),
						iconAnchor: new T.Point(10, 25)
					});
					for (var i = 0; i < lnglats.length; i = i + 1) {
						markers[i] = drawTMaker(lnglats[i], icon);
					}
					//设置数组长度,参考头部定义的公共数据
					vLength = markers.length;
				}
			}


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

2:使用非阻塞式的异步调用并设置定时器进行标记切换,并记录上一次被切换点的位置,在执行下一次切换时删除上一次标记的marker,
updateMaker()是更改切换标记的marker,可以自定义添加跳动图标。

			//非阻塞循环轮播marker
			async function nonBlockingOperation() {
				return new Promise((resolve) => {
					clearTimeout()
					// 这里使用异步操作,例如异步请求等
					setTimeout(() => {
						console.log('非阻塞方法执行完成');
						if (count === vLength) {
							count = 0
						}
						if (oldi != -1) {
							//删除上次定为点的marker
							map.removeOverLay(oldMarker);
						}
						array = updateMaker(count)
						oldi = array[0]
						oldMarker = array[1]
						count += 1
						resolve();
					}, time);
				});
			}

			//设置变换坐标的时间长度
			setInterval(async () => {
				await nonBlockingOperation();
			}, time);

以下给出自定义地图主题颜色和视野切换的完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
		<meta name="keywords" content="天地图" />
		<title>天地图-地图API-范例-自定义标注图片</title>
		<script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=4.0&tk=你申请的浏览器端key">
			< script src = "libs/jquery.min.js" >
		</script>
		</script>
		<style type="text/css">
			body,
			html {
				width: 100%;
				height: 100%;
				margin: 0;
				font-family: "Microsoft YaHei"

			}

			#mapDiv {
				width: 100%;
				height: 100%;
			}
		</style>
		<script>
			var map; //地图对象
			var flag = true; //是否自定义地图主题色
			var mColor = '#0225B7' //地图主题颜色 
			var zoom = 10; //缩放级别
			var markers = []; //markers数组
			//标注点切换相关
			var count = 0 //初始化为0,用于记录循环次数,相当于for循环中的i
			var vLength //记录markers的长度
			var oldi = -1 //记录上次被设置点的下标
			var oldMarker; //记录上次跳动的marker对象
			var time = 3000 //毫秒计
			//坐标列表
			var lnglats = [{
					"B": "23.1",
					"L": "113.3",
					"PName": "1111"
				},
				{
					"B": "23.2",
					"L": "113.4",
					"PName": "2222"
				},
				{
					"B": "22.9",
					"L": "113.1",
					"PName": "3333"
				},
				{
					"B": "23.7",
					"L": "113.8",
					"PName": "第四个点"
				},
				{
					"B": "23.8",
					"L": "113.5",
					"PName": "第五个点"
				},
				{
					"B": "23.3",
					"L": "113.2",
					"PName": "第六个点"
				},
				{
					"B": "23.1",
					"L": "113.7",
					"PName": "7777"
				},
				{
					"B": "23.5",
					"L": "113.3",
					"PName": "8888"
				}
			];

			function onLoad() {
				//初始化地图对象
				map = new T.Map("mapDiv");
				//设置显示地图的中心点和级别
				map.centerAndZoom(new T.LngLat(113.3, 23.1), zoom);
				if (flag) {
					map.setStyle('indigo')
				}
			}


			function updateMaker(count) {
				//创建图片对象
				var icon1 = new T.Icon({
					iconUrl: "images/112.gif",
					iconSize: new T.Point(32, 32),
					iconAnchor: new T.Point(10, 25)
				});
				for (var i = 0; i < markers.length; i++) {
					if (count === i) {
						lnglat = lnglats[i]
						var markerNew = new T.Marker(new T.LngLat(lnglat.L, lnglat.B), {
							icon: icon1
						});
						//map.removeOverLay(markers[i]);
						map.addOverLay(markerNew);
						map.centerAndZoom(new T.LngLat(lnglat.L, lnglat.B), zoom);
						//map.removeOverLay(markerNew)
						return [i, markerNew]
					}
				}

			}


			//绘制多个marker。
			function drawTMakers() {
				markers.length = 0;
				if (lnglats.length != 0) {
					var iconurl = 'images/pointOnline.jpg';
					var iconurl1 = 'images/pointOffline.jpg';
					//创建图片对象
					var icon = new T.Icon({
						iconUrl: "http://api.tianditu.gov.cn/img/map/markerA.png",
						iconSize: new T.Point(19, 27),
						iconAnchor: new T.Point(10, 25)
					});
					for (var i = 0; i < lnglats.length; i = i + 1) {
						markers[i] = drawTMaker(lnglats[i], icon);
					}
					//设置数组长度,参考头部定义的公共数据
					vLength = markers.length;
				}
			}


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



			//初始化方法
			window.onload = function() {
				onLoad()
				drawTMakers()

				if (flag) {
					// 通过 id 获取元素
					//设置主题色
					let example = document.getElementById("mapDiv");
					example.style.backgroundColor = mColor;
				}
				//隐藏左下角天地图水印logo
				document.getElementsByClassName("tdt-control-copyright tdt-control")[0].style.display = 'none';
			}


			//非阻塞循环轮播marker
			async function nonBlockingOperation() {
				return new Promise((resolve) => {
					clearTimeout()
					// 这里使用异步操作,例如异步请求等
					setTimeout(() => {
						console.log('非阻塞方法执行完成');
						if (count === vLength) {
							count = 0
						}
						if (oldi != -1) {
							//删除上次定为点的marker
							map.removeOverLay(oldMarker);
						}
						array = updateMaker(count)
						oldi = array[0]
						oldMarker = array[1]
						count += 1
						resolve();
					}, time);
				});
			}

			//设置变换坐标的时间长度
			setInterval(async () => {
				await nonBlockingOperation();
			}, time);
		</script>


	</head>
	<body>
		<div id="mapDiv"></div>
		<p>本示例演示如何自定义标注图片。</p>
	</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈攻城狮s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值