205 lines
5.1 KiB
Markdown
205 lines
5.1 KiB
Markdown
# 分屏地图使用指南
|
||
|
||
## 概述
|
||
|
||
本项目实现了基于ArcGIS API for JavaScript的分屏地图功能,可以同时显示天地图的矢量地图和影像地图,支持多种交互和动画效果。
|
||
|
||
## 功能特点
|
||
|
||
### 🎯 核心功能
|
||
- **分屏对比**:同时显示矢量地图和影像地图
|
||
- **方向切换**:支持垂直分割和水平分割
|
||
- **位置调节**:可拖拽分割线调整显示比例
|
||
- **动画效果**:平滑的过渡动画和演示效果
|
||
|
||
### 🎮 交互控制
|
||
- **重置分割线**:一键回到50%中间位置
|
||
- **方向切换**:在垂直和水平分割间切换
|
||
- **预设布局**:快速切换到预定义布局
|
||
- **动画演示**:摆动效果展示分屏功能
|
||
|
||
## 使用方法
|
||
|
||
### 1. 启动项目
|
||
```bash
|
||
npm run dev
|
||
```
|
||
|
||
### 2. 切换到分屏模式
|
||
在页面右上角点击"分屏对比"按钮
|
||
|
||
### 3. 控制面板操作
|
||
分屏模式下,左上角会显示控制面板,包含以下功能:
|
||
|
||
#### 基础控制
|
||
- **重置分割线**:将分割线动画回到中间位置(50%)
|
||
- **水平分割/垂直分割**:切换分割方向
|
||
|
||
#### 预设布局
|
||
- **影像主导**:影像地图占70%,矢量地图占30%
|
||
- **矢量主导**:矢量地图占70%,影像地图占30%
|
||
|
||
#### 动画演示
|
||
- **摆动演示**:分割线摆动动画,展示分屏效果
|
||
|
||
### 4. 手动调节
|
||
- 拖拽分割线可以手动调整两种地图的显示比例
|
||
- 实时显示当前分割位置百分比
|
||
|
||
## 技术实现
|
||
|
||
### splitScreen.js 工具类
|
||
|
||
#### SplitScreenManager
|
||
分屏管理器,负责创建和管理分屏小部件:
|
||
|
||
```javascript
|
||
import { SplitScreenManager } from './utils/splitScreen.js'
|
||
|
||
// 创建管理器
|
||
const manager = new SplitScreenManager(view)
|
||
|
||
// 创建分屏
|
||
manager.createSwipe(leadingLayers, trailingLayers, options)
|
||
|
||
// 切换方向
|
||
manager.toggleDirection()
|
||
|
||
// 设置位置
|
||
manager.setPosition(75) // 75%
|
||
```
|
||
|
||
#### SplitScreenAnimator
|
||
动画控制器,提供平滑的动画效果:
|
||
|
||
```javascript
|
||
import { SplitScreenAnimator } from './utils/splitScreen.js'
|
||
|
||
// 创建动画器
|
||
const animator = new SplitScreenAnimator(manager)
|
||
|
||
// 动画到指定位置
|
||
await animator.animateToPosition(75, 1000) // 1秒动画到75%
|
||
|
||
// 摆动动画
|
||
await animator.wiggle(15, 3, 2000) // 摆动幅度15,3个周期,2秒
|
||
```
|
||
|
||
#### 预设配置
|
||
```javascript
|
||
import { SPLIT_PRESETS } from './utils/splitScreen.js'
|
||
|
||
// 可用预设
|
||
SPLIT_PRESETS.VERTICAL_SATELLITE_RIGHT // 垂直分割,影像在右
|
||
SPLIT_PRESETS.HORIZONTAL_SATELLITE_BOTTOM // 水平分割,影像在下
|
||
SPLIT_PRESETS.SATELLITE_DOMINANT // 影像占主导(70%)
|
||
SPLIT_PRESETS.VECTOR_DOMINANT // 矢量占主导(70%)
|
||
```
|
||
|
||
## 自定义配置
|
||
|
||
### 修改默认分割方向
|
||
在 `SplitScreenMap.vue` 中:
|
||
```javascript
|
||
const isVertical = ref(false) // 改为false使用水平分割
|
||
```
|
||
|
||
### 修改默认分割位置
|
||
```javascript
|
||
const currentPosition = ref(30) // 改为30%
|
||
```
|
||
|
||
### 添加新的预设
|
||
在 `splitScreen.js` 中添加:
|
||
```javascript
|
||
export const SPLIT_PRESETS = {
|
||
// 现有预设...
|
||
|
||
// 新预设
|
||
CUSTOM_LAYOUT: {
|
||
direction: 'vertical',
|
||
position: 25
|
||
}
|
||
}
|
||
```
|
||
|
||
### 自定义动画效果
|
||
```javascript
|
||
// 修改动画时长
|
||
await animator.animateToPosition(50, 2000) // 2秒动画
|
||
|
||
// 修改摆动参数
|
||
await animator.wiggle(20, 4, 3000) // 摆动幅度20,4个周期,3秒
|
||
```
|
||
|
||
## 样式定制
|
||
|
||
### 分割线样式
|
||
在 `SplitScreenMap.vue` 的全局样式中:
|
||
```css
|
||
:global(.esri-swipe__divider) {
|
||
background-color: #ff0000 !important; /* 红色分割线 */
|
||
width: 6px !important; /* 更粗的分割线 */
|
||
}
|
||
```
|
||
|
||
### 控制面板样式
|
||
修改 `.control-panel` 类的样式:
|
||
```css
|
||
.control-panel {
|
||
background: rgba(0, 0, 0, 0.8); /* 深色背景 */
|
||
color: white;
|
||
/* 其他样式... */
|
||
}
|
||
```
|
||
|
||
## 性能优化
|
||
|
||
### 图层管理
|
||
- 分屏时只加载必要的图层
|
||
- 避免重复创建相同的图层
|
||
- 及时销毁不需要的小部件
|
||
|
||
### 动画优化
|
||
- 使用 `requestAnimationFrame` 确保流畅动画
|
||
- 缓动函数提供自然的动画效果
|
||
- 避免在动画过程中创建新的分屏小部件
|
||
|
||
## 常见问题
|
||
|
||
### Q: 分屏功能不显示?
|
||
A: 检查ArcGIS API版本,确保支持Swipe小部件
|
||
|
||
### Q: 动画卡顿?
|
||
A: 检查浏览器性能,降低动画复杂度或时长
|
||
|
||
### Q: 自定义样式不生效?
|
||
A: 使用 `:global()` 选择器覆盖ArcGIS默认样式
|
||
|
||
### Q: 如何添加更多地图类型?
|
||
A: 在天地图配置中添加新的服务URL,然后在分屏组件中使用
|
||
|
||
## 扩展功能
|
||
|
||
### 三分屏对比
|
||
可以扩展为三个或更多地图的对比:
|
||
```javascript
|
||
// 创建多个分屏小部件
|
||
const swipe1 = new Swipe({ /* 配置1 */ })
|
||
const swipe2 = new Swipe({ /* 配置2 */ })
|
||
```
|
||
|
||
### 时间轴对比
|
||
结合时间滑块,对比不同时间的地图数据
|
||
|
||
### 测量工具
|
||
在分屏模式下添加距离和面积测量功能
|
||
|
||
### 图层透明度
|
||
添加图层透明度控制,实现更细致的对比效果
|
||
|
||
## 相关资源
|
||
|
||
- [ArcGIS Swipe Widget 文档](https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-Swipe.html)
|
||
- [天地图API文档](https://lbs.tianditu.gov.cn/server/MapService.html)
|
||
- [Vue 3 Composition API](https://v3.vuejs.org/guide/composition-api-introduction.html) |