import mapServer from '../../../assets/js/mapSdk/mapServe'; import * as turf from '@turf/turf'; const mapWeather = { regionWeather: null, particle: null, showRain: 'ShowRain', 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]); } } }, 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(); earthCtrl.camera.flyTo(coord[0], coord[1], 1000, 0, -90, 0, 0); break; } }, showFire(res) { 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 += 3) { 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); // Viewer.camera.lookAt(primitive.boundingSphere.center, new Cesium.HeadingPitchRange(0.0, Cesium.Math.toRadians(-90), 5000)); // if (this.regionWeather) { // this.regionWeather.enableWeatherType = SmartEarth.Cesium.RegionWeather.TYPE_RAIN; // this.regionWeather.regionAlpha = 0.6; // this.regionWeather.regionGradientDistance = 300; // } }, 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; }, 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;