实现uniapp天地图边界范围覆盖

前言:

在uniapp中,难免会遇到使用地图展示的功能,但是百度谷歌这些收费的显然对于大部分开源节流的开发者是不愿意接受的,所以天地图则是最佳选择。 此篇文章,详细的实现地图展示功能,并且可以自定义容器宽高,还可以定向的进行行政区边界颜色划分。你可以根据代码运行并进一步稍微改下行政区编码即可实现自己想要的效果。

代码效果如下图所示:

申请天地图key:

首先申请天地图key,它是免费的,但需要你申请。

申请地址: 天地图API

然后根据页面提示,自行完成【创建新应用】。即可以获取到自己需要的key,注意uniapp申请浏览器端。

然后就是编写代码,如下:

你可以放在 uni-app 项目根目录->hybrid->html 文件夹下或者直接放在 static 目录下。本文章默认放在static下,文件名skymap.html

示例代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<script src="http://api.tianditu.gov.cn/api?v=4.0&tk=天地图的key"></script>
		<style>
			body {
				margin: 0;
				padding: 0;
				overflow: hidden;
				height: 100vh;
				font-family: "Microsoft YaHei";
			}

			#viewDiv {
				width: 100%;
				height: 100%;
				position: absolute;
				top: 0;
				left: 0;
			}
		</style>
	</head>
	<body>
		<div id="viewDiv"></div>
		<script>
			function load() {
				// 初始化地图对象
				const map = new T.Map("viewDiv");
				map.centerAndZoom(new T.LngLat(116.40969, 39.89945), 12);
				map.enableScrollWheelZoom();

				// 添加地图类型控件
				const ctrl = new T.Control.MapType();
				map.addControl(ctrl);
				map.setMapType(window.TMAP_NORMAL_MAP);

				// 添加鹰眼控件
				const miniMap = new T.Control.OverviewMap({
					isOpen: false,
					size: new T.Point(150, 150)
				});
				map.addControl(miniMap);

				// 添加比例尺控件
				const scale = new T.Control.Scale();
				map.addControl(scale);

				addGeoBoundary(map);
			}

			function addGeoBoundary(map) {
				fetch('https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=520322')
					.then(response => response.json())
					.then(data => {
						const coordinates = data.features[0].geometry.coordinates;
						const centroid = data.features[0].properties.centroid;

						// 设置地图中心为该行政区域的质心
						map.centerAndZoom(new T.LngLat(centroid[0], centroid[1]), 8);

						coordinates.forEach(polygon => {
							polygon.forEach(boundary => {
								const boundaryPolygon = new T.Polygon(boundary.map(coord => new T.LngLat(
									coord[0], coord[1])), {
									color: "#7C7BF6",
									weight: 1,
									opacity: 0.7,
									fillColor: "#ABAAF3",
									fillOpacity: 0.1
								});

								boundaryPolygon.addEventListener("mouseover", () => {
									boundaryPolygon.setFillColor("#ABAAF3");
									boundaryPolygon.setFillOpacity(0.6);
								});

								boundaryPolygon.addEventListener("mouseout", () => {
									boundaryPolygon.setFillColor("#DCDBF0");
									boundaryPolygon.setFillOpacity(0.6);
								});

								map.addOverLay(boundaryPolygon);
							});
						});
					})
					.catch(error => console.error('Error fetching GeoJSON:', error));
			}

			load();
		</script>
	</body>
</html>

然后再你需要展示展示地图的页面引入以下代码:

javascript 复制代码
<uni-section title="地区分布" class="item map-container" type="line">
			<iframe src="/static/skymap.html" class="map-frame"></iframe>
		</uni-section>
		</uni-section>

样式代码:

你也可以自定义实现自己想要的效果:

html 复制代码
<style>
	.map-container {
		position: relative;
	}

	.map-frame {
		width: 100%;
		height: 500rpx;
		border: none;
	}
</style>

至此地图即可以正确展示了。如果感觉还不错,点个关注收藏吧。

相关推荐
上官熊猫19 分钟前
nuxt3项目打包部署到服务器后配置端口号和开启https
前端·vue3·nuxt3
dal118网工任子仪2 小时前
61,【1】BUUCTF WEB BUU XSS COURSE 11
前端·数据库·xss
约定Da于配置4 小时前
uniapp封装websocket
前端·javascript·vue.js·websocket·网络协议·学习·uni-app
山楂树の4 小时前
xr-frame 模型摆放与手势控制,支持缩放旋转
前端·xr·图形渲染
大叔_爱编程4 小时前
wx030基于springboot+vue+uniapp的养老院系统小程序
vue.js·spring boot·小程序·uni-app·毕业设计·源码·课程设计
LBJ辉5 小时前
1. 小众但非常实用的 CSS 属性
前端·css
milk_yan5 小时前
Docker集成onlyoffice实现预览功能
前端·笔记·docker
m0_748255027 小时前
头歌答案--爬虫实战
java·前端·爬虫
noravinsc7 小时前
python md5加密
前端·javascript·python
ac-er88888 小时前
Yii框架优化Web应用程序性能
开发语言·前端·php