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)
|