实现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>

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

相关推荐
万邦科技Lafite1 小时前
京东按图搜索京东商品(拍立淘) API (.jd.item_search_img)快速抓取数据
开发语言·前端·数据库·python·电商开放平台·京东开放平台
一只小透明啊啊啊啊3 小时前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet
你的人类朋友4 小时前
设计模式有哪几类?
前端·后端·设计模式
Yeats_Liao4 小时前
Go Web 编程快速入门 10 - 数据库集成与ORM:连接池、查询优化与事务管理
前端·数据库·后端·golang
啃火龙果的兔子5 小时前
前端八股文react篇
前端·react.js·前端框架
打小就很皮...5 小时前
React 实现 i18next 中英文切换集成
前端·react.js·i18next
拉不动的猪5 小时前
函数组件和异步组件
前端·javascript·面试
淮北4945 小时前
html + css +js
开发语言·前端·javascript·css·html
你的人类朋友5 小时前
适配器模式:适配就完事了bro!
前端·后端·设计模式
Setsuna_F_Seiei5 小时前
CocosCreator 游戏开发 - 利用 AssetsBundle 技术对小游戏包体积进行优化
前端·cocos creator·游戏开发