前言
官网指引,生成accesstoken,下载相关依赖请翻阅[https://blog.csdn.net/weixin_44402694/article/details/125414381?spm=1001.2014.3001.5501](https://blog.csdn.net/weixin_44402694/article/details/125414381?spm=1001.2014.3001.5501)
本文使用官网accesstoken,请自行生成私人token
mapbox绘制symbol icon图层并进行添加、删除、更新、显隐等操作
效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5a472fc5f8dfb67bd4c74490a44072dd.png)
代码实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>11、symbol icon图层操作:添加|删除|更新|编辑</title>
<link
href="https://api.mapbox.com/mapbox-gl-js/v2.7.0/mapbox-gl.css"
rel="stylesheet"
/>
<script src="https://api.mapbox.com/mapbox-gl-js/v2.7.0/mapbox-gl.js"></script>
<style>
* {
padding: 0;
margin: 0;
list-style: none;
text-decoration: none;
}
html,
body {
width: 100%;
height: 100%;
}
#map {
width: 100%;
height: 100%;
}
.btn-list {
position: fixed;
top: 100px;
left: 100px;
}
</style>
</head>
<body>
<div id="map"></div>
<ul class="btn-list">
<li>
<button onclick="add()">添加</button>
</li>
<li>
<button onclick="update()">更新数据</button>
</li>
<li>
<button onclick="hide()">隐藏</button>
</li>
<li>
<button onclick="show()">显示</button>
</li>
<li>
<button onclick="editSize()">修改大小</button>
</li>
<li>
<button onclick="deleteLayer()">删除</button>
</li>
</ul>
<script>
let marker = null
mapboxgl.accessToken =
'pk.eyJ1Ijoid2FuZ3Rvbmd4dWUiLCJhIjoiY2pzY3E2M2k0MDk3NzN5dDA0Nmtia2h0cCJ9.oP9fEJxOgVzm0dWGvL6tGg'
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v11',
center: [108, 35],
zoom: 2,
})
function add() {
if (map && map.getSource('icon')) {
map.removeLayer('icon')
map.removeSource('icon')
map.removeImage('arrow')
}
map.loadImage(
'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Fc3aaad0d1154dc5cc5675ca53b25a05d85375b1318ff-x1QjSf_fw658&refer=http%3A%2F%2Fhbimg.b0.upaiyun.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1658476811&t=bda3018aa185f4181051598dc68179fe',
(error, image) => {
if (error) throw error
map.addImage('arrow', image)
}
)
map.addSource('icon', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: { size: 0.1, rotate: 0, color: 'red' },
geometry: { type: 'Point', coordinates: [104, 35] },
},
{
type: 'Feature',
properties: { size: 0.1, rotate: 270, color: 'green' },
geometry: { type: 'Point', coordinates: [110, 35] },
},
{
type: 'Feature',
properties: { size: 0.1, rotate: 180, color: 'red' },
geometry: { type: 'Point', coordinates: [116, 35] },
},
],
},
})
map.addLayer({
id: 'icon',
type: 'symbol',
source: 'icon',
layout: {
'icon-image': 'arrow',
'icon-size': ['get', 'size'],
'icon-rotate': ['get', 'rotate'],
'icon-offset': [0, 0],
'icon-rotation-alignment': 'map',
'icon-allow-overlap': true,
'icon-ignore-placement': true,
visibility: 'visible',
},
})
}
function update() {
if (!map.getSource('icon')) {
return alert('请先添加')
}
map.getSource('icon').setData({
type: 'FeatureCollection',
features: [
{
type: 'Feature',
properties: { size: 0.1, rotate: 200, color: 'red' },
geometry: { type: 'Point', coordinates: [124, 35] },
},
{
type: 'Feature',
properties: { size: 0.1, rotate: 200, color: 'yellow' },
geometry: { type: 'Point', coordinates: [128, 35] },
},
{
type: 'Feature',
properties: { size: 0.1, rotate: 200, color: 'red' },
geometry: { type: 'Point', coordinates: [132, 35] },
},
],
})
}
function hide() {
if (!map.getSource('icon')) {
return alert('请先添加')
}
map.setLayoutProperty('icon', 'visibility', 'none')
}
function show() {
if (!map.getSource('icon')) {
return alert('请先添加')
}
map.setLayoutProperty('icon', 'visibility', 'visible')
}
function editSize() {
if (!map.getSource('icon')) {
return alert('请先添加')
}
map.setLayoutProperty('icon', 'icon-size', 0.05)
}
function deleteLayer() {
if (!map.getSource('icon')) {
return alert('请先添加')
}
map.removeLayer('icon')
map.removeSource('icon')
map.removeImage('arrow')
}
</script>
</body>
</html>