UNPKG

gisthreemap

Version:

基于webGL的三维api

465 lines (441 loc) 14.7 kB
import Entitys from './Entitys' /** * entitys 特效实体类 * 管理实体模型 * 创建 * 销毁 */ class EntitysEffect extends Entitys { constructor(viewer, dataSource) { super(viewer, dataSource) } generateRandomPosition(position, num) { let list = [] for (let i = 0; i < num; i++) { // random产生的随机数范围是0-1,需要加上正负模拟 let lon = position[0] + Math.random() * 0.04 * (i % 2 == 0 ? 1 : -1) let lat = position[1] + Math.random() * 0.04 * (i % 2 == 0 ? 1 : -1) list.push([lon, lat]) } return list } /** * 道路发光穿梭线 * @param {*} polyline 线坐标 * @param {*} duration 动画间隔 * @param {*} image 图片地址 * @param {*} Additional 额外参数 * @returns */ createSpriteline( polyline, duration, image, Additional = { entityAdditional: { _name: '', show: true }, // 默认二维管线 polylineAdditional: { includeHeight: false, _name: '', width: 500, } } ) { const entity = this.createEntity() // 挂载额外参数 for (let key in Additional.entityAdditional) { entity[key] = Additional.entityAdditional[key] } // 存在半径则为三维管线,不存在则为二维 if (Additional.polylineAdditional.radius) { // 挂载三维线 entity.polylineVolume = this.getPolylineVolume(polyline, Additional.polylineAdditional) // 道路穿梭线纹理 entity.polylineVolume.material = new Cesium.Spriteline1MaterialProperty(duration, image) } else { // 挂载线 entity.polyline = this.getPolyline(polyline, Additional.polylineAdditional) // 道路穿梭线纹理 entity.polyline.material = new Cesium.Spriteline1MaterialProperty(duration, image) } entity.eid = Additional.entityAdditional.hasOwnProperty('eid') ? Additional.entityAdditional.eid : `polyline_${Math.random()}` // entity.id = Additional.entityAdditional.hasOwnProperty('eid') ? Additional.entityAdditional.eid : `polyline_${Math.random()}` let entityPolyline = this.add(entity) return entityPolyline } /** * 道路发光穿梭线 * @param {*} polyline 线坐标 * @param {*} duration 动画间隔 * @param {*} image 图片地址 * @param {*} Additional 额外参数 * @returns */ createTrailline( polyline, duration, image, color = Cesium.Color.RED, Additional = { entityAdditional: { _name: '', show: true }, // 默认二维管线 polylineAdditional: { includeHeight: false, _name: '', width: 500, } } ) { const entity = this.createEntity() // 挂载额外参数 for (let key in Additional.entityAdditional) { entity[key] = Additional.entityAdditional[key] } // 存在半径则为三维管线,不存在则为二维 if (Additional.polylineAdditional.radius) { // 挂载三维线 entity.polylineVolume = this.getPolylineVolume(polyline, Additional.polylineAdditional) // 流动线纹理 entity.polylineVolume.material = new Cesium.PolylineTrailLinkMaterialPropertyRoad1(image, color, duration) } else { // 挂载线 entity.polyline = this.getPolyline(polyline, Additional.polylineAdditional) // 流动线纹理 entity.polyline.material = new Cesium.PolylineTrailLinkMaterialPropertyRoad1(image, color, duration) } entity.eid = Additional.entityAdditional.hasOwnProperty('eid') ? Additional.entityAdditional.eid : `polyline_${Math.random()}` // entity.id = Additional.entityAdditional.hasOwnProperty('eid') ? Additional.entityAdditional.eid : `polyline_${Math.random()}` let entityPolyline = this.add(entity) return entityPolyline } createWallDiffuse(position, _num, eid, LineFlowMaterial = { color: new Cesium.Color(1.0, 1.0, 0.0, 0.8), speed: 15 * Math.random(), percent: 0.1, gradient: 0.01 }) { let _positions = this.generateRandomPosition(_center, _num) _positions.forEach(item => { // 经纬度 let start_lon = item[0] let start_lat = item[1] let startPoint = new Cesium.Cartesian3.fromDegrees(start_lon, start_lat, 0) // 随机高度 let height = 5000 * Math.random() let endPoint = new Cesium.Cartesian3.fromDegrees(start_lon, start_lat, height) let linePositions = [] linePositions.push(startPoint) linePositions.push(endPoint) this.add({ id: eid || `lineFlow_${Math.random()}`, eid: eid || `lineFlow_${Math.random()}`, polyline: { positions: linePositions, material: new Cesium.LineFlowMaterialProperty(LineFlowMaterial) } }) }) } createSpriteline( polyline, duration, image, Additional = { entityAdditional: { _name: '', show: true }, // 默认二维管线 polylineAdditional: { includeHeight: false, _name: '', width: 500, } } ) { const entity = this.createEntity() // 挂载额外参数 for (let key in Additional.entityAdditional) { entity[key] = Additional.entityAdditional[key] } // 存在半径则为三维管线,不存在则为二维 if (Additional.polylineAdditional.radius) { // 挂载三维线 entity.polylineVolume = this.getPolylineVolume(polyline, Additional.polylineAdditional) // 道路穿梭线纹理 entity.polylineVolume.material = new Cesium.Spriteline1MaterialProperty(duration, image) } else { // 挂载线 entity.polyline = this.getPolyline(polyline, Additional.polylineAdditional) // 道路穿梭线纹理 entity.polyline.material = new Cesium.Spriteline1MaterialProperty(duration, image) } entity.eid = Additional.entityAdditional.hasOwnProperty('eid') ? Additional.entityAdditional.eid : `polyline_${Math.random()}` // entity.id = Additional.entityAdditional.hasOwnProperty('eid') ? Additional.entityAdditional.eid : `polyline_${Math.random()}` let entityPolyline = this.add(entity) return entityPolyline } /** * * @param {*} _center 起点 * @param {*} _positions 终点坐标集合 * @param {*} _num // 抛物线上的飞线数量 * @param {*} height // 抛物线高度 * @param {*} LineFlowMaterial // 飞线材质 * @param {*} linecolor // 抛物线颜色 */ createparabolaFlow(_center, _positions = [ [113.8236839, 22.528061], [114.0236839, 22.528061], [113.9236839, 22.428061], [113.9236839, 22.628061], [113.8236839, 22.428061], [114.0236839, 22.628061], [113.8236839, 22.628061], [114.0236839, 22.428061] ], _num, height = 5000, LineFlowMaterial = { color: Cesium.Color.fromCssColorString('rgba(11, 255, 244)'), speed: 15 * Math.random(), percent: 0.1, gradient: 0.01 }, linecolor = 'rgba(11, 255, 244,0.2)') { debugger _positions.forEach(item => { let _siglePositions = this.parabola(_center, item, height) // 创建飞线 for (let i = 0; i < _num; i++) { this.add({ polyline: { positions: _siglePositions, material: new Cesium.LineFlowMaterialProperty(LineFlowMaterial) }, }); } // 创建轨迹线 this.add({ polyline: { positions: _siglePositions, material: Cesium.Color.fromCssColorString(linecolor), } }) }) } /**抛物飞线 */ parabola( startPosition, endPosition, height = 0, count = 50 ) { //方程 y=-(4h/L^2)*x^2+h h:顶点高度 L:横纵间距较大者 let result = [] height = Math.max(+height, 100) count = Math.max(+count, 50) let diffLon = Math.abs(startPosition[0] - endPosition[0]) let diffLat = Math.abs(startPosition[1] - endPosition[1]) let L = Math.max(diffLon, diffLat) let dlt = L / count if (diffLon > diffLat) { //base on lon let delLat = (endPosition[1] - startPosition[1]) / count if (startPosition[0] - endPosition[0] > 0) { dlt = -dlt } for (let i = 0; i < count; i++) { let h = height - (Math.pow(-0.5 * L + Math.abs(dlt) * i, 2) * 4 * height) / Math.pow(L, 2) let lon = startPosition[0] + dlt * i let lat = startPosition[1] + delLat * i let point = new Cesium.Cartesian3.fromDegrees(lon, lat, h); result.push(point); } } else { //base on lat let delLon = (endPosition[0] - startPosition[0]) / count if (startPosition[1] - endPosition[1] > 0) { dlt = -dlt } for (let i = 0; i < count; i++) { let h = height - (Math.pow(-0.5 * L + Math.abs(dlt) * i, 2) * 4 * height) / Math.pow(L, 2) let lon = startPosition[0] + delLon * i let lat = startPosition[1] + dlt * i let point = new Cesium.Cartesian3.fromDegrees(lon, lat, h); result.push(point); } } return result } createcircleDiffuse(center, eid, speed = 12, color = 'rgba(11, 255, 244.0.2)') { // 扩散圆特效 this.add({ position: Cesium.Cartesian3.fromDegrees(center[0], center[1]), eid: eid || `circleDiffuse_${Math.random()}`, id: eid || `circleDiffuse_${Math.random()}`, ellipse: { semiMinorAxis: 1000.0, semiMajorAxis: 1000.0, material: new Cesium.CircleDiffuseMaterialProperty({ color: Cesium.Color.fromCssColorString(color), speed, }) } }) } // 发光线圈 createdScanline(position, color, radius, duration, eid) { this.add({ // id: _this.id, eid: eid || `Scanline_${Math.random()}`, id: eid || `Scanline_${Math.random()}`, position: Cesium.Cartesian3.fromDegrees( position[0], position[1], position[2] ), ellipse: { semiMinorAxis: new Cesium.CallbackProperty(function (n) { return radius }, false), semiMajorAxis: new Cesium.CallbackProperty(function (n) { return radius }, false), material: new Cesium.ScanlineMaterialProperty( new Cesium.Color.fromCssColorString(color), duration ), classificationType: Cesium.ClassificationType.BOTH, }, }) } /** 六角星 */ createHexagonSpread(position, color, radius, duration, eid) { let currentRadius = 1 this.add({ // id: _this.id, eid: eid || `HexagonSpread_${Math.random()}`, id: eid || `HexagonSpread_${Math.random()}`, position: Cesium.Cartesian3.fromDegrees( position[0], position[1], position[2] ), ellipse: { semiMajorAxis: new Cesium.CallbackProperty(function (n) { currentRadius += (1000 / duration) * 50 if (currentRadius > radius) { currentRadius = 1 } return currentRadius }, false), semiMinorAxis: new Cesium.CallbackProperty(function (n) { return currentRadius }, false), material: new Cesium.HexagonSpreadMaterialProperty( new Cesium.Color.fromCssColorString(color) ), }, }) } /**雷达平扫 */ createRadarScan(position, color, outlineColor, radius, duration, eid) { // 雷达扫描 this.add({ position: Cesium.Cartesian3.fromDegrees(position[0], position[1]), eid: eid || `RadarScan_${Math.random()}`, id: eid || `RadarScan_${Math.random()}`, ellipse: { semiMinorAxis: new Cesium.CallbackProperty(function (n) { return radius }, false), semiMajorAxis: new Cesium.CallbackProperty(function (n) { return radius }, false), material: new Cesium.RadarScanMaterialProperty({ color: new Cesium.Color.fromCssColorString(color), speed: duration, }), height: position[2], heightReference: Cesium.HeightReference.RELATIVE_TO_GROUND, outline: true, outlineColor: new Cesium.Color.fromCssColorString(outlineColor) } }) } /** * * @param {*} position 中心点 * @param {*} color 颜色 * @param {*} radii 椭球半径 * @param {*} duration 速度 */ createellispoid(position, color, radii, duration, eid) { // 轨迹球体 this.add({ position: Cesium.Cartesian3.fromDegrees(position[0], position[1]), eid: eid || `Ellispoid_${Math.random()}`, id: eid || `Ellispoid_${Math.random()}`, ellipsoid: { radii: new Cesium.Cartesian3(radii[0], radii[1], radii[2]), material: new Cesium.EllipsoidTrailMaterialProperty({ color: new Cesium.Color.fromCssColorString(color), speed: duration }) } }) } /** * 电弧球体 * @param {*} position 中心点 * @param {*} color 颜色 * @param {*} radii 椭球半径 * @param {*} duration 速度 */ createElectellispoid(position, color, radii, duration, eid) { // 轨迹球体 this.add({ position: Cesium.Cartesian3.fromDegrees(position[0], position[1]), eid: eid || `Ellispoid_${Math.random()}`, id: eid || `Ellispoid_${Math.random()}`, ellipsoid: { radii: new Cesium.Cartesian3(radii[0], radii[1], radii[2]), material: new Cesium.EllipsoidElectricMaterialProperty({ color: new Cesium.Color.fromCssColorString(color), speed: duration }) } }) } // createWallDiffuse(positions,height,color,eid) { this.add({ name: "立体墙效果", eid: eid || `Ellispoid_${Math.random()}`, wall: { positions: positions, // 设置高度 maximumHeights: new Array(positions.length).fill(height), minimunHeights: new Array(positions.length).fill(0), // 扩散墙材质 material: new Cesium.WallDiffuseMaterialProperty({ color: new Cesium.Color.fromCssColorString(color) }) } }) } } export default EntitysEffect