fuchengshen
2022-07-09 3a25c05b5ab837714f30469cdcb1e2a77d8d7f6c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import * as mars3d from "mars3d"
 
export let map // mars3d.Map三维地图对象
let canvasWindLayer
 
// 需要覆盖config.json中地图属性参数(当前示例框架中自动处理合并)
export const mapOptions = {
  scene: {
    center: { lat: 16.490922, lng: 101.305158, alt: 31274431, heading: 0, pitch: -88 }
  }
}
 
/**
 * 初始化地图业务,生命周期钩子函数(必须)
 * 框架在地图初始化完成后自动调用该函数
 * @param {mars3d.Map} mapInstance 地图对象
 * @returns {void} 无
 */
export function onMounted(mapInstance) {
  map = mapInstance // 记录map
  map.basemap = 2017 // 蓝色底图
 
  // 风场
  canvasWindLayer = new mars3d.layer.CanvasWindLayer({
    color: "#4696db", // 颜色
    frameRate: 10, // 每秒刷新次数
    speedRate: 120, // 风前进速率
    particlesNumber: 3000,
    maxAge: 60,
    lineWidth: 1.5
  })
  map.addLayer(canvasWindLayer)
 
  loadEarthData()
}
 
/**
 * 释放当前地图业务的生命周期函数
 * @returns {void} 无
 */
export function onUnmounted() {
  map = null
}
 
// 滑动条事件
// 修改粒子数量
export function changeCount(val) {
  if (val) {
    canvasWindLayer.particlesNumber = val
  }
}
 
// 修改存活时间
export function changeAge(val) {
  if (val) {
    canvasWindLayer.maxAge = val
  }
}
 
// 修改移动速率
export function changeSpeed(val) {
  if (val) {
    canvasWindLayer.speedRate = val
  }
}
 
// 修改线宽
export function changeLinewidth(val) {
  if (val) {
    canvasWindLayer.lineWidth = val
  }
}
 
// 改变颜色
export function changeColor(color) {
  canvasWindLayer.color = color
}
 
// 加载全球数据
let earthWindData
// 加载气象
let dongnanWindData
export function loadEarthData() {
  map.flyHome()
 
  canvasWindLayer.speedRate = 50
  canvasWindLayer.reverseY = false // false时表示 纬度顺序从大到小
 
  mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/windyuv.json" })
    .then(function (res) {
      if (earthWindData) {
        canvasWindLayer.data = earthWindData
        return
      }
      earthWindData = res
      canvasWindLayer.data = earthWindData
    })
    .catch(function (err) {
      console.log("请求数据失败!", err)
    })
}
// 加载局部数据
export function loadDongnanData() {
  map.setCameraView({
    y: 30.484229,
    x: 116.627601,
    z: 1719951,
    heading: 0,
    pitch: -90,
    roll: 0
  })
 
  canvasWindLayer.speedRate = 85
  canvasWindLayer.reverseY = true // true时表示 纬度顺序从小到到大
 
  // 访问windpoint.json后端接口,取数据
  mars3d.Util.fetchJson({ url: "//data.mars3d.cn/file/apidemo/windpoint.json" })
    .then(function (res) {
      if (dongnanWindData) {
        canvasWindLayer.data = dongnanWindData
        return
      }
      dongnanWindData = convertWindData(res.data)
      canvasWindLayer.data = dongnanWindData
    })
    .catch(function () {
      globalMsg("实时查询气象信息失败,请稍候再试")
    })
}
 
// 将数据转换为需要的格式:风向转UV
function convertWindData(arr) {
  const arrU = []
  const arrV = []
 
  let xmin = arr[0].x
  let xmax = arr[0].x
  let ymin = arr[0].y
  let ymax = arr[0].y
 
  // 风向是以y轴正方向为零度顺时针转,0度表示北风。90度表示东风。
  // u表示经度方向上的风,u为正,表示西风,从西边吹来的风。
  // v表示纬度方向上的风,v为正,表示南风,从南边吹来的风。
  for (let i = 0, len = arr.length; i < len; i++) {
    const item = arr[i]
 
    if (xmin > item.x) {
      xmin = item.x
    }
    if (xmax < item.x) {
      xmax = item.x
    }
    if (ymin > item.y) {
      ymin = item.y
    }
    if (ymax < item.y) {
      ymax = item.y
    }
 
    const u = mars3d.WindUtil.getU(item.speed, item.dir)
    arrU.push(u)
 
    const v = mars3d.WindUtil.getV(item.speed, item.dir)
    arrV.push(v)
  }
 
  const rows = getKeyNumCount(arr, "y") // 计算 行数
  const cols = getKeyNumCount(arr, "x") // 计算 列数
 
  return {
    xmin: xmin,
    xmax: xmax,
    ymax: ymax,
    ymin: ymin,
    rows: rows,
    cols: cols,
    udata: arrU, // 横向风速
    vdata: arrV // 纵向风速
  }
}
 
function getKeyNumCount(arr, key) {
  const obj = {}
  arr.forEach((item) => {
    obj[item[key]] = true
  })
 
  let count = 0
  for (const col in obj) {
    count++
  }
  return count
}