vue3+mapbox学习

Mapbox地图框架介绍

Mapbox提供多种功能和特性,包括 **1. 自定义地图设计

  1. 支持矢量和栅格图层以高分辨率渲染地图
  2. 实时数据更新
  3. 丰富的API与SDK以支持各种应用的开发
  4. 位置服务与导航功能
  5. 地理空间分析和多种专业图层样式** 此外,Mapbox 还支持离线地图,提高了用户在无网络条件下的体验,并且能够创建生动的动画效果来展示变化数据。

下载依赖: npm i mapbox-gl

初始化一个地图

html 复制代码
<template>
  <!-- 创建一个div元素作为地图容器 -->
  <div ref="mapContainer" class="map-container"></div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'; // 引入Vue的组合式API函数
import 'mapbox-gl/dist/mapbox-gl.css'; // 引入Mapbox GL的样式文件
import mapboxgl from 'mapbox-gl'; // 引入Mapbox GL JS库

// 设置Mapbox访问令牌,用于验证和加载地图资源,没有问马云要
mapboxgl.accessToken = 'pUWlI9XbOiGQ';

// 创建一个引用,用于指向地图容器DOM元素
const mapContainer = ref(null);
// 创建一个变量,用于存储地图实例
let map = null;

onMounted(() => {
  // 当组件挂载后初始化地图
  map = new mapboxgl.Map({
    container: mapContainer.value, // 使用通过ref创建的地图容器
    center: [117.868642, 24.667836], // 设置地图中心点坐标
    style: 'mapbox://styles/mapbox/standard', // 设置地图样式为Mapbox Standard
    zoom: 10, // 设置初始缩放级别
    projection: 'globe', // 设置地图投影类型为"globe"
  });

  // 添加导航控件(包括缩放和旋转功能)到地图上,并将其放置在左上角
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');
});

onUnmounted(() => {
  // 当组件卸载时销毁地图实例,清理资源
  if (map) {
    map.remove();
  }
});
</script>

<style scoped>
/* 设置地图容器的宽度和高度 */
.map-container {
  width: 100%;
  height: 500px;
}
</style>

见官方文档:Map类包含的属性

常用地图控件

javascript 复制代码
// 添加比例尺控件到地图上,设置最大宽度为80px,并使用公制单位(米)
map.addControl(new mapboxgl.ScaleControl({
    maxWidth: 80, // 设置比例尺的最大宽度
    unit: 'metric' // 使用公制单位显示比例尺
  }), 'bottom-left'); // 将比例尺控件放置在地图的左下角

// 添加导航控件(包括缩放和旋转功能)到地图上
map.addControl(new mapboxgl.NavigationControl(), 'top-left'); // 将导航控件放置在地图的左上角

// 添加全屏控件到地图上,允许用户将地图切换至全屏模式
map.addControl(new mapboxgl.FullscreenControl(), 'top-left'); // 将全屏控件放置在地图的左上角

// 添加定位控件到地图上,该控件可以帮助用户将其地图视图移动到当前位置
map.addControl(new mapboxgl.GeolocateControl({
    positionOptions: {
      enableHighAccuracy: true // 启用高精度定位
    },
    trackUserLocation: true, // 持续跟踪用户的地理位置并更新地图中心点
    showUserLocation: true // 在地图上显示用户的当前位置
  }), 'top-left'); // 将定位控件放置在地图的左上角

地图Mapbox自带的地图样式

样式名称 样式 URL
Mapbox 标准 mapbox://styles/mapbox/standard
Mapbox 卫星加路网 mapbox://styles/mapbox/standard-satellite
Mapbox 街道 mapbox://styles/mapbox/streets-v12
Mapbox 户外 mapbox://styles/mapbox/outdoors-v12
Mapbox 高亮 mapbox://styles/mapbox/light-v11
深色底图 mapbox://styles/mapbox/dark-v10
Mapbox 卫星 mapbox://styles/mapbox/satellite-v9
Mapbox 卫星街道 mapbox://styles/mapbox/satellite-streets-v12
Mapbox 日间导航 mapbox://styles/mapbox/navigation-day-v1
Mapbox 夜间导航 mapbox://styles/mapbox/navigation-night-v1

使用方法

要使用这些样式,只需将对应的样式 URL 添加到你的 Mapbox 配置中。例如,在使用 Mapbox GL JS 时,可以通过以下代码设置地图样式:

javascript 复制代码
map.setStyle('mapbox://styles/mapbox/streets-v12');
// 或者
style: 'mapbox://styles/mapbox/basic-print-v2', // Use the Mapbox Standard style

球体背景Fog、Snow、Rain设置

javascript 复制代码
// 监听地图样式加载完成的事件
  map.on('style.load', function () {
    // 设置地图的雾效
    map.setFog({
      // 定义雾的可见范围,即雾的开始和结束距离
      // 第一个值(0.8)表示雾开始出现的距离,第二个值(8)表示雾结束的距离
      "range": [0.8, 8],

      // 设置雾的颜色
      "color": "#e5e510",

      // 设置地平线与雾之间的混合程度,取值范围为 0 到 1
      // 值越小,混合越少,雾效越明显;值越大,混合越多,雾效越不明显
      "horizon-blend": 0.5,

      // 设置高空颜色,用于模拟高空的雾效颜色
      "high-color": "#ffffff",

      // 设置太空颜色,用于模拟太空中的雾效颜色
      "space-color": "#124888",

      // 设置星空强度,取值范围为 0 到 1
      // 值越大,星空效果越明显
      "star-intensity": 0.6
    }).setSnow({
      density: 0.3,
      intensity: 0.4
    }).setRain({
      // density: 定义雨滴的密度,取值范围通常是从 0 到 1
      // 值越大,雨滴越密集,模拟的降雨效果越强烈
      density: 1,

      // intensity: 定义降雨的强度,取值范围通常是从 0 到 1
      // 值越大,降雨效果越明显,模拟的雨滴下落速度越快
      intensity: 0.8,

      // distortion-strength: 定义雨滴对视线的扭曲强度,取值范围通常是从 0 到 1
      // 值越大,雨滴对视线的扭曲效果越明显,模拟的降雨视觉效果越逼真
      "distortion-strength": 0.3
    });
  });

效果如下

具体看:docs.mapbox.com/mapbox-gl-j...

加载高德地图等图层

加载高德地图

javascript 复制代码
<template>
  <!-- 创建一个div元素作为地图容器 -->
  <div ref="mapContainer" class="map-container"></div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'; // 引入Vue的组合式API函数
import 'mapbox-gl/dist/mapbox-gl.css'; // 引入Mapbox GL的样式文件
import mapboxgl from 'mapbox-gl'; // 引入Mapbox GL JS库

// 设置Mapbox访问令牌,以便可以访问Mapbox的地图服务
mapboxgl.accessToken = 'pbqxUWlI9XbOiGQ';

// 创建一个引用,用于指向地图容器DOM元素
const mapContainer = ref(null);
// 创建一个变量,用于存储地图实例
let map = null;

onMounted(() => {
  // 当组件挂载后初始化地图
  map = new mapboxgl.Map({
    container: mapContainer.value, // 使用通过ref创建的地图容器
    center: [115.86862, 28.6636], // 设置地图中心点坐标
    style: 'mapbox://styles/mapbox/satellite-v9', // 设置地图样式为卫星视图
    zoom: 10, // 设置初始缩放级别
    projection: 'globe', // 设置地图投影类型为球体(3D投影)
  });

  // 添加导航控件(包括缩放和旋转功能)到地图上,并将其放置在左上角
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');

  // 等待地图加载完成
  map.on('load', () => {
    // 添加Mapbox官方的地形数据源
    map.addSource('mapbox-dem', {
      type: 'raster-dem', // 数据源类型为点阵地形数据
      url: 'mapbox://mapbox.terrain-rgb', // 使用Mapbox官方的地形数据源URL
      tileSize: 256, // 设置瓦片大小
      maxzoom: 14 // 设置最大缩放级别
    });

    // 设置地形并指定夸张倍数(1.5倍的高度变化)
    map.setTerrain({ source: 'mapbox-dem', exaggeration: 1.5 });

    // 设置雾效(可选),以增加视觉效果
    map.setFog({
      range: [0.8, 8], // 定义雾效的范围
      color: '#def', // 设置雾的基本颜色
      'high-color': '#def', // 设置高处的雾颜色
      'space-color': '#def' // 设置太空背景颜色
    });
  });
});

// 组件卸载时清理资源,销毁地图实例
onUnmounted(() => {
  if (map) {
    map.remove(); // 清除地图实例
  }
});
</script>

<style scoped>
/* 设置地图容器的宽度和高度 */
.map-container {
  width: 100%;
  height: 500px; 
}
</style>

加载dem地形

html 复制代码
<template>  
  <!-- 创建一个div元素作为地图容器 -->  
  <div ref="mapContainer" class="map-container"></div>  
</template>  

<script setup>  
import { ref, onMounted, onUnmounted } from 'vue'; // 引入Vue的组合式API函数  
import 'mapbox-gl/dist/mapbox-gl.css'; // 引入Mapbox GL的样式文件  
import mapboxgl from 'mapbox-gl'; // 引入Mapbox GL JS库  

// 设置Mapbox访问令牌,以便可以访问Mapbox的地图服务  
mapboxgl.accessToken = 'pOiGQ';  

// 创建一个引用,用于指向地图容器DOM元素  
const mapContainer = ref(null);  
// 创建一个变量,用于存储地图实例  
let map = null;  

onMounted(() => {  
  // 当组件挂载后初始化地图  
  map = new mapboxgl.Map({  
    container: mapContainer.value, // 使用通过ref创建的地图容器  
    center: [115.86862, 28.6636], // 设置地图中心点坐标  
    style: 'mapbox://styles/mapbox/satellite-v9', // 设置地图样式为卫星视图  
    zoom: 10, // 设置初始缩放级别  
    projection: 'globe', // 设置地图投影类型为球体(3D投影)  
  });  

  // 添加导航控件(包括缩放和旋转功能)到地图上,并将其放置在左上角  
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');  

  // 等待地图加载完成  
  map.on('load', () => {  
    // 添加Mapbox官方的地形数据源  
    map.addSource('mapbox-dem', {  
      type: 'raster-dem', // 数据源类型为点阵地形数据  
      url: 'mapbox://mapbox.terrain-rgb', // 使用Mapbox官方的地形数据源URL  
      tileSize: 256, // 设置瓦片大小  
      maxzoom: 14 // 设置最大缩放级别  
    });  

    // 设置地形并指定夸张倍数(1.5倍的高度变化)  
    map.setTerrain({ source: 'mapbox-dem', exaggeration: 1.5 });  

    // 设置雾效(可选),以增加视觉效果  
    map.setFog({  
      range: [0.8, 8], // 定义雾效的范围  
      color: '#def', // 设置雾的基本颜色  
      'high-color': '#def', // 设置高处的雾颜色  
      'space-color': '#def' // 设置太空背景颜色  
    });  
  });  
});  

// 组件卸载时清理资源,销毁地图实例  
onUnmounted(() => {  
  if (map) {  
    map.remove(); // 清除地图实例  
  }  
});  
</script>  

<style scoped>  
/* 设置地图容器的宽度和高度 */  
.map-container {  
  width: 100%; // 地图宽度为100%  
  height: 500px; // 地图高度为500像素  
}  
</style>

实现图层切换

html 复制代码
<template>
  <!-- 创建一个div元素作为地图容器 -->
  <div ref="mapContainer" class="map-container">
    <!-- 添加切换地图影像的按钮 -->
    <button class="map-button" @click="switchMapStyle">切换地图样式</button>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'; // 引入Vue的组合式API函数
import 'mapbox-gl/dist/mapbox-gl.css'; // 引入Mapbox GL的样式文件
import mapboxgl from 'mapbox-gl'; // 引入Mapbox GL JS库

// 设置Mapbox访问令牌
mapboxgl.accessToken = 'pkI9XbOiGQ';

// 创建一个引用,用于指向地图容器DOM元素
const mapContainer = ref(null);
// 创建一个变量,用于存储地图实例
let map = null;
// 定义当前地图样式
let currentStyle = 'mapbox://styles/mapbox/standard';

// 定义切换地图样式的函数
function switchMapStyle() {
  if (map) {
    // 切换地图样式
    if (currentStyle === 'mapbox://styles/mapbox/standard') {
      currentStyle = 'mapbox://styles/mapbox/satellite-v9';
      map.setStyle(currentStyle);
    } else {
      currentStyle = 'mapbox://styles/mapbox/standard';
      map.setStyle(currentStyle);
    }
  }
}

onMounted(() => {
  // 当组件挂载后初始化地图
  map = new mapboxgl.Map({
    container: mapContainer.value, // 使用通过ref创建的地图容器
    center: [115.86862, 28.6636], // 设置地图中心点坐标
    style: currentStyle, // 设置初始地图样式
    zoom: 10, // 设置初始缩放级别
    projection: 'globe', // 设置地图投影类型为"globe"
  });

  // 添加导航控件(包括缩放和旋转功能)到地图上,并将其放置在左上角
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');
});

onUnmounted(() => {
  // 当组件卸载时销毁地图实例,清理资源
  if (map) {
    map.remove();
  }
});
</script>

<style scoped>
/* 设置地图容器的宽度和高度 */
.map-container {
  width: 100%;
  height: 500px;
  position: relative; /* 设置为相对定位,以便按钮可以绝对定位 */
}

/* 设置按钮的样式 */
.map-button {
  position: absolute;
  top: 10px;
  right: 10px;
  z-index: 1000; /* 确保按钮在地图之上 */
  padding: 10px;
  background-color: #fff;
  border: 1px solid #ccc;
  border-radius: 5px;
  cursor: pointer;
}
</style>

加载OSMBuilding

javascript 复制代码
// 监听地图样式加载完成事件
map.on('style.load', () => {
    // 获取当前地图样式的所有图层
    const layers = map.getStyle().layers;

    // 查找第一个符合条件的符号图层(symbol layer),该图层的布局属性中包含文本字段(text-field)
    // 这里假设我们需要在该符号图层之前插入新的3D建筑图层
    const labelLayerId = layers.find(layer => layer.type === 'symbol' && layer.layout['text-field']).id;

    // 添加3D建筑图层
    map.addLayer({
      id: 'add-3d-buildings', // 新图层的唯一标识符
      source: 'composite', // 指定数据源,这里使用的是默认的Mapbox提供的合成数据源
      'source-layer': 'building', // 指定数据源中的具体图层,这里是建筑图层
      filter: ['all', // 设置过滤条件,仅对符合条件的建筑进行3D渲染
        ['==', 'extrude', 'true'], // 只选择具有"extrude"属性且值为"true"的建筑
        ['has', 'height'] // 仅选择具有"height"属性的建筑
      ],
      type: 'fill-extrusion', // 指定图层类型为填充拉伸(用于3D效果)
      minzoom: 15, // 设置该图层的最小缩放级别,只有在缩放级别大于或等于15时才会显示
      paint: {
        'fill-extrusion-color': '#aaa', // 设置3D建筑的填充颜色
        'fill-extrusion-height': [ // 设置3D建筑的高度
          'interpolate', // 使用插值函数
          ['linear'], // 插值方式为线性
          ['zoom'], // 根据缩放级别进行插值
          1, // 当缩放级别为1时
          ['+', ['get', 'height'], 10], // 建筑高度为其自身的"height"属性值加上10
          8, // 当缩放级别为8时
          ['+', ['get', 'height'], 10] // 建筑高度仍为其自身的"height"属性值加上10
        ],
        'fill-extrusion-base': 0, // 设置3D建筑的底部高度始终为0
        'fill-extrusion-opacity': 0.9 // 设置3D建筑的透明度为0.9
      }
    }, labelLayerId); // 将新图层插入到之前找到的符号图层之前
});

地图事件

水平旋转展示地图

javascript 复制代码
// 旋转展示事件
let timer = null;
let isCircle = false;

const CircleShow = () => {
  isCircle = !isCircle; // 切换旋转状态
  if (!isCircle) {
    clearInterval(timer); // 如果状态为false,清除定时器,停止旋转
  } else {
    timer = setInterval(() => {
      let bearing = map.getBearing() + 1; // 获取当前地图的旋转角度并加1
      map.setBearing(bearing); // 设置新的旋转角度
    }, 20); // 每20毫秒更新一次旋转角度
  }
};

// 添加地图点击事件监听器(在onMounted中)
map.on('click', () => {
  clearInterval(timer); // 点击地图时清除定时器,停止旋转
  isCircle = false; // 重置旋转状态
});

地球自转加飞行复位

html 复制代码
<template>  
  <div ref="mapContainer" class="map-container">  
    <button class="map-button" @click="flyToCity">跳转</button>  
  </div>  
</template>  

<script setup>  
import { ref, onMounted, onUnmounted } from 'vue';  
import 'mapbox-gl/dist/mapbox-gl.css'; // 导入 Mapbox 的 CSS 样式  
import mapboxgl from 'mapbox-gl'; // 导入 Mapbox GL JS 库  

// 设置 Mapbox 访问令牌  
mapboxgl.accessToken = 'WlI9XbOiGQ'; // 替换为你的 Mapbox 访问令牌  

// 定义响应式引用  
const mapContainer = ref(null); // 地图容器的引用  
let map = null; // 地图实例  
let rotateEnabled = true; // 控制地图自转的开关  

// 停止地图自转的函数  
const OffRotateMap = () => {  
  rotateEnabled = false; // 设置旋转开关为 false,停止自转  
};  

// 地图自转函数  
const rotateMap = () => {  
  // 如果当前缩放级别不为 1,则停止自转  
  if (map.getZoom() !== 1) {  
    OffRotateMap();  
  }  
  
  // 如果自转被启用且地图实例存在  
  if (rotateEnabled && map) {  
    const currentCenter = map.getCenter(); // 获取当前地图的中心点  
    let newLongitude = currentCenter.lng - 1; // 每帧自西向东减少经度  

    // 确保经度在 0 到 360 之间  
    if (newLongitude < 0) {  
      newLongitude += 360; // 如果小于 0,加上 360  
    }  
    
    // 更新地图的中心点  
    map.setCenter([newLongitude, currentCenter.lat]);  
    
    // 请求下一帧动画,继续自转  
    requestAnimationFrame(rotateMap);  
  }  
};  

// 跳转到指定城市的函数  
const flyToCity = () => {  
  OffRotateMap(); // 停止自转  
  if (map) {  
    // 使用 flyTo 方法平滑跳转到指定城市  
    map.flyTo({  
      center: [115.86862, 28.6636], // 目标中心点经纬度  
      pitch: 70, // 俯仰角度  
      bearing: 60, // 方向角度  
      zoom: 10, // 缩放级别  
      speed: 1.2, // 动画速度  
      essential: true // 是否为关键动画  
    });  
  }  
};  

// 组件挂载时初始化地图  
onMounted(() => {  
  // 创建 Mapbox 地图实例  
  map = new mapboxgl.Map({  
    container: mapContainer.value, // 地图容器  
    center: [110, 30], // 初始中心点经纬度  
    style: 'mapbox://styles/mapbox/standard', // 地图样式  
    zoom: 1, // 初始缩放级别  
    projection: 'globe', // 使用 3D 地球投影  
  });  

  // 地图加载完成后开始自转  
  map.on('load', rotateMap);  
  
  // 添加导航控件到地图  
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');  
  
  // 监听地图点击事件来停止自转  
  map.on('click', OffRotateMap); // 传递函数引用而非调用  
});  

// 组件卸载时销毁地图实例  
onUnmounted(() => {  
  if (map) {  
    map.remove(); // 销毁地图实例  
  }  
});  
</script>  

<style scoped>  
.map-container {  
  width: 100%; /* 地图容器宽度 */  
  height: 500px; /* 地图容器高度 */  
  position: relative; /* 设置相对定位 */  
}  

.map-button {  
  position: absolute; /* 设置绝对定位 */  
  top: 10px; /* 按钮距离顶部的距离 */  
  right: 10px; /* 按钮距离右侧的距离 */  
  z-index: 1000; /* 设置较高的层级 */  
  padding: 10px; /* 按钮内边距 */  
  background-color: #fff; /* 按钮背景颜色 */  
  border: 1px solid #ccc; /* 按钮边框 */  
  border-radius: 5px; /* 按钮圆角 */  
  cursor: pointer; /* 鼠标悬停时的光标样式 */  
}  
</style>

AntV L7开源地理空间数据可视化分析开发框架

介绍 :AntV L7 是一个基于 WebGL 的开源大规模地理空间数据可视化分析开发框架。它专注于数据可视化表达,通过颜色、大小、纹理、方向、体积等视觉变量设置,实现从数据到信息的清晰、有效表达。L7 能够满足常见的地图图表、BI 系统的可视化分析需求,以及 GIS、交通、电力、国土、农业、城市等领域的空间信息管理、分析等应用系统开发需求。它支持 2D 和 3D 一体化的海量数据高性能渲染,简单灵活的数据接入,支持 CSV、JSON、GeoJSON 等数据格式接入,可以根据需求自定义数据格式,无需复杂的空间数据转换。此外,L7 还支持多地图底图,支持离线内网部署。 官网文档 下载依赖

dart 复制代码
// 安装L7 依赖
npm install --save @antv/l7
// 安装第三方底图依赖
npm install --save @antv/l7-maps
dart 复制代码
npm i  @antv/l7-maps @antv/l7

如果你需要卫星地图,可能还需要装个包:

dart 复制代码
@antv/l7-draw

AntV L7加载mapbox地图

html 复制代码
<template>
  <!-- 创建一个div元素作为地图容器 -->
  <div ref="mapContainer"></div>
</template>

<script setup>
import { onMounted, ref } from 'vue'; // 导入 Vue 的生命周期钩子和响应式引用
import { Scene, PointLayer } from '@antv/l7'; // 导入 L7 的场景和点图层
import { Mapbox } from '@antv/l7-maps'; // 导入 L7 的 Mapbox 适配器
import 'mapbox-gl/dist/mapbox-gl.css'; // 导入 Mapbox GL JS 的样式文件
import mapboxgl from 'mapbox-gl'; // 引入 Mapbox GL JS 库

// 创建一个引用,用于指向地图容器 DOM 元素
const mapContainer = ref(null);

// 设置 Mapbox 访问令牌,这是使用 Mapbox 服务的必要凭证
mapboxgl.accessToken = "pbOiGQ";

let map = null; // 定义一个变量来存储 Mapbox 地图实例

onMounted(() => {
  // 初始化 Mapbox 地图实例
  map = new mapboxgl.Map({
    container: mapContainer.value, // 指定地图容器为通过 ref 创建的 DOM 元素
    center: [115.868642, 28.667836], // 设置地图中心点坐标(经度和纬度)
    style: 'mapbox://styles/mapbox/streets-v11', // 使用 Mapbox 提供的街道地图样式
    zoom: 10, // 设置地图的初始缩放级别
    projection: 'globe', // 设置地图投影类型为地球仪模式
  });

  // 添加导航控件(包括缩放和旋转功能)到地图上,并将其放置在左上角
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');

  // 创建 L7 场景实例
  const scene = new Scene({
    id: mapContainer.value, // 使用 ref 对应的 DOM 元素作为场景的 ID
    map: new Mapbox({
      mapInstance: map, // 将 Mapbox 地图实例传递给 L7
    }),
  });
});
</script>

<style scoped>
/* 设置地图容器的宽度和高度 */
div {
  width: 100%; // 地图容器宽度占满父容器
  height: 400px; // 地图容器高度为 400 像素
}
</style>

在底图上添加点或者特定样式的柱体

文档链接:点图层

javascript 复制代码
 scene.on('loaded', () => {
    console.log('地图加载完成');
    const pointLayer = new PointLayer()
      .source([
        {
          lng: 115.899,
          lat: 28.619,
          type: 'road'
        },
      ], {
        parser: {
          type: 'json',
          x: 'lng',
          y: 'lat',
        },
      })
      .shape('type', (value) => {
        switch (value) {
          case 'path':
            return "cylinder";
          case 'road':
            return "triangleColumn";
        }
      })
      .size('type', (value) => {
        switch (value) {
          case 'path':
            return [30, 30];
          case 'road':
            return [10, 50];
        }
      })
      .color('type', (value) => { // 传入
        switch (value) {
          case 'path':
            return '#f00';
          case 'road':
            return '#0f0';
        }
      })
      .animate({
        enable: true, // 启用动画
        speed: 0.005, // 动画速度,默认为 `0.01`。
        repeat: 3,  // 播放次数
      });

    scene.addLayer(pointLayer);
  });

AntvL7实现城市沙盘炫酷样式

html 复制代码
<template>
  <!-- 创建一个div元素作为地图容器 -->
  <div ref="mapContainer"></div>
</template>

<script setup>
import { onMounted, ref } from 'vue'; // 导入 Vue 的生命周期钩子和响应式引用
import { Scene, CityBuildingLayer } from '@antv/l7'; // 导入 L7 的场景和城市建筑图层
import { Mapbox } from '@antv/l7-maps'; // 导入 L7 的 Mapbox 适配器
import 'mapbox-gl/dist/mapbox-gl.css'; // 导入 Mapbox GL JS 的样式文件
import mapboxgl from 'mapbox-gl'; // 引入 Mapbox GL JS 库

// 创建一个引用,用于指向地图容器 DOM 元素
const mapContainer = ref(null);

// 设置 Mapbox 访问令牌,这是使用 Mapbox 服务的必要凭证
mapboxgl.accessToken = "zYyIn0.73jueC5DbqxUWlI9XbOiGQ";

let map = null; // 定义一个变量来存储 Mapbox 地图实例

onMounted(() => {
  // 初始化 Mapbox 地图实例
  map = new mapboxgl.Map({
    container: mapContainer.value, // 指定地图容器为通过 ref 创建的 DOM 元素
    center: [115.868642, 28.667836], // 设置地图中心点坐标(经度和纬度)
    style: 'mapbox://styles/mapbox/dark-v10', // 使用 Mapbox 提供的街道地图样式
    zoom: 10, // 设置地图的初始缩放级别
    projection: 'globe', // 设置地图投影类型为地球仪模式
  });
  map.on('style.load', function () {
    // 设置地图的雾效
    map.setFog({
      // 定义雾的可见范围,即雾的开始和结束距离
      // 第一个值(0.8)表示雾开始出现的距离,第二个值(8)表示雾结束的距离
      "range": [0.8, 8],

      // 设置雾的颜色
      "color": "#cad2d9",

      // 设置地平线与雾之间的混合程度,取值范围为 0 到 1
      // 值越小,混合越少,雾效越明显;值越大,混合越多,雾效越不明显
      "horizon-blend": 0.5,

      // 设置高空颜色,用于模拟高空的雾效颜色
      "high-color": "#007acc",

      // 设置太空颜色,用于模拟太空中的雾效颜色
      "space-color": "#1e1e1e",

      // 设置星空强度,取值范围为 0 到 1
      // 值越大,星空效果越明显
      "star-intensity": 0.6
    })
  });
  // 添加导航控件(包括缩放和旋转功能)到地图上,并将其放置在左上角
  map.addControl(new mapboxgl.NavigationControl(), 'top-left');

  // 创建 L7 场景实例
  const scene = new Scene({
    id: mapContainer.value, // 使用 ref 对应的 DOM 元素作为场景的 ID
    map: new Mapbox({
      mapInstance: map, // 将 Mapbox 地图实例传递给 L7
    }),
  });

  // 监听 L7 场景加载完成事件
  scene.on('loaded', () => {
    // 从本地文件加载地理空间数据(GeoJSON 格式)
    fetch('public/data.geojson')
      .then((res) => res.json()) // 将响应转换为 JSON 格式
      .then((data) => {
        // 创建城市建筑图层
        const layer = new CityBuildingLayer({
          zIndex: 0, // 设置图层的层级
        })
          .source(data) // 将加载的 GeoJSON 数据作为图层的数据源
          .size('height') // 字段映射到geojson文件的字段
          .animate(true) // 启用动画效果
          .style({
            // 定义建筑的基础样式
            baseColor: '#333', // 楼房基础颜色
            windowColor: '#666', // 窗户颜色
            brightColor: '#e5e510', // 点亮窗户颜色
            // 扫光动画配置
            sweep: {
              enable: true, // 开启扫光动画
              sweepRadius: 10, // 扩散半径
              sweepCenter: [115.868642, 28.667836], // 扩散中心点坐标
              sweepColor: '#00FFFF', // 扩散颜色
              sweepSpeed: 0.2, // 扩散速度
              baseColor: '#333' // 扫光时的基础颜色
            }
          });

        // 将创建的图层添加到 L7 场景中
        scene.addLayer(layer);
      });
  });
});
</script>

<style scoped>
/* 设置地图容器的宽度和高度 */
div {
  width: 100%;
  height: 500px;
}
</style>

关于城市白膜数据的获取:

  1. 获取城市白膜的shp格式的数据(OSM下载
  2. 将shp格式转为geojson格式,同时设置坐标系为EPSG:4326坐标系(geojson也可以是一个url)
  3. 在代码中加载(注意高度字段)
相关推荐
GIS数据转换器2 天前
基于AI智能算法的无人机城市综合治理
大数据·人工智能·科技·gis·无人机·智慧城市
KY_chenzhao2 天前
地理信息系统(ArcGIS)在水文水资源及水环境中的应用:空间数据管理‌、空间分析功能‌、‌可视化表达‌
arcgis·gis·水文水资源·地理信息
孪创启航营3 天前
解锁动态3D标签的可视化玩法
前端·gis·数据可视化
GIS数据转换器4 天前
空间遥感智能处理技术发展现状与趋势
大数据·人工智能·gis·智慧城市
疯狂学习GIS8 天前
Landsat遥感影像分幅条带介绍与矢量下载:WRS的Path与Row
gis·rs·gis数据·遥感数据·landsat
希艾席蒂恩8 天前
四款GIS工具箱软件解析:满足企业多样化空间数据需求
信息可视化·gis·webgl·数字孪生·可视化大屏
GISBox9 天前
高斯泼溅文件如何转换成3DTiles?GISBox帮你轻松实现在Cesium上的应用
gis·cesium
GISBox14 天前
3D Gaussian Splatting文件如何转换成3DTiles?这款免费GIS工具箱能帮你轻松解决问题
3d·gis·cesium·倾斜摄影·切片
高堂明镜悲白发14 天前
在 SQLite 中使用 SpatiaLite 实现地理空间数据自动化读写
数据库·sqlite·自动化·gis