# mapboxgl-demo1
**Repository Path**: sagit_zh/mapboxgl-demo1
## Basic Information
- **Project Name**: mapboxgl-demo1
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-09-24
- **Last Updated**: 2021-09-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# mapboxgl-demo1
> typescript + vue2 + mapbox +turfjs
## 启动
```
yarn install
yarn serve
```
## 需求
- 开发时间时限:3天
1、用TypeScript、Vue、mapbox(https://www.mapbox.com/mapbox-gl-js/api/)开发,空间计算可以使用turfjs(http://turfjs.org/)
2、显示地图
3、在地图上选取几个点,完成选取后,形成轨迹线路,线路显示到地图上
4、点击播放轨迹,模拟汽车沿着轨迹移动
5、点击汽车图标可以显示当前的汽车状态(汽车车票,汽车型号,汽车颜色, 汽车剩余油量,距离终点距离,距离终点时间),距离终点距离根据当前位置计算,其他的使用模拟数据即可。
6、打包并发布这个应用
- 检查功能点:
1、使用TypeScript、Vue、mapbox开发
2、地图正常显示
3、点击选取后能形成轨迹
4、能够播放轨迹动画
5、点击汽车图标能出现汽车状态信息
6、代码风格良好
## 实现步骤
### 1. 显示地图
- 安装 mapboxgl 、turfjs
```bash
yarn add mapbox-gl @turf/turf
```
- 导入模块
```js
import 'mapbox-gl/dist/mapbox-gl.css'
import * as turf from '@turf/turf'
```
- 创建容器
```vue
```
- 初始化地图
```typescript
const map:Ref = ref()
mapboxgl.accessToken =
'pk.eyJ1Ijoic2FnaXQtemgiLCJhIjoiY2t0bnl5dDFnMDZ0aTJwcDNsa3N4emF1biJ9.jFO8rJJN-kvaz9vuQ0odKQ' // 设置 token
const map = new mapboxgl.Map({
container: 'map',
center: [113.3111, 23.0857],
zoom: 7,
style: 'mapbox://styles/mapbox/streets-v11',
hash: true
}) // 创建 mapbox对象
map.value = map
```
### 2. 选取点、生成路线、计算总距离
> 参考例子:https://docs.mapbox.com/mapbox-gl-js/example/measure/
- `map.on('click')` 点击事件
- `map.queryRenderedFeatures()` 查找是否有点,有则删除无则新增
- 删除用 `filter` 过滤实现,新增用 `map.getSource().setData()` 更新 source
- 通过点的 `point-geojson` 关联生成路线 `line-geojson`
- 使用 `turf.length` 计算路线 `line-geojson` 总距离
### 3. 按轨迹移动(难点)
> 参考例子:https://docs.mapbox.com/mapbox-gl-js/example/animate-point-along-route/
- 生成小汽车图标 car(当地图上有第一个点时)
- 根据 `总距离 / 步长` 生成平均每一段的 `移动距离`
- 根据 `移动距离` 使用 `turf.along()` 生成所有移动的坐标点
- 给小汽车添加角度属性
- 实时更新小汽车的 source 的坐标和角度,形成逐帧播放
- 使用 `requestAnimationFrame()` 生成动画播放
### 4. 显示汽车详情
- 预设好一个 marker 框,隐藏状态
- ` new mapboxgl.Marker(el).setLngLat('坐标').addTo(map)` 就行
- 重点是剩余距离的计算
### 5. 剩余距离计算(难点)
- 目前手上的算法只有 `turf.length()` 这一种
- 汽车移动过程中,角度发生改变时就是切换到下一条线段,这时候把前面的端点去掉,把汽车自身坐标作为端点,计算出汽车到末端的剩余距离