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
import * as mars3d from "mars3d"
 
export let map // mars3d.Map三维地图对象
let graphicLayer // 矢量图层对象
let pointsLayer
 
export const mapOptions = {
  scene: {
    center: { lat: 31.255881, lng: 117.271026, alt: 60133, heading: 0, pitch: -46 }
  }
}
 
/**
 * 初始化地图业务,生命周期钩子函数(必须)
 * 框架在地图初始化完成后自动调用该函数
 * @param {mars3d.Map} mapInstance 地图对象
 * @returns {void} 无
 */
export function onMounted(mapInstance) {
  map = mapInstance // 记录map
 
  // 创建矢量数据图层
  graphicLayer = new mars3d.layer.GraphicLayer()
  map.addLayer(graphicLayer)
 
  // 点矢量数据图层
  pointsLayer = new mars3d.layer.GraphicLayer()
  map.addLayer(pointsLayer)
}
 
/**
 * 释放当前地图业务的生命周期函数
 * @returns {void} 无
 */
export function onUnmounted() {
  map = null
}
 
const bbox = [116.984788, 31.625909, 117.484068, 32.021504]
// 生成50个随机点
export function randomPoints() {
  clearlayer()
 
  const points = turf.randomPoint(50, { bbox: bbox }) // 50个随机点
 
  points.features.forEach((e, index) => {
    const position = e.geometry.coordinates
    const primitive = new mars3d.graphic.BillboardPrimitive({
      position: position,
      style: {
        image: "img/marker/mark3.png",
        scale: 1,
        horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
        scaleByDistance: new Cesium.NearFarScalar(10000, 1.0, 500000, 0.1),
        clampToGround: false
      },
      popup: "第" + index + "个"
    })
    pointsLayer.addGraphic(primitive)
  })
}
 
// 计算包围面
export function convexPolygon() {
  graphicLayer.clear()
 
  const points = pointsLayer.toGeoJSON()
 
  if (points.features.length === 0) {
    globalMsg("请先创建原始数据")
    return
  }
 
  const hull = turf.convex(points)
 
  const convexPoints = hull.geometry.coordinates
  // 外包围面;
  const polygonGraphic = new mars3d.graphic.PolygonEntity({
    positions: convexPoints,
    style: {
      color: "#00ffff",
      opacity: 0.2,
      clampToGround: false
    }
  })
  graphicLayer.addGraphic(polygonGraphic)
}
 
// 泰森多边形
export function voronoiPolygon() {
  graphicLayer.clear()
 
  const points = pointsLayer.toGeoJSON()
 
  if (points.features.length === 0) {
    globalMsg("请先创建原始数据")
    return
  }
 
  const options = {
    bbox: bbox
  }
  const voronoiPolygons = turf.voronoi(points, options)
 
  voronoiPolygons.features.forEach((e, index) => {
    const position = e.geometry.coordinates
 
    const voronoiPolygon = new mars3d.graphic.PolygonEntity({
      positions: position,
      style: {
        randomColor: true, // 随机色
        opacity: 0.5,
        clampToGround: false
      },
      popup: "第" + index + "个"
    })
    graphicLayer.addGraphic(voronoiPolygon)
  })
}
 
// 计算TIN多边形
export function tinPolygon() {
  graphicLayer.clear()
 
  const points = pointsLayer.toGeoJSON()
 
  if (points.features.length === 0) {
    globalMsg("请先创建原始数据")
    return
  }
 
  for (let i = 0; i < points.features.length; i++) {
    points.features[i].properties.z = ~~(Math.random() * 9)
  }
  const tin = turf.tin(points, "z")
 
  tin.features.forEach((e, index) => {
    const position = e.geometry.coordinates
 
    // TIN多边形
    const tinPolygon = new mars3d.graphic.PolygonEntity({
      positions: position,
      style: {
        randomColor: true, // 随机色
        opacity: 0.5,
        outline: true,
        outlineColor: "rgb(3, 4, 5,0.2)",
        outlineWidth: 2,
        clampToGround: false
      },
      popup: "第" + index + "个"
    })
    graphicLayer.addGraphic(tinPolygon)
  })
}
 
// 清除所有矢量图层
export function clearlayer() {
  graphicLayer.clear()
  pointsLayer.clear()
}