# map-dpp-components **Repository Path**: gzlpsdp/map-dpp-components ## Basic Information - **Project Name**: map-dpp-components - **Description**: @gzlpsdp/map-components 是一个基于 Vue 3、OpenLayers(2D) 和 Cesium(3D) 构建的地图组件库,提供了统一的 2D/3D 地图切换、WMS 服务加载、三维分析工具(测量、通视、视域、填挖方、坡度分析)等功能,适用于需要集成二三维地图的 Vue 3 项目。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-04-17 - **Last Updated**: 2026-04-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 地图组件库使用文档 **当前最新版本:v1.0.4** ### 简介 @gzlpsdp/map-components 是一个基于 Vue 3、OpenLayers(2D) 和 Cesium(3D) 构建的地图组件库,提供了统一的 2D/3D 地图切换、WMS 服务加载、三维分析工具(测量、通视、视域、填挖方、坡度分析)等功能,适用于需要集成二三维地图的 Vue 3 项目。 ### 安装 **1. 通过 Gitee Git URL 安装** ```bash npm install git+https://gitee.com/gzlpsdp/map-dpp-components.git#v1.0.1 ``` **2. 安装 peer 依赖** 组件库本身不打包以下依赖,需要宿主项目自行安装: ```bash npm install vue@^3.5.0 cesium@^1.132.0 ol@^7.4.0 element-plus@^2.10.0 @turf/turf@^6.5.0 proj4@^2.20.0 @element-plus/icons-vue@^2.3.0 ``` **3. 配置 Vite(如果使用 Cesium)** 在业务项目的 vite.config.js 中添加 Cesium 插件: ```javascript import cesium from 'vite-plugin-cesium' export default { plugins: [vue(), cesium()] } ``` **4. 引入基础样式** 在业务项目的入口文件(如 main.js)中引入地图库和 UI 库的样式: ```javascript import 'ol/ol.css' import 'element-plus/dist/index.css' import 'cesium/Build/Cesium/Widgets/widgets.css' ``` ### 快速开始 **1. 在 Vue 组件中导入组件和样式** ```javascript ``` **2. 示例(参考后面的 MapPage.vue)** 下面是一个演示页面 ```javascript ``` ### 组件 API **DualMap Props** |属性名| 类型| 默认值| 描述 |------|-------|---------|-----| |tiandituKey| String |'3c3c7e74921e6c523414b680f8c622e2'| 天地图密钥,用于 2D 和 3D 底图。建议使用自己的密钥。 |defaultCenter| Array| [106.71, 26.57] |默认地图中心点 [经度, 纬度]。 |defaultZoom2D| Number| 8| 2D 地图默认缩放级别。 |defaultHeight3D| Number| 5000| 3D 地图初始相机高度(米)。 |autoClearDrawings| Boolean| true| 切换 2D/3D 模式时是否自动清除绘制的图形。 |tiandituLogoUrl| String| https://www.tianditu.gov.cn/images/logo.png| 天地图logo |showTiandituLogo| Boolean| 'true| 是否显示天地图logo **DualMap 暴露的方法(通过 ref 调用)** 以下方法可通过 dualMapRef.value?.methodName() 调用。 ***基础操作*** |方法| 参数 |描述| |------|-------|-----| |toggleMap()| 无| 切换 2D/3D 视图。 |flyTo(lon, lat, height)| lon 经度, lat 纬度, height 相机高度(米)| 定位到指定经纬度。 |zoomIn()| 无| 放大一级。 |zoomOut()| 无| 缩小一级。 |resetView() |无| 复位到默认视图。 ***3D 模型与地形*** |方法| 参数| 描述| |------|-------|-----| |load3DModel(url, id, height)| url 3D Tiles 服务地址, id 模型唯一标识, height 模型抬高高度| 加载 3D 倾斜摄影模型。 |remove3DModel(id)| id 模型标识 |移除指定 3D 模型。 |setTerrain(url)| url 地形服务地址(如 Cesium terrain 格式)| 加载自定义地形。 |resetTerrain() |无 |重置地形为椭球体(无起伏)。 ***WMS 服务管理*** |方法| 参数| 描述| |------|-------|-----| |addWmsLayer(id, url, params)| id 图层唯一标识, url WMS 服务地址, params 参数对象(需包含 layers 字段)| 自动适配当前 2D/3D 模式添加 WMS 图层。 |removeWmsLayer(id)| id 图层标识| 移除指定 WMS 图层。 |clearAllWmsLayers()| 无| 清除当前模式下的所有 WMS 图层。 |addWmsLayer2D(id, url, layerName, options)| 同上(仅 2D 模式)| 强制在 2D 模式下添加 WMS 图层。 |enableWmsQuery(callback)| callback 查询结果回调函数| 启用 WMS 要素查询(点击地图获取属性)。 |disableWmsQuery() |无 |禁用 WMS 要素查询。 ***WMS 参数示例:*** ```javascript { layers: 'workspace:layer_name', format: 'image/png', transparent: true, version: '1.3.0', cql_filter: "id > 0", // 可选的筛选条件 token: 'your_token' // 可选 } ``` ***三维分析工具*** |方法| 参数| 描述| |------|-------|-----| |startDraw3D(type, options)| type 几何类型('Point', 'LineString', 'Polygon'), options.onComplete 回调| 开始在地图上绘制几何图形。 |clearDrawings3D()| 无 |清除所有绘制的图形。 |measureDistance3D(p1, p2)| p1, p2 为 Cesium.Cartesian3 点| 计算两点之间的直线距离(米)。 |measureArea3D(positions)| positions 多边形顶点数组| 计算多边形面积(平方米)。 |visibilityAnalysis(start, end)| start, end 为 Cesium.Cartesian3 点| 通视分析,返回 { isVisible, distance, heightDiff }。 |viewAnalysis(center, radius, startAngle, endAngle, step)| center 观测点, radius 半径(米), startAngle, endAngle 角度范围, step 步长(默认 5°)| 视域分析,在地图上绘制可视区域(绿色)和不可视区域(红色)。 |computeCutAndFill(positions, baseHeight)| positions 多边形顶点数组, baseHeight 基准高程(米)| 填挖方分析,返回 { cutVolume, fillVolume, baseArea }。 |slopeAnalysis(positions)| positions 多边形顶点数组| 坡度分析,返回各坡度等级百分比。 ***其他辅助方法*** |方法 |参数 |描述| |------|-------|-----| |getActiveMapType()| 无| 返回当前地图模式 '2d' 或 '3d'。 |getHeightFromLonLatDeg(lon, lat)| lon 经度, lat 纬度 |获取指定经纬度的地形高度(米)。 |toDegrees(radians) / toRadians(degrees)| 角度/弧度| 角度弧度转换工具。 |bearing(startLat, startLng, destLat, destLng)| 经纬度 |计算两点之间的方位角。 ### 常见问题 **1. 安装后组件无法渲染,控制台报错 Component is missing template or render function** **原因:** 使用了默认导入而不是具名导入。 **解决:** 改为 import { DualMap } from '@gzlpsdp/map-components'。 **2. 天地图底图不显示或请求 403** **原因:** 默认的天地图测试密钥 3c3c7e74921e6c523414b680f8c622e2 可能有访问频率限制。 **解决:** 注册天地图开发者账号,获取自己的密钥,并通过 :tiandituKey 传入。 **3. Cesium 报错 Cesium is not defined** **原因:** 未正确配置 Cesium 插件或未引入 Cesium 库。 **解决:** - 确保安装了 cesium 和 vite-plugin-cesium。 - 在 vite.config.js 中配置 cesium() 插件。 - 在 main.js 中引入 Cesium 的 CSS:import 'cesium/Build/Cesium/Widgets/widgets.css'。 **4. 2D 地图的测量结果不准确** OpenLayers 的 getLength 和 getArea 默认使用球面计算,精度足够用于常规场景。如需更高精度,可自行修改 OlMap.vue 中的测量逻辑。 **5. 切换 2D/3D 后 WMS 图层消失** 组件内部已实现 WMS 图层的自动同步(syncWmsLayersToCurrentMode),无需手动处理。如果仍有问题,请检查 addWmsLayer 时是否传入了正确的 id 和 params。 **6. 地形加载失败** - 确保地形服务 URL 符合 Cesium terrain 格式(如 http://example.com/terrain,目录下需包含 layer.json)。 - 检查网络是否可访问该 URL(注意跨域问题)。 - 可以先用 setTerrain 加载世界地形 Cesium.createWorldTerrain() 测试。 **7. 如何获取 WMS 查询返回的要素信息?** 启用 enableWmsQuery(callback) 后,点击地图会触发回调,参数格式为: ```javascript [ { layerName: '图层名', properties: { 属性键值对 }, coordinate: { lon, lat } // 2D 模式下为坐标,3D 模式下为 position } ] ``` ### 更新组件库 当组件库有新版本时,在业务项目中执行: ```bash npm install git+https://gitee.com/gzlpsdp/map-dpp-components.git#v1.0.2 ``` 建议在 package.json 中锁定版本号,避免意外升级。 ### 完整的MapPage.vue示例 ```javascript ``` ### MapPage.vue效果 ![alt text](image.png)