当前位置: 首页 > news >正文

Cesium实现规划地图区域(五)

Cesium 作为开源的三维地球可视化引擎,能够高效实现地理空间数据的可视化展示。本文基于 Vue3 + Cesium 技术栈,以江苏省地理区域可视化为例,详细讲解地图区域功能的实现流程、核心参数及完整代码案例,能快速掌握三维地图区域渲染的关键技术。

目录

一、功能实现核心思路

二、核心参数说明

1. Cesium.Viewer 初始化参数

2. 相机视角配置参数

3. GeoJSON 加载样式参数

三、完整实现案例


一、功能实现核心思路

地图区域可视化的核心是将 GeoJSON 格式的地理边界数据加载到 Cesium 三维场景中,并根据业务需求定制区域样式,同时支持动态切换样式。整体实现流程可概括为:

  1. 初始化 Cesium 地图实例,配置基础视图参数;

  2. 加载 GeoJSON 格式的区域边界数据,定制不同业务场景下的渲染样式;

  3. 监听业务参数变化,实现区域样式的动态切换;

  4. 做好基础的资源管理,保证地图渲染的稳定性。

二、核心参数说明

在 Cesium 地图区域功能实现中,以下核心参数直接决定了地图的展示效果和交互体验,是开发过程中必须掌握的关键配置:

1. Cesium.Viewer 初始化参数

Viewer 是 Cesium 的核心容器,通过配置其初始化参数可定制地图基础交互能力:

参数名功能说明示例值应用场景
infoBox是否显示默认信息弹窗false自定义交互弹窗时关闭,避免样式冲突
geocoder是否显示位置查找工具false不需要地址搜索功能时关闭
homeButton是否显示返回首页视角按钮false自定义初始视角后关闭
sceneModePicker是否显示视角模式切换工具(2D/3D / 哥伦布视图)false固定视角模式时关闭
baseLayerPicker是否显示底图切换工具false统一底图样式时关闭
animation是否显示动画控制条false不需要时间轴动画时关闭
timeline是否显示时间轴工具false静态地图展示时关闭
fullscreenButton是否显示全屏按钮false自定义全屏逻辑时关闭

2. 相机视角配置参数

通过Cesium.GeoJsonDataSource.load()加载地理数据时,样式参数决定区域的视觉呈现,这个在这里就不再阐述,详情请见该篇文章:https://blog.csdn.net/qq_53541336/article/details/157100351?spm=1001.2014.3001.5502

3. GeoJSON 加载样式参数

通过Cesium.GeoJsonDataSource.load()加载地理数据时,样式参数决定区域的视觉呈现:

参数名功能说明示例值注意事项
stroke区域轮廓线颜色Cesium.Color.fromCssColorString('#28569F')支持 CSS 颜色值、RGB 等多种格式
strokeWidth轮廓线宽度3单位为像素,建议取值 1~5
fill区域填充颜色Cesium.Color.fromCssColorString('#409EFF').withAlpha(0.3)通过withAlpha()设置透明度(0~1)
clampToGround是否贴地显示false三维地形场景设为 true,平面地图设为 false

三、完整实现案例

以下是基于 Vue3 + Cesium 实现江苏省地图区域可视化的完整代码,包含地图初始化、GeoJSON 加载、样式动态切换等核心功能:

<template> <div class="map-wrapper"> <div id="cesiumContainer"></div> </div> </template> <script setup> import { ref, onMounted, watch } from 'vue' import * as Cesium from 'cesium' import jsuGeojson from '@/utils/jsu-geo.json'//这个JSON数据可以在网上找到 const props = defineProps({ mapType: { type: String, default: 'perception', // perception(感知) 或 forecast(预报) validator: val => ['perception', 'forecast'].includes(val) } }) let viewer = null let currentDataSource = null // 设置Cesium Ion Token(必填,用于加载Cesium资源) Cesium.Ion.defaultAccessToken = '你的token' /** * 初始化Cesium地图实例 */ const initMapCesium = () => { // 创建Cesium Viewer实例 viewer = new Cesium.Viewer('cesiumContainer', { infoBox: false, // 关闭默认信息弹窗 geocoder: false, // 关闭位置查找工具 homeButton: false, // 关闭首页按钮 sceneModePicker: false, // 关闭视角模式切换工具 baseLayerPicker: false, // 关闭底图切换工具 navigationHelpButton: false, // 关闭导航帮助工具 animation: false, // 关闭动画控制条 timeline: false, // 关闭时间轴 fullscreenButton: false // 关闭全屏按钮 }) // 隐藏Cesium默认版权信息,优化视觉效果 viewer.cesiumWidget.creditContainer.style.display = 'none' // 设置初始视角为江苏省区域 viewer.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(119.8, 32.9, 1000000), // 江苏省中心经纬度,高度1000公里 orientation: { heading: 0, // 航向:正北 pitch: -1.57, // 俯仰角:垂直俯视(-π/2) roll: 0 // 翻滚角:水平 } }) // 加载初始地图内容 loadMapContent(props.mapType) } /** * 根据地图类型加载对应的区域样式 * @param {String} type - 地图类型:perception/forecast */ const loadMapContent = (type) => { // 清除已加载的数据源,避免重复渲染 if (currentDataSource && viewer) { viewer.dataSources.remove(currentDataSource) currentDataSource = null } let styleConfig = {} // 根据业务类型配置不同的样式 if (type === 'perception') { // 感知页面样式:蓝色系 styleConfig = { stroke: Cesium.Color.fromCssColorString('#28569F'), // 深蓝色轮廓 strokeWidth: 3, // 轮廓宽度3px fill: Cesium.Color.fromCssColorString('#409EFF').withAlpha(0.3), // 浅蓝色填充,透明度30% clampToGround: false // 不贴地显示 } } else if (type === 'forecast') { // 预报页面样式:橙色系 styleConfig = { stroke: Cesium.Color.fromCssColorString('#FF6B35'), // 橙色轮廓 strokeWidth: 3, // 轮廓宽度3px fill: Cesium.Color.fromCssColorString('#FFA500').withAlpha(0.3), // 浅橙色填充,透明度30% clampToGround: false // 不贴地显示 } } // 加载江苏省GeoJSON数据并应用样式 Cesium.GeoJsonDataSource.load(jsuGeojson, styleConfig) .then((ds) => { // 将数据源添加到地图容器 viewer.dataSources.add(ds) // 保存当前数据源引用,便于后续清理 currentDataSource = ds }) .catch(error => { // 捕获加载异常,便于调试 console.error('加载GeoJSON数据失败:', error) }) } // 监听mapType属性变化,动态切换地图样式 watch(() => props.mapType, (newType) => { if (viewer) { loadMapContent(newType) } }, { immediate: false }) // 组件挂载后初始化地图 onMounted(() => { initMapCesium() }) </script> <style lang="less" scoped> .map-wrapper { position: relative; width: 100%; height: 100%; } #cesiumContainer { overflow: hidden; width: 100%; height: 100%; } </style>

http://www.jsqmd.com/news/468524/

相关文章:

  • Kotlin数据类与密封类实战指南
  • DeepGen 1.0:上海创新研究院等院校联手打造“轻量级全能画师“
  • Kafka全链路防丢消息:生产者到消费者全解析
  • openclaw 笔记及注意事项
  • People dont hate Chinese people.
  • 西南财经大学团队突破性解决大模型部署难题
  • 危机解除≠回到从前:输入性通胀压力下A股的走势与投资方向洞察
  • 2026年3月12日 十二生肖 今日运势
  • Flutter 三方库 text_indexing 的鸿蒙化适配指南 - 让海量文本搜索快如闪电,打造鸿蒙应用极速全文检索引擎
  • 基于TabPFN算法的回归问题-代码运行
  • javaDay05
  • AI智能体加速工艺仿真:架构师如何用AI优化仿真模型?
  • 线性代数直觉(六):向量通过矩阵
  • LeetCode 1009 476 数字的补数
  • 职场上要懂的思维模型系列(第一章)
  • 5.7 化学反应速率 化学平衡
  • 什么是纵深防护
  • AcWing 3473. 鸡兔同笼
  • 2026 如何快速接入外汇行情 API - 实战指南
  • phar反序列化专题
  • Gitlab安装与使用
  • 迅雷下载速度慢怎么办_教你如何提高30倍
  • OpenClaw实战-NAS配置从0到1详细教程及踩坑记录
  • 195.s域的1/s采用双线性变换法变到Z域如何实现,采用双线性变换法
  • 分析和预测快速约会中双方能否成功配对
  • DRAM内存访问协议核心解析:DRAM命令交互与时序约束全解(JEDEC通用标准)
  • 鸿蒙常见问题分析二十四:ListItemGroup如何使用三元运算符
  • Go 语言基础进阶:指针、init、匿名函数/闭包、defer
  • RabbitMQ整合springboot
  • Java基于微信小程序的社区垃圾回收管理系统【附源码、文档说明】