页面1、mapbox添加自定义图片marker标记点和气泡弹窗

实现功能:自定义mapbox地图标记点的图标样式,换成自己的图片,并在点击图片的时候,弹出自定义的气泡弹窗。

HTML源码在最后面哦,复制就能直接使用(accessToken要换成自己的才行哦)

效果图:

 【实现步骤】

1、新建HTML页面,引入mapbox-gl.css和mapbox-gl.js

        <link href="https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.css" rel="stylesheet">
        <script src="//i2.wp.com/api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.js"></script>

2、创建一个地图容器,用来放地图:

<div id="map"></div>

3、在js里创建一个地图:

mapboxgl.accessToken =  ''; //这里换成你自己的就行了
       
           //创建地图
            const map = new mapboxgl.Map({
                container: 'map',
                style: 'mapbox://styles/mapbox/streets-v12',
                center: [-0.1048690838691802, 51.52323567974473], //中心点,伦敦法灵顿
                zoom: 14
            });

4、根据定义的图标数组,在map的load方法里,遍历将标记点添加到地图上,并添加气泡弹窗:

map.on('load', () => {
                //添加自定义标记点
                for (const item of geojson) {
                    // 创建标记点
                    const el = document.createElement('img'); //这里可以是任意标签
                    el.className = 'marker';
                    el.src = item.icon; //图片路径赋值

                    //添加气泡弹窗
                    let mhtml = `<div class="malert">
                                    <h2 class="pti1">${item.title}</h2>
                                    <div class="pti2">${item.description}</div>
                                </div>`

                    let popup1 = new mapboxgl.Popup()
                        .setHTML(mhtml)

                    // 添加自定义标记点
                    new mapboxgl.Marker(el)
                        .setLngLat(item.coordinates)
                        .setPopup(popup1)
                        .addTo(map);
                }
            });

完整的代码如下,只需替换mapboxgl.accessToken就行:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>添加自定义图标标记点和气泡弹窗</title>
		<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
		<link href="https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.css" rel="stylesheet">
		<script src="//i2.wp.com/api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.js"></script>
		<style>
			body {
				margin: 0;
				padding: 0;
			}

			#map {
				position: fixed;
				top: 0;
				bottom: 0;
				width: 100%;
			}

			/* //标记点图标样式 */
			.marker {
				width: 80px;
				height: 80px;
				border-radius: 50%;
				overflow: hidden;
				box-shadow: 0 62px 20px -14px #434141;
				border: 4px solid #fff;
				object-fit: cover;
			}

			/* //气泡弹窗样式 */
			.mapboxgl-popup-content {
				width: 320px;
				background: #fff;
				padding: 8px 14px;
				border-radius: 10px;
				overflow: hidden;
			}

			.mapboxgl-popup-close-button {
				font-size: 36px;
				color: #607D8B;
				right: 8px;
				top: 5px;
				border: none;
				outline: none;
			}

			.malert .pti1 {
				font-size: 22px;
				color: #872202;
				padding: 10px;
				margin: 0;
				line-height: 1.4;
			}

			.malert .pti2 {
				font-size: 16px;
				color: #607d8b;
				border-top: 1px solid #c8cacb;
				line-height: 1.8;
				padding: 14px;
			}
		</style>
	</head>
	<body>
		<div id="map"></div>
		<script>
			mapboxgl.accessToken = 'pk.eyJ'; //这里换成你自己的就行了
			
			//创建地图
			const map = new mapboxgl.Map({
				container: 'map',
				style: 'mapbox://styles/mapbox/streets-v12',
				center: [-0.1048690838691802, 51.52323567974473], //中心点,伦敦法灵顿
				zoom: 14
			});

			//图标列表
			const geojson = [{
					'title': '伦敦城市大学',
					'description': '伦敦城市大学(London Metropolitan University)英文缩写London Met,是位于英国伦敦的一所公立综合性研究型大学。2002年,北伦敦大学和伦敦吉尔德霍尔大学合并,并决定使用伦敦城市大学的校名',
					'icon': 'https://img0.baidu.com/it/u=771061597,13977956&fm=253&fmt=auto&app=138&f=JPEG?w=220&h=110',
					'coordinates': [-0.10233707867577552, 51.528522330585105]
				},
				{
					'title': '圣保罗座堂',
					'description': "印度加尔各答圣保罗座堂(St. Paul's Cathedral)位于印度加尔各答的“attractions岛” - 毗邻维多利亚纪念堂、Nandan - Rabindra Sadan theatre complex和比尔拉天文馆。",
					'icon': 'https://img0.baidu.com/it/u=3210667812,3480027929&fm=253&fmt=auto&app=138&f=JPEG?w=133&h=200',
					'coordinates': [-0.09834595184549354, 51.514663593070466]
				},
				{
					'title': 'VFS Global Indian Visa & Consular Application Centre',
					'description': 'VFS全球印度签证及领事申请中心',
					'icon': 'https://img1.baidu.com/it/u=723280391,1176186315&fm=253&fmt=auto&app=138&f=JPEG?w=107&h=160',
					'coordinates': [-0.09937592005975986, 51.52577228073925]
				}, {
					'title': '大英博物馆',
					'description': '大英博物馆(The British Museum),又名不列颠博物馆,位于英国伦敦新牛津大街北面的罗素广场',
					'icon': 'https://img2.baidu.com/it/u=2175595291,1462174978&fm=253&fmt=auto&app=138&f=JPEG?w=180&h=180',
					'coordinates': [-0.1269275705427139, 51.519817720155636]
				}
			];

			map.on('load', () => {
				//添加自定义标记点
				for (const item of geojson) {
					// 创建标记点
					const el = document.createElement('img'); //这里可以是任意标签
					el.className = 'marker';
					el.src = item.icon; //图片路径赋值

					//添加气泡弹窗
					let mhtml = `<div class="malert">
									<h2 class="pti1">${item.title}</h2>
									<div class="pti2">${item.description}</div>
								</div>`

					let popup1 = new mapboxgl.Popup()
						.setHTML(mhtml)

					// 添加自定义标记点
					new mapboxgl.Marker(el)
						.setLngLat(item.coordinates)
						.setPopup(popup1)
						.addTo(map);
				}
			});
		</script>

	</body>
</html>