mapbox添加marker

本案例创建一个 marker 标记,并添加到地图中。

1. 引入 CDN 链接

<!-- 1.引入CDN链接 -->
<script src="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.js"></script>
<link
  href="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.css"
  rel="stylesheet"
/>

2. 创建地图

我们创建了一个Mapbox GL JS地图实例,设置了地图的容器、默认的地图风格、中心点坐标、地图级别以及默认的地图投影模式。

const map = new mapboxgl.Map({
  // 在这个对象中,我们填入一些地图相关的参数设置
  container: "map", //地图容器
  style: "mapbox://styles/mapbox/streets-v12", //地图风格,底图数据源
  center: [114.085947, 22.547], //默认注视的坐标点
  zoom: 12, //当前展示的地图级别
  projection: "globe", //地图投影模式
});

3. 添加 marker

这里我们创建了一个带有颜色的标注,并将其添加到地图上。

  • 首先创建div元素作为标注的图层,显示在地图上。
  • 接下来,创建一个mapboxgl.Marker对象。这个对象包含了标注的所有配置信息,包括颜色、是否可拖拽、受地形遮挡的透明度、旋转角度等。
  • 然后,使用setLngLat方法设置了标注的位置。
  • 最后,使用addTo方法将标注添加到地图上。
// 3.添加marker
const div = document.createElement("div");
div.id = "marker";
// 最简单的marker,放一个标注到地图上
const marker = new mapboxgl.Marker({
  // 颜色
  color: "#fd384c",
  // 是否可拖拽
  draggable: true,
  // 受三维地形遮挡的透明度
  occludedOpacity: 0.6,
  // 旋转
  // rotation:45,
  // 缩放
  scale: 1.5,
  element: div,
})
  .setLngLat([114.085947, 22.547])
  .addTo(map);

在这里,我们用图片作为标注,设置它的样式。

#marker {
  width: 50px;
  height: 50px;
  background: url("https://s2.loli.net/2024/02/28/ORiGIBqJEbo8rZe.png");
  background-size: cover;
  border-radius: 50%;
  cursor: pointer;
}

4. 演示效果

image-20240228093807678

5. 代码实现

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>marker</title>
    <!-- 1.引入CDN链接 -->
    <script src="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.js"></script>
    <link
      href="https://api.mapbox.com/mapbox-gl-js/v2.12.0/mapbox-gl.css"
      rel="stylesheet"
    />
    <style>
      /* 地图样式 */
      * {
        margin: 0;
        padding: 0;
      }
      #map {
        width: 100vw;
        height: 100vh;
      }
      #marker {
        width: 50px;
        height: 50px;
        background: url("https://s2.loli.net/2024/02/28/ORiGIBqJEbo8rZe.png");
        background-size: cover;
        border-radius: 50%;
        cursor: pointer;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>
    <script>
      // 2.地图显示
      window.onload = () => {
        // 注册token
        mapboxgl.accessToken =
          "pk.eyJ1IjoiY2hlbmdjaGFvODg2NiIsImEiOiJjbGhzcWowMHUwYTNyM2VwNXZhaXhjd3Q4In0.FEh2q7sEW88Z1B5GcK_TDg";
        // 初始化图像
        const map = new mapboxgl.Map({
          // 在这个对象中,我们填入一些地图相关的参数设置
          container: "map", //地图容器
          style: "mapbox://styles/mapbox/streets-v12", //地图风格,底图数据源
          center: [114.085947, 22.547], //默认注视的坐标点
          zoom: 12, //当前展示的地图级别
          projection: "globe", //地图投影模式
        });

        // 3.添加marker
        const div = document.createElement("div");
        div.id = "marker";
        // 最简单的marker,放一个标注到地图上
        const marker = new mapboxgl.Marker({
          // 颜色
          color: "#fd384c",
          // 是否可拖拽
          draggable: true,
          // 受三维地形遮挡的透明度
          occludedOpacity: 0.6,
          // 旋转
          // rotation:45,
          // 缩放
          scale: 1.5,
          element: div,
        })
          .setLngLat([114.085947, 22.547])
          .addTo(map);
      };
    </script>
  </body>
</html>
### Mapbox 批量添加 Marker 性能优化方案 在使用 Mapbox 时,批量添加 Marker 可能会导致卡顿问题,尤其是在数据量较大时。以下是针对该问题的性能优化解决方案: #### 1. 使用 `MarkerCluster` 插件 为了减少地图上过多 Marker 的渲染压力,可以使用 MarkerCluster 插件将多个 Marker 聚合为一个集群图标。这种技术能够显著降低渲染复杂度,从而提升性能[^3]。 ```javascript // 示例代码:使用 MarkerCluster 插件 const markerCluster = new mapboxgl.MarkerCluster({ markers: data.markers, // 数据源 clusterRadius: 40, // 集群半径 }); markerCluster.addTo(map); ``` #### 2. 替换为 `GeoJSON` 渲染 相比于逐一添加 Marker,使用 GeoJSON Layer 是一种更高效的渲染方式。通过将所有 Marker 数据整合到一个 GeoJSON 对象中,Mapbox 可以一次性渲染整个图层,从而避免逐个 Marker 的开销[^4]。 ```javascript // 示例代码:使用 GeoJSON 渲染 Marker map.addSource('markers', { type: 'geojson', data: { type: 'FeatureCollection', features: data.markers.map(marker => ({ type: 'Feature', geometry: { type: 'Point', coordinates: [marker.lng, marker.lat] }, properties: marker.properties })) } }); map.addLayer({ id: 'markers-layer', type: 'circle', source: 'markers', paint: { 'circle-radius': 5, 'circle-color': '#007cbf' } }); ``` #### 3. 启用 Canvas 渲染模式 类似于 Leaflet 中的优化策略[^2],Mapbox 默认使用 SVG 渲染器。当需要处理大量静态 Marker 时,建议切换为 Canvas 渲染模式,以提高渲染效率[^5]。 ```javascript // 示例代码:启用 Canvas 渲染模式 map.setStyle('mapbox://styles/mapbox/streets-v11', { renderWorldCopies: false, fadeDuration: 0 }); map.setPaintProperty('background', 'visibility', 'none'); map.setRenderMode('canvas'); ``` #### 4. 分批加载数据 如果数据量过大,可以考虑分批加载 Marker 数据。通过限制每次加载的 Marker 数量,并结合用户交互(如缩放级别或地理范围)动态加载更多数据,可以有效缓解卡顿问题[^6]。 ```javascript // 示例代码:分批加载数据 function addMarkersInBatches(markers, batchSize) { let index = 0; const intervalId = setInterval(() => { const batch = markers.slice(index, index + batchSize); if (batch.length === 0) { clearInterval(intervalId); return; } batch.forEach(marker => { new mapboxgl.Marker() .setLngLat([marker.lng, marker.lat]) .addTo(map); }); index += batchSize; }, 10); // 每次间隔 10ms 添加一批 } addMarkersInBatches(data.markers, 100); ``` #### 5. 减少不必要的属性和样式 复杂的 Marker 样式和属性会增加渲染负担。可以通过简化 Marker 的外观设计(如统一颜色、形状等)来减少计算量[^7]。 --- ### 总结 通过上述方法,包括使用 MarkerCluster 插件、GeoJSON 渲染、Canvas 模式、分批加载以及优化 Marker 样式,可以有效解决 Mapbox 批量添加 Marker 时的卡顿问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值