/////////////////////////////////////////////////////////////////////////// // Copyright © 2022 guoshilong. All Rights Reserved. // 模块描述:洪水淹没分析 /////////////////////////////////////////////////////////////////////////// define(['dojo/_base/declare', 'dojo/_base/lang', 'dojo/_base/array', 'dojo/_base/html', "dojo/topic", 'jimu/BaseWidget', 'dojo/on', 'dstore/Memory', 'dstore/Trackable', 'dgrid/Grid', 'dgrid/Keyboard', 'dgrid/Selection', 'dgrid/Editor', 'dstore/RequestMemory', 'dgrid/test/data/createSyncStore', "libs/echarts/v4/echarts.min", 'libs/layer/layer.js', 'libs/turf/turf.min.js'], function (declare, lang, array, html, topic, BaseWidget, on, Memory, Trackable, Grid, Keyboard, Selection,Editor, RequestMemory, createSyncStore, echarts, layer, turf) { return declare([BaseWidget], { baseClass: 'jimu-widget-FloodAnalysis', name: 'FloodAnalysis', //渲染的点位 pointEntities: [], //渲染的线 drawingPolyline:null, //html元素 analysisBtn: null, historyBtn: null, divFloodAnalysis: null, divFloodHistory: null, hdSelect: null, smxSelect: null, //河段下拉列表 hdDataList: [], //水面线下拉列表 smxDataList:[], //洪水分析表格数据 analysisTableList: [], dgridSelectEvent:null, currentSelectHistoryData:null, //历史风险图表格数据 historyTableList: [ {name: "5年洪水淹没图"}, {name: "10年洪水淹没图"}, {name: "15年洪水淹没图"}, ], //当前选中的河段 currentHd: null, //当前选中的水面线 currentSmxcode: "", //水文站最近的点 currentNearPoint:null, //收起框打开状态 isOpen: true, //api接口 url: { riverwaySelectName: "http://localhost:82/blade-ycreal/riverway/selectName", waterlineSelectName: "http://localhost:82/blade-ycreal/waterline/selectName", childpage: "http://localhost:82/blade-ycreal/water/childpage", getCzByGlCodeByGlQdj: "http://localhost:82/blade-ycreal/waterline/getCzByGlCodeByGlQdj", getHistoryList: "http://localhost:82/blade-ycreal/inundationResult/list", saveHistoryData: "http://localhost:82/blade-ycreal/inundationResult/save", getCoordinatesMinQdj: "http://localhost:82/blade-ycreal/water/getCoordinatesMinQdj", }, evaluateData: [ { name: "会昌县", house: 35, population: 175, area: 12.888, value: 50.123 }, { name: "于都县", house: 70, population: 350, area: 24.456, value: 100.456 }, { name: "赣县", house: 20, population: 100, area: 8.551, value: 39.789 } ], startup: function startup() { var self = this this.bindHtmlElement() //实时、预测改变事件 $('input[type=radio][name=middleRadio]').change(function () { if (this.value == "realtime") { $("#sw-input").prop('disabled', true); } else { $("#sw-input").prop('disabled', false); } if ($('#smx-select').val()) self.getPointData($('#smx-select').val()) }) //开始分析按钮点击事件 $('#start-analysis-btn').click(function () { if (self.currentHd && self.currentSmxcode) { self.drawWater('analysis') } else { layer.msg("请先选择河段和水面线") } }) //洪水淹没分析按钮点击事件 this.analysisBtn.click(function () { self.analysisBtn.addClass('choose-button') self.analysisBtn.removeClass('unchoose-button') self.historyBtn.addClass('unchoose-button') self.historyBtn.removeClass('choose-button') self.divFloodHistory.hide() self.divFloodAnalysis.show() $('#history-pagination').hide() if (self.currentHd){ $('#analysis-pagination').show() } }) //历史风险图按钮点击事件 this.historyBtn.click(function () { self.historyBtn.addClass('choose-button') self.historyBtn.removeClass('unchoose-button') self.analysisBtn.addClass('unchoose-button') self.analysisBtn.removeClass('choose-button') self.divFloodAnalysis.hide() self.divFloodHistory.show() $('#analysis-pagination').hide() $('#history-pagination').show() //获取历史数据 self.getHistoryList() }) //河段输入框聚焦、失焦、输入事件 $('#hd-input').focus(function () { $("#hd-select").show() }) $('#hd-input').blur(function () { //隐藏域触发改变事件需要手动触发 // $("#hd-select").val().change() setTimeout(function(){//有bug 需要延迟执行隐藏 $("#hd-select").hide() },300) }) // 河段输入事件 $('#hd-input').on("input", function () { var searchString = $('#hd-input').val() var filterArray = self.hdDataList.filter(e => { return e.riverway.indexOf(searchString) != -1 }) self.hdSelect.find("option").remove();//添加新值 删除旧值 filterArray.forEach(e => { let v = '' if (e.stnm) { v += '-' + e.stnm.trim() + '站' } if (e.gl_qdj) { v += '-起点距' + e.gl_qdj } self.hdSelect.append(""); }) }) //水位输入事件 $('#sw-input').on("input", function () { self.getYcSub() }) //河段选择框改变事件 this.hdSelect.change(function () { $("#hd-input").val($(this).find("option:selected").text()); var selected = JSON.parse($(this).val()) self.currentHd = selected self.getSmxData(selected.river_code, selected.default_smx) self.getMin(selected.default_smx,selected.gl_qdj) if (self.waterEntity) self.map.entities.remove(self.waterEntity) //地图定位 self.map.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(selected.river_origin, selected.qd_lat, 50000), }); self.hdSelect.hide() }) //水面线选择框改变事件 this.smxSelect.change(function () { var selected = $(this).val() self.getPointData(selected) }) //水位输入框按下回车事件 $('#sw-input').keypress(function (event) { if (event.which == 13) { self.analysisTableList.forEach(e => { e.sw = self.calculateSw(e.water, sw) }) self.loadPagination(self.analysisTableList, "analysis-pagination") } }) //搜索按钮点击事件 $('#search-button').click(function () { let searchName = $('#search-name').val() let filterArray = self.historyTableList.filter(e => { return e.name.indexOf(searchName) != -1 }) self.loadPagination(filterArray, "history-pagination") }) $('#save-button').click(function () { self.confirmPopup() // self.floodAnalysisPopup() }) }, onOpen: function onOpen() { this.init() //面板打开的时候触发 (when open this panel trigger) this.map.scene.globe.baseColor = Cesium.Color.BLACK; //切换底图 $($('div.cesium-viewer').find('.cesium-baseLayerPicker-choices')[0]).children('div:eq(0)').trigger('click'); $($('div.cesium-viewer').find('.cesium-baseLayerPicker-choices')[1]).children('div:eq(2)').trigger('click'); //设置地图初始位置 this.map.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(116.016905, 25.884684, 10000), }); }, onClose: function onClose() { //面板关闭的时候触发 (when this panel is closed trigger) this.deleteEntities(this.pointEntities) if (this.drawingPolyline) this.map.entities.remove(this.drawingPolyline); if (this.waterEntity) this.map.entities.remove(this.waterEntity) this.map.scene.globe.baseColor = Cesium.Color.WHITE; $('#hd-select option').remove() $('#smx-select option').remove() $('#sw-input').val("") $('#hd-input').val("") //清空表格数据 $('.analysis-box-list').empty(); $('.history-box-list').empty(); $('#analysis-pagination').hide() this.analysisTableList = [] }, onMinimize: function onMinimize() { this.resize(); }, onMaximize: function onMaximize() { this.resize(); }, resize: function resize() { }, destroy: function destroy() { //销毁的时候触发 //todo //do something before this func this.inherited(arguments); }, //绑定html元素,方便操作 bindHtmlElement: function () { this.analysisBtn = $('.analysis-button') this.historyBtn = $('.history-button') this.divFloodAnalysis = $('.flood-analysis') this.divFloodHistory = $('.flood-history') this.hdSelect = $('#hd-select') this.smxSelect = $('#smx-select') }, //初始化 init() { //重置html元素状态 this.divFloodHistory.hide() this.divFloodAnalysis.show() $("input[type=radio][name=middleRadio][value='realtime']").prop('checked', 'checked') this.hdSelect.hide() $('.fold-btn').addClass('open') $('.fold-btn').removeClass('close') $('.content').show() $("#sw-input").prop('disabled', true); $('#search-name').val("") this.isOpen = true this.analysisBtn.addClass('choose-button') this.analysisBtn.removeClass('unchoose-button') this.historyBtn.removeClass('choose-button') this.historyBtn.addClass('unchoose-button') this.currentHd = null this.currentSmxcode = "" //获取河段数据 this.getHdData() }, //获取河段下拉数据 getHdData() { const self = this $.ajax({ url: self.url.riverwaySelectName, type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: {}, success: function (res) { let data = res.data self.hdDataList = data self.hdSelect.find("option").remove();//添加新值 删除旧值 data.forEach(e => { let v = '' if (e.stnm) { v += '-' + e.stnm.trim() + '站' } if (e.gl_qdj) { v += '-起点距' + e.gl_qdj } self.hdSelect.append(""); }) } }); }, //获取水面线数据 getSmxData(hdid, defaultId) { const self = this $.ajax({ url: self.url.waterlineSelectName, type: 'post', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { hdid: hdid }, success: function (res) { let data = res.data self.smxDataList = data self.smxSelect.find("option").remove();//添加新值 删除旧值 if (data.length <= 0) { $('#flood-tbody').html("") $('#analysis-pagination').hide() } data.forEach(e => { self.smxSelect.append(""); if (e.smxcode == defaultId) { $("#smx-select option[value=" + e.smxcode + "] ").attr("selected", true) self.smxSelect.trigger("change") } }) } }); }, //获取点数据 getPointData(smxcode) { this.currentSmxcode = smxcode const self = this $.ajax({ url: self.url.childpage, type: 'get', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { parentId: smxcode, size: 9999999 }, success: function (res) { if (res.code == 200) { let data = res.data.records self.createPointAndLine(data,self.pointEntities) self.analysisTableList = data self.getSub(self.currentHd.id, self.currentSmxcode) } } }); }, //创建点线 createPointAndLine(data,pointEntities){ this.deleteEntities(pointEntities) // 水面线连线 let cartesians = [] for (let i = 0; i < data.length; i++) { cartesians.push(new Cesium.Cartesian3.fromDegrees(data[i].lng, data[i].lat,data[i].sw)) let temp = this.map.entities.add({ position: Cesium.Cartesian3.fromDegrees(data[i].lng, data[i].lat,data[i].sw), point: { color: Cesium.Color.RED, pixelSize: 11, //防止地形遮挡住点 disableDepthTestDistance: Number.POSITIVE_INFINITY, heightReference: Cesium.HeightReference.CLAMP_TO_GROUND }, }); // 清空使用 pointEntities.push(temp) } // 先清空 后画线 if (this.drawingPolyline){ this.map.entities.remove(this.drawingPolyline); } let lineOpts = { polyline: { positions: cartesians, clampToGround: true, width: 3, color: "#279a9a" } }; // 画线 this.drawingPolyline = this.map.entities.add(lineOpts); }, //获取历史风险图数据列表 getHistoryList() { const self = this $.ajax({ url: self.url.getHistoryList, type: 'get', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { name: "", pageSize:999999999, }, success: function (res) { if (res.code == 200) { let data = res.data.records data.forEach(e=>{ e.smxVal = JSON.parse(e.smxVal) }) self.historyTableList = data self.loadPagination(data,"history-pagination") } } }); }, /** * 加载分页器 * @param tableData 需要加载的所有数据 * @param pageElementId 分页html的id * @param tableElementId tbody id */ loadPagination(tableData, pageElementId) { if (tableData.length <= 0 && pageElementId == "analysis-pagination") { $('#analysis-pagination').hide() } if (tableData.length <= 0 && pageElementId == "history-pagination") { $('#history-pagination').hide() } let pageSize = 10 var count = Math.ceil(tableData.length / pageSize); var self = this $('#' + pageElementId).pagination({ mode: 'fixed', jump: true, coping: false, pageCount: count, callback: function (index) { var listdata = []; //显示页数 var index = (index.getCurrent() - 1) * pageSize; for (var i = index; i < index + pageSize; i++) { listdata.push(tableData[i]); if (i == tableData.length - 1) { break; } } pageElementId == "analysis-pagination" ? self.createList(listdata,"洪水淹没分析") : self.createList(listdata,"历史风险图") } }); //首次加载前11条数据 var startData = []; if (tableData.length > pageSize) { for (var i = 0; i < pageSize; i++) { startData.push(tableData[i]); } } else { for (var i = 0; i < tableData.length; i++) { startData.push(tableData[i]); } } pageElementId == "analysis-pagination" ? self.createList(startData,"洪水淹没分析") : self.createList(startData,"历史风险图") }, /** * 计算水位 * @param waterline 水面线高度 * @param number 差值 */ calculateSw(waterline, sub) { let sw = this.floatAdd(Number(waterline), Number(sub)) return sw }, //预测水位计算 getYcSub() { const self = this self.analysisTableList.forEach(e => { e.lng = Number(e.lng).toFixed(4) e.lat = Number(e.lat).toFixed(4) e.sw = self.calculateSw(e.water, $('#sw-input').val()) e.water = Number(e.water).toFixed(3) e.sw = Number(e.sw).toFixed(3) }) self.loadPagination(self.analysisTableList, "analysis-pagination") }, //实时水位计算 getSub(hdid, smxcode) { const self = this if ($('input[name=middleRadio]:checked').val() == 'realtime') { $.ajax({ url: self.url.getCzByGlCodeByGlQdj, type: 'get', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { hdId: hdid, smxcode: smxcode }, success: function (res) { if (res.code == 200) { let sub = res.data $('#sw-input').val(sub) self.analysisTableList.forEach(e => { e.lng = Number(e.lng).toFixed(4) e.lat = Number(e.lat).toFixed(4) e.sw = self.calculateSw(e.water, sub) e.water = Number(e.water).toFixed(3) e.sw = Number(e.sw).toFixed(3) }) self.loadPagination(self.analysisTableList, "analysis-pagination") } } }); } else { self.getYcSub() } }, //获取最接近水文站的值 getMin(smxcode, glQdj) { const self = this $.ajax({ url: self.url.getCoordinatesMinQdj, type: 'get', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: { smxcode:smxcode, glQdj:glQdj }, success: function (res) { if (res.code == 200) { self.currentNearPoint = res.data } } }); }, //保存历史风险图 saveHistoryData() { const self = this $.ajax({ url: self.url.saveHistoryData, type: 'get', dataType: 'json', jsonp: 'callback', jsonpCallback: 'data', data: {}, success: function (res) { if (res.code == 200) { self.getHistoryList() } } }); }, //防止出现两个小数相加出现很多0的情况 floatAdd(arg1, arg2) { var r1, r2, m; try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); return (arg1 * m + arg2 * m) / m; }, //删除地图上的标注点位 deleteEntities(entities) { entities.forEach(e => { this.map.entities.remove(e) }) entities = [] }, //评估分析弹窗 evaluatePopup(flag) { var self = this let selectSmx = this.smxDataList.filter(e=>{ return e.smxcode == this.currentSmxcode }) let isAnalysis = flag == 'analysis'?true:false let parentData = {} if (isAnalysis){ parentData.data = this.evaluateData parentData.hd = this.currentHd parentData.smx = selectSmx[0] parentData.sw = $('#sw-input').val() parentData.point = this.analysisTableList }else { parentData.data = this.evaluateData parentData.hd = this.currentSelectHistoryData.smxVal.hd parentData.smx = this.currentSelectHistoryData.smxVal.smx parentData.sw = this.currentSelectHistoryData.smxVal.sw parentData.point = this.currentSelectHistoryData.smxVal.point } var url = './corelib/common/popup/evaluateAnalysis.html' var top = ($(window).height() - 600) / 2; var left = ($(window).width() - 1300 - 340) / 2 + 340; layer.open({ title: '评估分析', type: 2, maxmin: false, //开启最大化最小化按钮 area: ['1500px', '700px'], skin: 'floodAnalysis', offset: 'auto', content: url + "?parentData=" + encodeURIComponent(JSON.stringify(parentData)),//使用encodeURIComponent转码,避免中文字符乱码,避免url截取错误 id: "floodAnalysisLayer", closeBtn: 1, success:function (layero,index) { //绑定父子之间的关系,用于数据传递,缺少则无法传递 var body = layer.getChildFrame("body", index); //得到iframe页的窗口对象 var iframeWin = window[layero.find('iframe')[0]['name']]; if (isAnalysis){ iframeWin.$('#save-btn').show() }else { iframeWin.$('#save-btn').hide() } } }); }, //http://dgrid.io/tutorials/1.0/hello_dgrid/ 创建表格 createList: function (dataList, txt) { const self = this var CustomGrid = declare([Grid, Keyboard, Selection,Editor]); var column, tab, moon, dauy; var formatter = function (value,object) { if (self.currentNearPoint.id == object.id) { return '' + value + '' } else { return value } } if (txt == "洪水淹没分析") { $('.analysis-box-list').empty(); column = { location: { label:'位置', formatter:formatter }, origin: { label:'起点距', formatter:formatter }, water: { label:'水面线', formatter:formatter }, sw: { label:'水位', formatter:formatter }, lng:{ label:'经度', formatter:formatter }, lat:{ label:'纬度', formatter:formatter }, } tab = 'analysis-tab1-grid' } else if (txt == "历史风险图") { $('.history-box-list').empty(); column = { // radio:{ label: "", field: "radio", editor: 'radio' }, name: '名称', } tab = 'history-tab2-grid' } var grid = new CustomGrid({ columns: column, selectionMode: 'single', // for Selection; only select a single row at a time cellNavigation: false, // for Keyboard; allow only row-level keyboard navigation }, tab); grid.startup(); //change事件 // grid.on("dgrid-datachange", function(evt){ // //获取行数据 // let data = evt.cell.row.data // }); if (this.dgridSelectEvent){ this.dgridSelectEvent.remove() } this.dgridSelectEvent = grid.on("dgrid-select", function(evt){ //获取行数据 let data = evt.rows[0].data self.currentSelectHistoryData = data if (data.smxVal.point.length>0){ self.deleteEntities(self.pointEntities) if (self.drawingPolyline) self.map.entities.remove(self.drawingPolyline); if (self.waterEntity) self.map.entities.remove(self.waterEntity) $('#sw-input').val("") $('#hd-input').val("") $('#smx-select option').remove() //清空表格数据 $('.analysis-box-list').empty(); $('#analysis-pagination').hide() self.analysisTableList = [] self.createPointAndLine(data.smxVal.point,self.pointEntities) self.map.camera.flyTo({ destination: Cesium.Cartesian3.fromDegrees(data.lon, data.lat, 50000), }); self.drawWater('history') } }); grid.renderArray(dataList); }, // 洪水淹没效果 drawWater(flag) { //地图定位 // this.map.camera.flyTo({ // destination: Cesium.Cartesian3.fromDegrees(115.93791, 25.989108, 5000), // }); //显示进度条 $('.dong-progress .container #progress_bar').width(0); $('.dong-progress').stop().hide(); this.showWater = true this.waterEntity && this.map.entities.remove(this.waterEntity) const waterCoord = [116.0072, 25.9058, 100, 116.0546, 25.9012, 100 , 116.0457, 25.8611, 100, 115.9859, 25.8740 ,100] let startHeight = 169 const targetHeight = 200 this.waterEntity = this.map.entities.add({ polygon: { hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(waterCoord), material: Cesium.Color.fromBytes(64, 157, 253, 200), perPositionHeight: true, extrudedHeight: new Cesium.CallbackProperty(() => { return startHeight }, false) } }) const waterInterval = setInterval(() => { if (startHeight < targetHeight) { startHeight += 5 $('.dong-progress').stop().show(); // 总长度 var totalWidth = $('.dong-progress .container').width(); // 过度长度 var excessiveWidth = totalWidth / 100; var watchWidth = 0; // 进度条的定时器 var proTime = setInterval(function () { watchWidth += excessiveWidth; if (watchWidth > totalWidth) { watchWidth = totalWidth; } $('.dong-progress .container #progress_bar').width(watchWidth); }, 22); if (startHeight >= targetHeight) { startHeight = targetHeight clearInterval(waterInterval) clearInterval(proTime); //隐藏进度条 $('.dong-progress .container #progress_bar').width(0); $('.dong-progress').stop().hide(); this.showWater = false this.evaluatePopup(flag) } // 使用该方式会闪烁,改用 Cesium.CallbackProperty 平滑 // this.waterEntity.polygon.extrudedHeight = startHeight } }, 1000*0.5) } }); });