import mapServer from '@/assets/js/mapSdk/mapServe.js'; import * as turf from '@turf/turf'; const mapWeather = { regionWeather: null, particle: null, showRain: 'ShowRain', wallLayer: null, pathLayer: null, listBiildBord: [], listParticle: [], getWearData(res) { return { name: res.address, data: [ { name: '名称', val: res.address, }, { name: '气象级别', val: res.level, }, { name: '所属线路', val: res.line, }, { name: '数据来源', val: res.source, }, { name: '发布时间', val: res.time, }, ], }; }, closeRegionWeather() { if (this.regionWeather) { this.regionWeather.enableWeatherType = SmartEarth.Cesium.RegionWeather.TYPE_NONE; this.regionWeather = null; } if (this.particle) { this.particle.deleteObject(); this.particle = null; } for (var i in Viewer.scene.primitives._primitives) { const name = Viewer.scene.primitives._primitives[i].name; if (name && name == this.showRain) { Viewer.scene.primitives.remove(Viewer.scene.primitives._primitives[i]); } } if (this.wallLayer) { Viewer.entities.remove(this.wallLayer); this.wallLayer = null; // this.wallLayer.removeFromMap(); // this.wallLayer = null; } if (this.pathLayer) { this.pathLayer.deleteObject(); this.pathLayer = null; } for (var i in this.listBiildBord) { this.listBiildBord[i].removeFromMap(); } this.listBiildBord = []; for (var i in this.listParticle) { this.listParticle[i].deleteObject(); } this.listParticle = []; }, setRegionWeatherType(response) { this.closeRegionWeather(); if (!this.regionWeather) { this.getRegionWather(response); } const coord = this.getCoord(response); switch (response.type) { case 'rain': // earthCtrl.camera.flyTo(coord[0], coord[1], 8000, 0, -90, 0, 0); this.showRain(response); break; case 'fire': this.showFire(response); // earthCtrl.camera.flyTo(coord[0], coord[1], 1000, 0, -90, 0, 0); break; case 'snow': this.showSnow(); break; case 'thunder': this.showThunder(response); break; } }, showThunder(response) { if (response.geom) { this.addWatherGeom(response.geom, 'thunder2.png'); } // const points = this.chunkArray(response.point.split(','), 2); // for (var i in points) { // const billboardEntity = earthCtrl.factory.createBillboard({ // name: '标签点', // id: earthCtrl.factory.createUUID(), // image: config.images + 'thunder.png', // 贴图, // width: 40, // height: 40, // lon: parseFloat(points[i][0]), // lat: parseFloat(points[i][1]), // alt: 1, // scale: 6, // }); // this.listBiildBord.push(billboardEntity); // } }, addWatherGeom(response, image) { if (response.ploygon) { this.addWatherPloygon(this.chunkArray(response.ploygon, 2), image); } if (response.line) { this.addWatherLine(this.chunkArray(response.line, 2)); } }, addWatherLine(response) { const obj = { type: 'FeatureCollection', features: [ { type: 'Feature', geometry: { type: 'LineString', coordinates: response, }, }, ], }; this.pathLayer = earthCtrl.factory.createPathLayer({ url: obj, color: '#ff0000', //线的颜色 width: 5.0, //线的宽度 pointColor: '#FFFFFF', //移动点的颜色 speed: 1, far: 50000, }); }, addWatherPloygon(response, image) { response.push(response[0]); const coord = this.getCentroid(response); earthCtrl.camera.flyTo(coord[0], coord[1], 80000, 0, -90, 0, 0); var geom = []; for (var i = 0; i < response.length; i++) { geom.push(response[i][0], response[i][1]); } this.wallLayer = Viewer.entities.add({ polygon: { hierarchy: Cesium.Cartesian3.fromDegreesArray(geom), material: new Cesium.ImageMaterialProperty({ image: config.images + image, alpha: 0.2, // 设置透明度为0.5 repeat: Cesium.Cartesian2(1.0, 1.0), // 不重复 transparent: true, // 启用png透明 color: new Cesium.Color(1.0, 1.0, 1.0, 0.3), // 设置颜色和透明度 }), stRotation: Cesium.Math.toRadians(0), }, }); // this.wallLayer = earthCtrl.factory.createPolygon({ // name: '面', // id: earthCtrl.factory.createUUID(), // material: Cesium.Color.fromCssColorString('rgba(128,128,128, .2)'), // outlineColor: Cesium.Color.fromCssColorString('rgba(128,128,128, .5)'), // lineWidth: 3, // height: 10, // outline: true, // outlineWidth: 2, // positions: SmartEarth.Cesium.Cartesian3.fromDegreesArrayHeights(geom), // }); // const obj = { type: 'GeometryCollection', geometries: [{ type: 'LineString', coordinates: response }] }; // // 流动墙图层 // this.wallLayer = earthCtrl.factory.createTrailWallLayer({ // url: obj, // color: '#0000ff05', //颜色 // height: 20, //高度 // speed: 2, // }); }, showFire(response) { if (response.geom) { this.addWatherGeom(response.geom, 'filre.png'); } // const points = this.chunkArray(response.point.split(','), 2); // for (var i in points) { // const particle = earthCtrl.factory.createParticleEffect( // 'flame', // { // x: parseFloat(points[i][0]), // y: parseFloat(points[i][1]), // z: 0, // }, // { // translation: SmartEarth.Cesium.Cartesian3.fromElements(0, 0, 0), //平移 // particleSize: 10, // }, // function (data) {} // ); // this.listParticle.push(particle); // } // const coord = this.getCoord(res); // const obj = { // x: coord[0], // y: coord[1], // z: 0, // }; // this.particle = earthCtrl.factory.createParticleEffect( // 'flame', // obj, // { // translation: SmartEarth.Cesium.Cartesian3.fromElements(0, 0, 0), //平移 // particleSize: 10, // }, // function (data) {} // ); }, showRain(res) { var area = []; var std = []; for (var i = 0; i < res.area.length; i += 2) { area.push(res.area[i]); area.push(res.area[i + 1]); std.push([res.area[i], res.area[i + 1]]); } std.push(std[0]); const polygon = turf.polygon([std]); const centerPoint = turf.center(polygon); const coord = centerPoint.geometry.coordinates; earthCtrl.camera.flyTo(coord[0], coord[1], 8000, 0, -90, 0, 0); const geometry = new Cesium.PolygonGeometry({ polygonHierarchy: new Cesium.PolygonHierarchy(Cesium.Cartesian3.fromDegreesArray(area)), height: 0, // 底面高度 extrudedHeight: 0.2, // 水面高度 ellipsoid: Cesium.Ellipsoid.WGS84, }); // 2. 创建GeometryInstance const geometryInstances = new Cesium.GeometryInstance({ geometry }); // 3. 创建material const material = new Cesium.Material({ fabric: { type: 'Water', uniforms: { baseWaterColor: new Cesium.Color(0.25, 0.6, 0.9, 0.5), // 水面颜色 normalMap: config.images + 'waterNormals.jpg', // 贴图 frequency: 5000, // 水波纹数量 animationSpeed: 0.02, // 水流速 amplitude: 30, // 水波纹振动幅度 specularIntensity: 5, // 镜面反射强度 }, }, }); // 4. 创建Appearance const appearance = new Cesium.EllipsoidSurfaceAppearance({ aboveGround: true, material, }); // 5. 创建primitive var primitive = new Cesium.Primitive({ geometryInstances, appearance, }); primitive.name = this.showRain; Viewer.scene.primitives.add(primitive); }, showSnow() { if (this.regionWeather) { this.regionWeather.enableWeatherType = SmartEarth.Cesium.RegionWeather.TYPE_SNOW; this.regionWeather.regionAlpha = 0.9; this.regionWeather.regionGradientDistance = 300; } }, getCoord(res) { const coord = res.point.split(','); return coord; }, getCentroid(response) { var centroid = turf.centroid(turf.polygon([response])); return centroid.geometry.coordinates; }, chunkArray(array, size) { return array.reduce((chunks, current, index) => { const chunkIndex = Math.floor(index / size); if (!chunks[chunkIndex]) { chunks[chunkIndex] = []; } chunks[chunkIndex].push(current); return chunks; }, []); }, getRegionWather(res) { if (res.type == 'fire') return; const coord = this.getCoord(res); const model = mapServer.layerList.filter((item) => { if (item.name == config.baseModel.cnName + '_' + config.baseModel.id) { return item; } }); if (model.length <= 0) return; this.regionWeather = earthCtrl.factory.createRegionWeather({ primitive: model[0].layer.item, position: new SmartEarth.Cesium.Cartesian3.fromDegrees(coord[0], coord[1], 1), radius: 1000, }); }, }; export default mapWeather;