geo/SPLIT_SCREEN_GUIDE.md

205 lines
5.1 KiB
Markdown
Raw Normal View History

2025-07-31 16:12:17 +08:00
# 分屏地图使用指南
## 概述
本项目实现了基于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) // 摆动幅度153个周期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) // 摆动幅度204个周期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)