From 3ea9a42dfb1f6ef13a9a4c81f5843383a3be3e1c Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Thu, 09 Feb 2023 08:46:52 +0800
Subject: [PATCH] 洪水淹没静态页面
---
widgets/FloodAnalysis/Widget.html | 112 ++-
widgets/Tool/Widget.js | 2
widgets/FloodAnalysis/css/style.css | 312 +++-----
widgets/FloodAnalysis/nls/zh-cn/strings.js | 2
widgets/FloodAnalysis/Widget.js | 686 ++++---------------
widgets/FloodAnalysis/css/style copy2.css | 250 +++++++
widgets/FloodAnalysis/Widget copy2.html | 48 +
widgets/FloodAnalysis/Widget copy2.js | 642 ++++++++++++++++++
8 files changed, 1,279 insertions(+), 775 deletions(-)
diff --git a/widgets/FloodAnalysis/Widget copy2.html b/widgets/FloodAnalysis/Widget copy2.html
new file mode 100644
index 0000000..f44f4f0
--- /dev/null
+++ b/widgets/FloodAnalysis/Widget copy2.html
@@ -0,0 +1,48 @@
+<div>
+ <div class="analysis-header">
+ <i></i> 洪水淹没分析
+ </div>
+ <div class="dong">
+ <ul>
+ <li><span>分析区域:</span><input id="dong_draw" type="button" value="绘制区域"></li>
+ <li><span>最低海拔(米):</span><input type="text" id="dong_min_height"></li>
+ <li><span>最高海拔(米):</span><input type="text" id="dong_max_height"></li>
+ <li><span>淹没速度(米/秒):</span><input type="text" id='dong_time' value='0.5'></li>
+ <li><input id='dong_start' type="button" value="开始分析"><input id='dong_delet' type="button" value="清除"></li>
+ </ul>
+ </div>
+ <p>what why no sea</p>
+ <div class="dong-echarts" id='dong_echarts'>
+
+ </div>
+ <div class='dong-progress'>
+ <h2>分析结果中,请稍等...</h2>
+ <span class="container">
+ <span id="progress_bar" class="h-100P bar"></span>
+ </span>
+ </div>
+ <div class="storage-capacity-curve" id="storage_echarts">
+ </div>
+ <div class="flood-detail">
+ <div class="flood-detail-header">
+ <i></i> 洪水淹没详情
+ </div>
+
+ <div class="flood-detail-content">
+ <div class="flood-detail-text">
+ <div>
+ <span>0-3m淹没面积:</span><span>10km²</span>
+ </div>
+ <div>
+ <span>1-2m淹没面积:</span><span>20km²</span>
+ </div>
+ <div>
+ <span>>3m淹没面积:</span><span>22km²</span>
+ </div>
+ </div>
+ <div class="flood-detail-button">
+ <input type="button" id="flood-detail-ckxq" value="查看详情" />
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/widgets/FloodAnalysis/Widget copy2.js b/widgets/FloodAnalysis/Widget copy2.js
new file mode 100644
index 0000000..7b042a4
--- /dev/null
+++ b/widgets/FloodAnalysis/Widget copy2.js
@@ -0,0 +1,642 @@
+///////////////////////////////////////////////////////////////////////////
+// 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', '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, RequestMemory, createSyncStore, echarts, layer, turf) {
+ return declare([BaseWidget], {
+ baseClass: 'jimu-widget-FloodAnalysis',
+ name: 'FloodAnalysis',
+ //人员数据点位
+ peoplePositionArray: [],
+ peoplePositionEntity:[],
+ //绘制多边形的顶点经纬度
+ polygonPositionArray: [],
+ startup: function startup() {
+ // 数组用于存放添加点的Id删除实体点的时候会用到
+ var pointId = [];
+
+ // 鼠标事件
+ var waterEntity;
+ // 点击绘制按钮开始绘制
+ var that = this;
+ var yanmo;
+ var flag = false;
+ var flagScend = false;
+ // 海拔
+ var altitude = [];
+ var drawingMode = 'polygon';
+ var activeShape;
+ var boildOne = null;
+ var boildTwo = null;
+ var boildThree = null;
+ // 向三维场景中添加的点的集合
+ var tempPoints = [];
+
+ var positions = [];
+ var handler = new Cesium.ScreenSpaceEventHandler(that.map.scene.canvas);
+
+ var shape;
+ //打开页面,隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
+ $('#dong_start').css('visibility', 'hidden')
+ $('#dong_draw').click(function () {
+ that.deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity);
+ //隐藏详情框
+ that.showDetail(false)
+ that.clearData()
+ $('#dong_time').val(0.5);
+ $('.dong-progress .container #progress_bar').width(0);
+ $('.dong-progress').stop().hide();
+ $('#dong_echarts').stop().hide();
+ $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
+ //打开页面,隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
+ $('#dong_start').css('visibility', 'hidden')
+ //if (handler != null) handler.destroy();
+ handler = new Cesium.ScreenSpaceEventHandler(that.map.scene.canvas);
+
+ function drawShape(positionData) {
+ if (drawingMode == 'polygon') {
+ shape = that.map.entities.add({
+ polygon: {
+ hierarchy: positionData,
+ material: Cesium.Color.fromBytes(252, 193, 10, 130)
+ }
+ });
+ }
+ that.fixedShape = shape;
+
+ return shape;
+ }
+
+ clearInterval(yanmo);
+ yanmo = null;
+ positions = [];
+ var polygon = null;
+ var cartesian = null;
+ var floatingPoint; //浮动点
+ var activeShapePoints = [];
+ var active = null;
+ tempPoints = [];
+ altitude = [];
+ that.map.scene.globe.depthTestAgainstTerrain = false;
+
+ // handler = new Cesium.ScreenSpaceEventHandler(that.map.scene.canvas);
+ // 取消双击事件-追踪该位置
+ that.map.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
+
+ // 鼠标左键点击事件
+ handler.setInputAction(function (movement) {
+ // 给鼠标点击增加的点添加随机的ID便于删除
+ var randomId = Math.random() * 100 + 8 + (Math.random() * 500 + 102);
+
+ var ray = that.map.camera.getPickRay(movement.position);
+ cartesian = that.map.scene.globe.pick(ray, that.map.scene);
+ if (positions.length == 0) {
+ positions.push(cartesian.clone());
+ flagScend = true;
+ }
+ // positions.pop();
+ positions.push(cartesian);
+ // 向三维场景中添加点
+ var cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 1]);
+ var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
+ var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
+ var heightString = cartographic.height;
+ tempPoints.push({
+ lon: longitudeString,
+ lat: latitudeString,
+ hei: heightString
+ });
+ altitude.push(Math.round(cartographic.height));
+ if (Cesium.defined(cartesian)) {
+ if (activeShapePoints.length === 0) {
+ floatingPoint = that.map.entities.add({
+ // 给实体点添加ID
+ id: '1a-2b-3c',
+ name: '多边形面积',
+ position: positions[positions.length - 1],
+ point: {
+ pixelSize: 6,
+ color: Cesium.Color.RED,
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
+ }
+ });
+ pointId.push('1a-2b-3c');
+
+ activeShapePoints.push(cartesian);
+ var dynamicPositions = new Cesium.CallbackProperty(function () {
+ if (drawingMode === 'polygon') {
+ return new Cesium.PolygonHierarchy(activeShapePoints);
+ }
+ return activeShapePoints;
+ }, false);
+ active = drawShape(dynamicPositions); //绘制动态图
+ }
+ activeShapePoints.push(cartesian);
+ floatingPoint = that.map.entities.add({
+ // 给实体点添加ID
+ id: randomId,
+ name: '多边形面积',
+ position: positions[positions.length - 1],
+ point: {
+ pixelSize: 6,
+ color: Cesium.Color.RED,
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
+ }
+ });
+
+ pointId.push(randomId);
+ }
+ }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+
+ // 鼠标移动事件
+ handler.setInputAction(function (event) {
+ if (positions.length == 0) {
+ that.map.entities.remove(boildOne);
+ var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
+ var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
+ boildOne = that.map.entities.add({
+ position: newPosition,
+ label: {
+ show: true,
+ text: '单击开始绘制',
+ font: '16px',
+ pixelOffset: new Cesium.Cartesian2(80, 0),
+ showBackground: true,
+ backgroundColor: Cesium.Color.fromBytes(126, 126, 126, 210)
+ }
+ });
+ }
+ if (positions.length == 2) {
+ that.map.entities.remove(boildOne);
+ that.map.entities.remove(boildTwo);
+ var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
+ var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
+ boildTwo = that.map.entities.add({
+ position: newPosition,
+ label: {
+ show: true,
+ text: '单击增加点',
+ font: '16px',
+ pixelOffset: new Cesium.Cartesian2(80, 0),
+ showBackground: true,
+ backgroundColor: Cesium.Color.fromBytes(126, 126, 126, 210)
+ }
+ });
+ }
+ if (positions.length > 2) {
+ that.map.entities.remove(boildOne);
+ that.map.entities.remove(boildTwo);
+ that.map.entities.remove(boildThree);
+ var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
+ var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
+ boildThree = that.map.entities.add({
+ position: newPosition,
+ label: {
+ show: true,
+ text: '单击增加点,右键点击完成绘制',
+ font: '16px',
+ pixelOffset: new Cesium.Cartesian2(120, 0),
+ showBackground: true,
+ backgroundColor: Cesium.Color.fromBytes(126, 126, 126, 210)
+ }
+ });
+ }
+
+ if (Cesium.defined(floatingPoint)) {
+ var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
+ var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
+ if (Cesium.defined(newPosition)) {
+ floatingPoint.position.setValue(newPosition);
+ activeShapePoints.pop();
+ activeShapePoints.push(newPosition);
+ }
+ }
+ }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+ // 鼠标右键点击事件
+ handler.setInputAction(function (movement) {
+ var cartographic = Cesium.Cartographic.fromCartesian(that.map.scene.globe.pick(that.map.camera.getPickRay(movement.position), that.map.scene));
+ // 向三维场景中添加点
+ var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
+ var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
+ var heightString = cartographic.height;
+ tempPoints.push({
+ lon: longitudeString,
+ lat: latitudeString,
+ hei: heightString
+ });
+ that.polygonPositionArray = tempPoints
+ positions.push(activeShapePoints[activeShapePoints.length - 1]);
+ if (positions.length >= 2) {
+ if (!Cesium.defined(polygon)) {
+ polygon = new PolygonPrimitive(positions);
+ } else {
+ positions.pop();
+ positions.push(cartesian);
+ }
+ }
+ if (activeShapePoints.length) {
+ activeShape = drawShape(activeShapePoints); //绘制最终图
+ }
+ // that.map.entities.remove(floatingPoint);
+ that.map.entities.remove(active);
+ that.map.entities.remove(boildOne);
+ that.map.entities.remove(boildTwo);
+ that.map.entities.remove(boildThree);
+ if (!flagScend) return;
+ flagScend = false;
+ altitude.push(Math.round(cartographic.height));
+ altitude.sort(function (a, b) {
+ if (a > b) return 1; else if (a < b) return -1; else return 0;
+ });
+ $('#dong_max_height').val(altitude[altitude.length - 1]);
+ $('#dong_min_height').val(altitude[0]);
+ handler.destroy();
+ flag = true;
+ //结束绘制显示分析按钮
+ $('#dong_start').css('visibility', 'visible')
+ return;
+ }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+
+ var PolygonPrimitive = function () {
+ function _(positions) {
+ this.options = {
+ name: '多边形',
+ polygon: {
+ hierarchy: [],
+ material: Cesium.Color.WHITE.withAlpha(0)
+ }
+ };
+
+ this.positions = positions;
+ this._init();
+ }
+
+ _.prototype._init = function () {
+ var _self = this;
+ //实时更新polygon.hierarchy
+ this.options.polygon.hierarchy = new Cesium.CallbackProperty(function () {
+ return new Cesium.PolygonHierarchy(positions);
+ }, false);
+ waterEntity = that.map.entities.add(this.options);
+ that.fixedWaterEntity = waterEntity;
+ };
+ return _;
+ }();
+ });
+
+ // 点击开始分析按钮,开始分析
+ $('#dong_start').click(function () {
+ //宽度设置为0 隐藏进度条
+ $('.dong-progress .container #progress_bar').width(0);
+ //隐藏div
+ $('.dong-progress').stop().hide();
+ $('#dong_echarts').stop().hide();
+ $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
+ if (flag != true) {
+ if (yanmo != null) {
+ layer.msg('请等待绘制完成', {
+
+ time: 1000
+ });
+ return;
+ }
+ layer.msg('请先选择绘制区域', {
+
+ time: 1000
+ });
+ return;
+ }
+ // 提取坐标信息
+ var list = waterEntity.polygon.hierarchy.getValue().positions;
+ // 存放坐标信息,做请求数据使用
+ var echartRings = [[]];
+
+ // 处理坐标信息,将世界坐标转换成经纬度
+ for (var i = 1; i < list.length; i++) {
+ var cartographic = Cesium.Cartographic.fromCartesian(list[i]);
+ var lat = Cesium.Math.toDegrees(cartographic.latitude);
+ var lng = Cesium.Math.toDegrees(cartographic.longitude);
+ echartRings[0].push([lng, lat]);
+ }
+
+ that.map.entities.remove(activeShape);
+ // 最高海拔
+ var maxHet = Number($('#dong_max_height').val());
+ // 最低海拔
+ var minHet = Number($('#dong_min_height').val());
+ // 每秒上升海拔
+ var time = Number($('#dong_time').val());
+ // 动态获取最低海拔
+ $('#dong_min_height').change(function () {
+ minHet = $(this).val();
+ });
+
+ // 总淹没体积
+ var textArea = parseInt(getArea(tempPoints) * (maxHet - minHet) / 100000);
+ var seriesData = [];
+ var altitude = (maxHet - minHet) / 20;
+ var altitudeHet = 0;
+
+ // 1秒后开始进入淹没分析
+ setTimeout(function () {
+ flag = false;
+ if (waterEntity) {
+ that.map.scene.globe.depthTestAgainstTerrain = true;
+ waterEntity.polygon.perPositionHeight = true, waterEntity.polygon.material = Cesium.Color.fromBytes(33, 122, 193, 220);
+ var h = minHet - 50 || altitude[0] - 50;
+ waterEntity.polygon.extrudedHeight = minHet - 50 || altitude[0] - 50; //需要提前设置 不然会全部出现
+ yanmo = setInterval(function () {
+ h = h + time || 1;
+ if (h >= (maxHet || altitude[altitude.length - 1])) {
+ h = maxHet || altitude[altitude.length - 1]; //给个最大值
+ waterEntity.polygon.extrudedHeight = h;
+ clearTimeout(yanmo);
+ flag = true;
+
+ // //显示div
+ // $('.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);
+
+ return;
+ }
+ waterEntity.polygon.extrudedHeight = h;
+
+ }, 100);
+ that.showDetail(true)
+
+ }
+ }, 1000);
+
+ });
+
+ $('#dong_delet').click(function () {
+ that.showDetail(false)
+ that.clearData()
+ that.deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity);
+
+ handler.destroy();
+ $('.dong-progress .container #progress_bar').width(0);
+ $('.dong-progress').stop().hide();
+ $('#dong_echarts').stop().hide();
+ $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
+ //隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
+ $('#dong_start').css('visibility', 'hidden')
+ clearInterval(yanmo);
+ yanmo = null;
+ });
+
+ $('#flood-detail-ckxq').click(function () {
+ that.floodAnalysisPopup()
+ })
+
+ var radiansPerDegree = Math.PI / 180.0; //角度转化为弧度(rad)
+ var degreesPerRadian = 180.0 / Math.PI; //弧度转化为角度
+ function getArea(points) {
+ var res = 0;
+ //拆分三角曲面
+ for (var i = 0; i < points.length - 2; i++) {
+ var j = (i + 1) % points.length;
+ var k = (i + 2) % points.length;
+ var totalAngle = Angle(points[i], points[j], points[k]);
+
+ var dis_temp1 = distance(positions[i], positions[j]);
+ var dis_temp2 = distance(positions[j], positions[k]);
+ res += dis_temp1 * dis_temp2 * Math.abs(Math.sin(totalAngle));
+ }
+
+ return (res / 1000000.0).toFixed(4);
+ }
+
+ /*角度*/
+ function Angle(p1, p2, p3) {
+ var bearing21 = Bearing(p2, p1);
+ var bearing23 = Bearing(p2, p3);
+ var angle = bearing21 - bearing23;
+ if (angle < 0) {
+ angle += 360;
+ }
+ return angle;
+ }
+
+ /*方向*/
+ function Bearing(from, to) {
+ var lat1 = from.lat * radiansPerDegree;
+ var lon1 = from.lon * radiansPerDegree;
+ var lat2 = to.lat * radiansPerDegree;
+ var lon2 = to.lon * radiansPerDegree;
+ var angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
+ if (angle < 0) {
+ angle += Math.PI * 2.0;
+ }
+ angle = angle * degreesPerRadian; //角度
+ return angle;
+ }
+
+ //计算距离
+ function distance(point1, point2) {
+ var point1cartographic = Cesium.Cartographic.fromCartesian(point1);
+ var point2cartographic = Cesium.Cartographic.fromCartesian(point2);
+ /**根据经纬度计算出距离**/
+ var geodesic = new Cesium.EllipsoidGeodesic();
+ geodesic.setEndPoints(point1cartographic, point2cartographic);
+ var s = geodesic.surfaceDistance;
+ //返回两点之间的距离
+ s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
+ return s;
+ }
+
+ this.closeDeleteEntity = function () {
+ handler.destroy();
+ that.deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity);
+ };
+ },
+
+ onOpen: function onOpen() {
+ //面板打开的时候触发 (when open this panel trigger)
+ this.map.scene.globe.baseColor = Cesium.Color.BLACK;
+
+ //初始化点
+ this.addPoint()
+ //切换底图
+ $($('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() {
+ this.closeDeleteEntity();
+ //面板关闭的时候触发 (when this panel is closed trigger)
+
+ $('.dong-progress .container #progress_bar').width(0);
+ $('.dong-progress').stop().hide();
+ $('#dong_echarts').stop().hide();
+ $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
+ //隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
+ $('#dong_start').css('visibility', 'hidden')
+ //隐藏详情框
+ this.showDetail(false)
+ this.peoplePositionEntity.forEach(e=>{
+ this.map.entities.remove(e)
+ })
+ this.map.scene.globe.baseColor = Cesium.Color.WHITE;
+ },
+
+ 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);
+ },
+
+ deleteEntitys: function deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity) {
+ if (pointId !== []) {
+ for (var i = 0; i < pointId.length; i++) {
+ that.map.entities.removeById(pointId[i]);
+ }
+
+ pointId = [];
+ }
+ that.map.entities.remove(shape);
+ that.map.entities.remove(boildOne);
+ that.map.entities.remove(boildTwo);
+ that.map.entities.remove(boildThree);
+ if (waterEntity != null) {
+ that.map.entities.removeById(waterEntity._id);
+ }
+ },
+
+ //添加点
+ addPoint: function () {
+ const url = './widgets/FloodAnalysis/data.json'
+ this.getJsonUrl(url)
+ },
+
+ //获取json对象,测试用
+ getJsonUrl: function getJsonUrl(url) {
+ var self = this;
+ $.ajax({
+ url: url,
+ dataType: 'json',
+ type: 'get',
+ success: function success(data) {
+ const viewer = self.map
+ var dataArray = data.data
+ dataArray.forEach(e => {
+ e.house = Number(e.house)
+ e.people = Number(e.people)
+ e.area = Number(e.area)
+ e.money = Number(e.money)
+ })
+ self.peoplePositionArray = []
+ self.peoplePositionArray = dataArray
+ for (let i = 0; i < dataArray.length; i++) {
+ var temp = viewer.entities.add({
+ position: Cesium.Cartesian3.fromDegrees(dataArray[i].LGTD, dataArray[i].LTTD),
+ point: {
+ color: Cesium.Color.RED,
+ pixelSize: 16,
+ //防止地形遮挡住点
+ disableDepthTestDistance: Number.POSITIVE_INFINITY,
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
+ },
+ });
+ self.peoplePositionEntity.push(temp)
+ }
+ }
+ });
+ },
+
+ //是否显示详情框
+ showDetail: function (show) {
+ //显示详情
+ if (show) {
+ $('.flood-detail').show()
+ } else {
+ $('.flood-detail').hide()
+ }
+ },
+
+ //洪水分析弹窗
+ floodAnalysisPopup: function () {
+ var self = this
+ var inPolygon = []
+ for (let i = 0; i < this.peoplePositionArray.length; i++) {
+ let isIn = this.isPointInPolygon(this.peoplePositionArray[i])
+ if (isIn) {
+ inPolygon.push(this.peoplePositionArray[i])
+ }
+ }
+ var inPolygonStr = JSON.stringify(inPolygon)
+
+ var url = './corelib/common/popup/floodAnalysis.html';
+ var urlEvaluate = './corelib/common/popup/evaluateAnalysis.html'
+ var top = ($(window).height() - 750) / 2;
+ var left = ($(window).width() - 1300 - 340) / 2 + 340;
+ layer.open({
+ title: '评估分析',
+ type: 2,
+ maxmin: false, //开启最大化最小化按钮
+ area: ['1100px', '800px'],
+ skin: 'floodAnalysis',
+ offset: [top, left],
+ content: urlEvaluate + "?data=" + encodeURIComponent(inPolygonStr),//使用encodeURIComponent转码,避免中文字符乱码,避免url截取错误
+ id: "floodAnalysisLayer",
+ closeBtn: 1,
+ });
+ },
+
+ //判断点是否在多边形内部
+ isPointInPolygon: function (point) {
+ //获取经纬度
+ var polygonPosition = this.polygonPositionArray
+ //turf要求首尾闭合
+ var turfPolygon = []
+ polygonPosition.forEach(e => {
+ var temp = [e.lon, e.lat]
+ turfPolygon.push(temp)
+ })
+ turfPolygon.push([polygonPosition[0].lon, polygonPosition[0].lat])
+
+ var poly = turf.polygon([turfPolygon])
+ var pt = turf.point([point.LGTD, point.LTTD])
+ return turf.booleanPointInPolygon(pt, poly)
+ },
+
+ //清除框内数据
+ clearData:function (){
+ $('#dong_max_height').val(0);
+ $('#dong_min_height').val(0);
+ },
+ });
+});
diff --git a/widgets/FloodAnalysis/Widget.html b/widgets/FloodAnalysis/Widget.html
index f44f4f0..36c85f5 100644
--- a/widgets/FloodAnalysis/Widget.html
+++ b/widgets/FloodAnalysis/Widget.html
@@ -1,48 +1,84 @@
<div>
- <div class="analysis-header">
- <i></i> 洪水淹没分析
+ <div class="flood-top">
+ <input class="analysis-button" type="button" value="洪水淹没分析" />
+ <input class="history-button" type="button" value="历史风险图" />
</div>
- <div class="dong">
- <ul>
- <li><span>分析区域:</span><input id="dong_draw" type="button" value="绘制区域"></li>
- <li><span>最低海拔(米):</span><input type="text" id="dong_min_height"></li>
- <li><span>最高海拔(米):</span><input type="text" id="dong_max_height"></li>
- <li><span>淹没速度(米/秒):</span><input type="text" id='dong_time' value='0.5'></li>
- <li><input id='dong_start' type="button" value="开始分析"><input id='dong_delet' type="button" value="清除"></li>
- </ul>
- </div>
- <p>what why no sea</p>
- <div class="dong-echarts" id='dong_echarts'>
-
- </div>
- <div class='dong-progress'>
- <h2>分析结果中,请稍等...</h2>
- <span class="container">
- <span id="progress_bar" class="h-100P bar"></span>
- </span>
- </div>
- <div class="storage-capacity-curve" id="storage_echarts">
- </div>
- <div class="flood-detail">
- <div class="flood-detail-header">
- <i></i> 洪水淹没详情
- </div>
-
- <div class="flood-detail-content">
- <div class="flood-detail-text">
- <div>
- <span>0-3m淹没面积:</span><span>10km²</span>
+ <div class="flood-middle">
+ <div class="flood-analysis">
+ <div class="select-box">
+ <div class="hd">
+ <label for="hd-select">河段</label>
+ <select id="hd-select" class="hd-select" name="hd" value="1">
+ </select>
+ <!--做模糊查询选择框时使用-->
+<!-- </select>-->
+<!-- <input type="text" name="hd-input" id="hd-input" class="hd-input" placeholder="请选择或输入" />-->
+<!-- <select name="hd-select" id="hd-select" size="10" style="display:none;">-->
+<!-- <option value="1">1</option>-->
+<!-- </select>-->
</div>
- <div>
- <span>1-2m淹没面积:</span><span>20km²</span>
+ <div class="smx">
+ <label for="smx-select">水面线</label>
+ <select id="smx-select" class="smx-select" name="smx">
+ </select>
</div>
- <div>
- <span>>3m淹没面积:</span><span>22km²</span>
+ <div class="sw">
+ <label for="sw-input">水位</label>
+ <input id="sw-input" class="sw-input" type="text" name="word" autocomplete="off" maxlength="256"/>
</div>
+ <span class="tip">正数为水位上涨,负数为水位下降</span>
</div>
- <div class="flood-detail-button">
- <input type="button" id="flood-detail-ckxq" value="查看详情" />
+ <div class="radio-box">
+ <input id="realtime" type="radio" name="middleRadio" value="realtime" checked='checked'>实时
+ <input id="forecast" type="radio" name="middleRadio" value="forecast">预测
+ </div>
+ <div class="table-box">
+ <table>
+ <thead class="flood-table-thead table-thead">
+ <tr>
+ <th>
+ <div>位置</div>
+ </th>
+ <th>
+ <div>起点距</div>
+ </th>
+ <th>
+ <div>经纬度</div>
+ </th>
+ <th>
+ <div>水面线</div>
+ </th>
+ <th>
+ <div>水位</div>
+ </th>
+ </tr>
+ </thead>
+ <tbody id="flood-tbody" class="table-tbody flood-tbody"></tbody>
+ </table>
+ </div>
+ </div>
+ <div class="flood-history">
+ <div class="search-box">
+ <label for="search-name">名称:</label>
+ <input id="search-name" class="search-name-input" type="text" name="word" autocomplete="off" maxlength="256" placeholder="请输入筛选名称"/>
+ <input class="search-button" type="button" value="查 询" />
+ </div>
+ <div class="table-box">
+ <table>
+ <thead class="flood-table-thead table-thead">
+ <tr>
+ <th style="width: 85px;">
+
+ </th>
+ <th>
+ <div>名称</div>
+ </th>
+ </tr>
+ </thead>
+ <tbody id="flood-history-tbody" class="table-tbody flood-tbody"></tbody>
+ </table>
</div>
</div>
</div>
+ <div class="flood-bottom"></div>
</div>
diff --git a/widgets/FloodAnalysis/Widget.js b/widgets/FloodAnalysis/Widget.js
index 7b042a4..3182c94 100644
--- a/widgets/FloodAnalysis/Widget.js
+++ b/widgets/FloodAnalysis/Widget.js
@@ -8,468 +8,84 @@
name: 'FloodAnalysis',
//人员数据点位
peoplePositionArray: [],
- peoplePositionEntity:[],
+ peoplePositionEntity: [],
//绘制多边形的顶点经纬度
polygonPositionArray: [],
+ //html元素
+ analysisBtn: null,
+ historyBtn: null,
+ divFloodAnalysis: null,
+ divFloodHistory: null,
+ topRadioGroup: null,
+ middleRadioGroup: null,
+ hdSelect: null,
+ smxSelect: null,
+ divSwInput: null,
+ spanTip: null,
+ //河段下拉列表
+ hdDataList: [],
startup: function startup() {
- // 数组用于存放添加点的Id删除实体点的时候会用到
- var pointId = [];
-
- // 鼠标事件
- var waterEntity;
- // 点击绘制按钮开始绘制
- var that = this;
- var yanmo;
- var flag = false;
- var flagScend = false;
- // 海拔
- var altitude = [];
- var drawingMode = 'polygon';
- var activeShape;
- var boildOne = null;
- var boildTwo = null;
- var boildThree = null;
- // 向三维场景中添加的点的集合
- var tempPoints = [];
-
- var positions = [];
- var handler = new Cesium.ScreenSpaceEventHandler(that.map.scene.canvas);
-
- var shape;
- //打开页面,隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
- $('#dong_start').css('visibility', 'hidden')
- $('#dong_draw').click(function () {
- that.deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity);
- //隐藏详情框
- that.showDetail(false)
- that.clearData()
- $('#dong_time').val(0.5);
- $('.dong-progress .container #progress_bar').width(0);
- $('.dong-progress').stop().hide();
- $('#dong_echarts').stop().hide();
- $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
- //打开页面,隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
- $('#dong_start').css('visibility', 'hidden')
- //if (handler != null) handler.destroy();
- handler = new Cesium.ScreenSpaceEventHandler(that.map.scene.canvas);
-
- function drawShape(positionData) {
- if (drawingMode == 'polygon') {
- shape = that.map.entities.add({
- polygon: {
- hierarchy: positionData,
- material: Cesium.Color.fromBytes(252, 193, 10, 130)
- }
- });
- }
- that.fixedShape = shape;
-
- return shape;
+ var self = this
+ this.bindHtmlElement()
+ this.middleRadioGroup.change(function () {
+ if (this.value == "realtime") {
+ self.divSwInput.hide()
+ self.spanTip.hide()
+ } else {
+ self.divSwInput.show()
+ self.spanTip.show()
}
-
- clearInterval(yanmo);
- yanmo = null;
- positions = [];
- var polygon = null;
- var cartesian = null;
- var floatingPoint; //浮动点
- var activeShapePoints = [];
- var active = null;
- tempPoints = [];
- altitude = [];
- that.map.scene.globe.depthTestAgainstTerrain = false;
-
- // handler = new Cesium.ScreenSpaceEventHandler(that.map.scene.canvas);
- // 取消双击事件-追踪该位置
- that.map.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
-
- // 鼠标左键点击事件
- handler.setInputAction(function (movement) {
- // 给鼠标点击增加的点添加随机的ID便于删除
- var randomId = Math.random() * 100 + 8 + (Math.random() * 500 + 102);
-
- var ray = that.map.camera.getPickRay(movement.position);
- cartesian = that.map.scene.globe.pick(ray, that.map.scene);
- if (positions.length == 0) {
- positions.push(cartesian.clone());
- flagScend = true;
- }
- // positions.pop();
- positions.push(cartesian);
- // 向三维场景中添加点
- var cartographic = Cesium.Cartographic.fromCartesian(positions[positions.length - 1]);
- var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
- var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
- var heightString = cartographic.height;
- tempPoints.push({
- lon: longitudeString,
- lat: latitudeString,
- hei: heightString
- });
- altitude.push(Math.round(cartographic.height));
- if (Cesium.defined(cartesian)) {
- if (activeShapePoints.length === 0) {
- floatingPoint = that.map.entities.add({
- // 给实体点添加ID
- id: '1a-2b-3c',
- name: '多边形面积',
- position: positions[positions.length - 1],
- point: {
- pixelSize: 6,
- color: Cesium.Color.RED,
- heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
- }
- });
- pointId.push('1a-2b-3c');
-
- activeShapePoints.push(cartesian);
- var dynamicPositions = new Cesium.CallbackProperty(function () {
- if (drawingMode === 'polygon') {
- return new Cesium.PolygonHierarchy(activeShapePoints);
- }
- return activeShapePoints;
- }, false);
- active = drawShape(dynamicPositions); //绘制动态图
- }
- activeShapePoints.push(cartesian);
- floatingPoint = that.map.entities.add({
- // 给实体点添加ID
- id: randomId,
- name: '多边形面积',
- position: positions[positions.length - 1],
- point: {
- pixelSize: 6,
- color: Cesium.Color.RED,
- heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
- }
- });
-
- pointId.push(randomId);
- }
- }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-
- // 鼠标移动事件
- handler.setInputAction(function (event) {
- if (positions.length == 0) {
- that.map.entities.remove(boildOne);
- var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
- var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
- boildOne = that.map.entities.add({
- position: newPosition,
- label: {
- show: true,
- text: '单击开始绘制',
- font: '16px',
- pixelOffset: new Cesium.Cartesian2(80, 0),
- showBackground: true,
- backgroundColor: Cesium.Color.fromBytes(126, 126, 126, 210)
- }
- });
- }
- if (positions.length == 2) {
- that.map.entities.remove(boildOne);
- that.map.entities.remove(boildTwo);
- var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
- var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
- boildTwo = that.map.entities.add({
- position: newPosition,
- label: {
- show: true,
- text: '单击增加点',
- font: '16px',
- pixelOffset: new Cesium.Cartesian2(80, 0),
- showBackground: true,
- backgroundColor: Cesium.Color.fromBytes(126, 126, 126, 210)
- }
- });
- }
- if (positions.length > 2) {
- that.map.entities.remove(boildOne);
- that.map.entities.remove(boildTwo);
- that.map.entities.remove(boildThree);
- var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
- var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
- boildThree = that.map.entities.add({
- position: newPosition,
- label: {
- show: true,
- text: '单击增加点,右键点击完成绘制',
- font: '16px',
- pixelOffset: new Cesium.Cartesian2(120, 0),
- showBackground: true,
- backgroundColor: Cesium.Color.fromBytes(126, 126, 126, 210)
- }
- });
- }
-
- if (Cesium.defined(floatingPoint)) {
- var pick1 = new Cesium.Cartesian2(event.endPosition.x, event.endPosition.y);
- var newPosition = that.map.scene.globe.pick(viewer.camera.getPickRay(pick1), that.map.scene);
- if (Cesium.defined(newPosition)) {
- floatingPoint.position.setValue(newPosition);
- activeShapePoints.pop();
- activeShapePoints.push(newPosition);
- }
- }
- }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
-
- // 鼠标右键点击事件
- handler.setInputAction(function (movement) {
- var cartographic = Cesium.Cartographic.fromCartesian(that.map.scene.globe.pick(that.map.camera.getPickRay(movement.position), that.map.scene));
- // 向三维场景中添加点
- var longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
- var latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
- var heightString = cartographic.height;
- tempPoints.push({
- lon: longitudeString,
- lat: latitudeString,
- hei: heightString
- });
- that.polygonPositionArray = tempPoints
- positions.push(activeShapePoints[activeShapePoints.length - 1]);
- if (positions.length >= 2) {
- if (!Cesium.defined(polygon)) {
- polygon = new PolygonPrimitive(positions);
- } else {
- positions.pop();
- positions.push(cartesian);
- }
- }
- if (activeShapePoints.length) {
- activeShape = drawShape(activeShapePoints); //绘制最终图
- }
- // that.map.entities.remove(floatingPoint);
- that.map.entities.remove(active);
- that.map.entities.remove(boildOne);
- that.map.entities.remove(boildTwo);
- that.map.entities.remove(boildThree);
- if (!flagScend) return;
- flagScend = false;
- altitude.push(Math.round(cartographic.height));
- altitude.sort(function (a, b) {
- if (a > b) return 1; else if (a < b) return -1; else return 0;
- });
- $('#dong_max_height').val(altitude[altitude.length - 1]);
- $('#dong_min_height').val(altitude[0]);
- handler.destroy();
- flag = true;
- //结束绘制显示分析按钮
- $('#dong_start').css('visibility', 'visible')
- return;
- }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
-
- var PolygonPrimitive = function () {
- function _(positions) {
- this.options = {
- name: '多边形',
- polygon: {
- hierarchy: [],
- material: Cesium.Color.WHITE.withAlpha(0)
- }
- };
-
- this.positions = positions;
- this._init();
- }
-
- _.prototype._init = function () {
- var _self = this;
- //实时更新polygon.hierarchy
- this.options.polygon.hierarchy = new Cesium.CallbackProperty(function () {
- return new Cesium.PolygonHierarchy(positions);
- }, false);
- waterEntity = that.map.entities.add(this.options);
- that.fixedWaterEntity = waterEntity;
- };
- return _;
- }();
- });
-
- // 点击开始分析按钮,开始分析
- $('#dong_start').click(function () {
- //宽度设置为0 隐藏进度条
- $('.dong-progress .container #progress_bar').width(0);
- //隐藏div
- $('.dong-progress').stop().hide();
- $('#dong_echarts').stop().hide();
- $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
- if (flag != true) {
- if (yanmo != null) {
- layer.msg('请等待绘制完成', {
-
- time: 1000
- });
- return;
- }
- layer.msg('请先选择绘制区域', {
-
- time: 1000
- });
- return;
- }
- // 提取坐标信息
- var list = waterEntity.polygon.hierarchy.getValue().positions;
- // 存放坐标信息,做请求数据使用
- var echartRings = [[]];
-
- // 处理坐标信息,将世界坐标转换成经纬度
- for (var i = 1; i < list.length; i++) {
- var cartographic = Cesium.Cartographic.fromCartesian(list[i]);
- var lat = Cesium.Math.toDegrees(cartographic.latitude);
- var lng = Cesium.Math.toDegrees(cartographic.longitude);
- echartRings[0].push([lng, lat]);
- }
-
- that.map.entities.remove(activeShape);
- // 最高海拔
- var maxHet = Number($('#dong_max_height').val());
- // 最低海拔
- var minHet = Number($('#dong_min_height').val());
- // 每秒上升海拔
- var time = Number($('#dong_time').val());
- // 动态获取最低海拔
- $('#dong_min_height').change(function () {
- minHet = $(this).val();
- });
-
- // 总淹没体积
- var textArea = parseInt(getArea(tempPoints) * (maxHet - minHet) / 100000);
- var seriesData = [];
- var altitude = (maxHet - minHet) / 20;
- var altitudeHet = 0;
-
- // 1秒后开始进入淹没分析
- setTimeout(function () {
- flag = false;
- if (waterEntity) {
- that.map.scene.globe.depthTestAgainstTerrain = true;
- waterEntity.polygon.perPositionHeight = true, waterEntity.polygon.material = Cesium.Color.fromBytes(33, 122, 193, 220);
- var h = minHet - 50 || altitude[0] - 50;
- waterEntity.polygon.extrudedHeight = minHet - 50 || altitude[0] - 50; //需要提前设置 不然会全部出现
- yanmo = setInterval(function () {
- h = h + time || 1;
- if (h >= (maxHet || altitude[altitude.length - 1])) {
- h = maxHet || altitude[altitude.length - 1]; //给个最大值
- waterEntity.polygon.extrudedHeight = h;
- clearTimeout(yanmo);
- flag = true;
-
- // //显示div
- // $('.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);
-
- return;
- }
- waterEntity.polygon.extrudedHeight = h;
-
- }, 100);
- that.showDetail(true)
-
- }
- }, 1000);
-
- });
-
- $('#dong_delet').click(function () {
- that.showDetail(false)
- that.clearData()
- that.deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity);
-
- handler.destroy();
- $('.dong-progress .container #progress_bar').width(0);
- $('.dong-progress').stop().hide();
- $('#dong_echarts').stop().hide();
- $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
- //隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
- $('#dong_start').css('visibility', 'hidden')
- clearInterval(yanmo);
- yanmo = null;
- });
-
- $('#flood-detail-ckxq').click(function () {
- that.floodAnalysisPopup()
})
- var radiansPerDegree = Math.PI / 180.0; //角度转化为弧度(rad)
- var degreesPerRadian = 180.0 / Math.PI; //弧度转化为角度
- function getArea(points) {
- var res = 0;
- //拆分三角曲面
- for (var i = 0; i < points.length - 2; i++) {
- var j = (i + 1) % points.length;
- var k = (i + 2) % points.length;
- var totalAngle = Angle(points[i], points[j], points[k]);
+ this.analysisBtn.click(function () {
+ self.analysisBtn.addClass('choose-button')
+ self.analysisBtn.removeClass('unchoose-button')
+ self.historyBtn.addClass('unchoose-button')
+ self.divFloodHistory.hide()
+ self.divFloodAnalysis.show()
+ })
- var dis_temp1 = distance(positions[i], positions[j]);
- var dis_temp2 = distance(positions[j], positions[k]);
- res += dis_temp1 * dis_temp2 * Math.abs(Math.sin(totalAngle));
- }
+ this.historyBtn.click(function () {
+ self.historyBtn.addClass('choose-button')
+ self.historyBtn.removeClass('unchoose-button')
+ self.analysisBtn.addClass('unchoose-button')
+ self.divFloodAnalysis.hide()
+ self.divFloodHistory.show()
+ })
- return (res / 1000000.0).toFixed(4);
- }
+ // $('#hd-input').focus(function () {
+ // $("#hd-select").css({"display": ""});
+ // })
+ //
+ // $('#hd-input').blur(function () {
+ // $("#hd-select").css({"display": "none"});
+ // })
+ //
+ //
+ // $('#hd-select').change(function () {
+ // console.log($('#hd-select').find("option:selected").text(), "----")
+ // $("#hd-input").val($('#hd-select').find("option:selected").text());
+ // $("#hd-select").css({"display": "none"});
+ // })
+ $('#hd-select').change(function () {
+ var selected = JSON.parse($(this).val())
+ self.getSmxData(selected.river_code,selected.default_smx)
+ })
+ $('#smx-select').change(function () {
+ var selected = JSON.parse($(this).val())
+ console.log(selected)
+ self.getPointData(selected.smxcode)
+ })
- /*角度*/
- function Angle(p1, p2, p3) {
- var bearing21 = Bearing(p2, p1);
- var bearing23 = Bearing(p2, p3);
- var angle = bearing21 - bearing23;
- if (angle < 0) {
- angle += 360;
- }
- return angle;
- }
-
- /*方向*/
- function Bearing(from, to) {
- var lat1 = from.lat * radiansPerDegree;
- var lon1 = from.lon * radiansPerDegree;
- var lat2 = to.lat * radiansPerDegree;
- var lon2 = to.lon * radiansPerDegree;
- var angle = -Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
- if (angle < 0) {
- angle += Math.PI * 2.0;
- }
- angle = angle * degreesPerRadian; //角度
- return angle;
- }
-
- //计算距离
- function distance(point1, point2) {
- var point1cartographic = Cesium.Cartographic.fromCartesian(point1);
- var point2cartographic = Cesium.Cartographic.fromCartesian(point2);
- /**根据经纬度计算出距离**/
- var geodesic = new Cesium.EllipsoidGeodesic();
- geodesic.setEndPoints(point1cartographic, point2cartographic);
- var s = geodesic.surfaceDistance;
- //返回两点之间的距离
- s = Math.sqrt(Math.pow(s, 2) + Math.pow(point2cartographic.height - point1cartographic.height, 2));
- return s;
- }
-
- this.closeDeleteEntity = function () {
- handler.destroy();
- that.deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity);
- };
},
onOpen: function onOpen() {
+ this.init()
//面板打开的时候触发 (when open this panel trigger)
this.map.scene.globe.baseColor = Cesium.Color.BLACK;
//初始化点
- this.addPoint()
+ // this.addPoint()
//切换底图
$($('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');
@@ -479,23 +95,11 @@
destination: Cesium.Cartesian3.fromDegrees(116.016905, 25.884684, 10000),
});
-
-
},
onClose: function onClose() {
- this.closeDeleteEntity();
//面板关闭的时候触发 (when this panel is closed trigger)
-
- $('.dong-progress .container #progress_bar').width(0);
- $('.dong-progress').stop().hide();
- $('#dong_echarts').stop().hide();
- $('.jimu-widget-AnalysisOfBarrierLake p').stop().hide();
- //隐藏分析按钮,防止点击绘制区域还未绘制完成时点击分析引发bug
- $('#dong_start').css('visibility', 'hidden')
- //隐藏详情框
- this.showDetail(false)
- this.peoplePositionEntity.forEach(e=>{
+ this.peoplePositionEntity.forEach(e => {
this.map.entities.remove(e)
})
this.map.scene.globe.baseColor = Cesium.Color.WHITE;
@@ -519,23 +123,6 @@
this.inherited(arguments);
},
- deleteEntitys: function deleteEntitys(that, pointId, shape, boildOne, boildTwo, boildThree, waterEntity) {
- if (pointId !== []) {
- for (var i = 0; i < pointId.length; i++) {
- that.map.entities.removeById(pointId[i]);
- }
-
- pointId = [];
- }
- that.map.entities.remove(shape);
- that.map.entities.remove(boildOne);
- that.map.entities.remove(boildTwo);
- that.map.entities.remove(boildThree);
- if (waterEntity != null) {
- that.map.entities.removeById(waterEntity._id);
- }
- },
-
//添加点
addPoint: function () {
const url = './widgets/FloodAnalysis/data.json'
@@ -543,7 +130,7 @@
},
//获取json对象,测试用
- getJsonUrl: function getJsonUrl(url) {
+ getJsonUrl: function (url) {
var self = this;
$.ajax({
url: url,
@@ -577,66 +164,107 @@
});
},
- //是否显示详情框
- showDetail: function (show) {
- //显示详情
- if (show) {
- $('.flood-detail').show()
- } else {
- $('.flood-detail').hide()
- }
+ //绑定html元素,方便操作
+ bindHtmlElement: function () {
+ this.analysisBtn = $('.analysis-button')
+ this.historyBtn = $('.history-button')
+ this.divFloodAnalysis = $('.flood-analysis')
+ this.divFloodHistory = $('.flood-history')
+ this.middleRadioGroup = $('input[type=radio][name=middleRadio]')
+ this.hdSelect = $('#hd-select')
+ this.smxSelect = $('#smx-select')
+ this.divSwInput = $('.sw')
+ this.spanTip = $('.tip')
},
- //洪水分析弹窗
- floodAnalysisPopup: function () {
- var self = this
- var inPolygon = []
- for (let i = 0; i < this.peoplePositionArray.length; i++) {
- let isIn = this.isPointInPolygon(this.peoplePositionArray[i])
- if (isIn) {
- inPolygon.push(this.peoplePositionArray[i])
- }
- }
- var inPolygonStr = JSON.stringify(inPolygon)
+ //初始化
+ init() {
+ //重置html元素状态
+ this.divSwInput.hide()
+ this.spanTip.hide()
+ this.divFloodHistory.hide()
+ this.divFloodAnalysis.show()
- var url = './corelib/common/popup/floodAnalysis.html';
- var urlEvaluate = './corelib/common/popup/evaluateAnalysis.html'
- var top = ($(window).height() - 750) / 2;
- var left = ($(window).width() - 1300 - 340) / 2 + 340;
- layer.open({
- title: '评估分析',
- type: 2,
- maxmin: false, //开启最大化最小化按钮
- area: ['1100px', '800px'],
- skin: 'floodAnalysis',
- offset: [top, left],
- content: urlEvaluate + "?data=" + encodeURIComponent(inPolygonStr),//使用encodeURIComponent转码,避免中文字符乱码,避免url截取错误
- id: "floodAnalysisLayer",
- closeBtn: 1,
+ this.analysisBtn.addClass('choose-button')
+ this.historyBtn.removeClass('choose-button')
+ this.historyBtn.addClass('unchoose-button')
+
+ this.getHdData()
+ },
+
+ //获取河段下拉数据
+ getHdData() {
+ const self = this
+ let url = "http://192.168.0.207:82/blade-ycreal/riverway/selectName?name=%E6%B0%B4"
+ $.ajax({
+ url: url,
+ type: 'post',
+ dataType: 'json',
+ jsonp: 'callback',
+ jsonpCallback: 'data',
+ data: {},
+ success: function (res) {
+ let data = res.data
+ $("#hd-select").find("option").remove();//添加新值 删除旧值
+ $("#hd-select").prepend("<option value=''>请选择</option>");//添加第一个option值
+ data.forEach(e => {
+ $("#hd-select").append("<option value='" + JSON.stringify(e) + "'>" + e.riverway + "</option>");
+ })
+ }
});
},
- //判断点是否在多边形内部
- isPointInPolygon: function (point) {
- //获取经纬度
- var polygonPosition = this.polygonPositionArray
- //turf要求首尾闭合
- var turfPolygon = []
- polygonPosition.forEach(e => {
- var temp = [e.lon, e.lat]
- turfPolygon.push(temp)
- })
- turfPolygon.push([polygonPosition[0].lon, polygonPosition[0].lat])
+ //获取水面线数据
+ getSmxData(hdid,defaultId) {
+ const self = this
+ let url = "http://192.168.0.207:82/blade-ycreal/waterline/selectName"
+ $.ajax({
+ url: url,
+ type: 'post',
+ dataType: 'json',
+ jsonp: 'callback',
+ jsonpCallback: 'data',
+ data: {
+ hdid:hdid
+ },
+ success: function (res) {
+ let data = res.data
+ $("#smx-select").find("option").remove();//添加新值 删除旧值
+ data.forEach(e => {
+ // $("#chapterName").prepend("<option value='无'>无</option>");//添加第一个option值
+ $("#smx-select").append("<option value="+ e.smxcode +">" + e.waterline + "</option>");
- var poly = turf.polygon([turfPolygon])
- var pt = turf.point([point.LGTD, point.LTTD])
- return turf.booleanPointInPolygon(pt, poly)
+ if (e.smxcode == defaultId){
+ $("#smx-select option[value="+e.smxcode + "] ").attr("selected",true)
+ console.log($('#smx-select'))
+ $('#smx-select').trigger("change")
+ }
+ })
+
+ }
+ });
},
- //清除框内数据
- clearData:function (){
- $('#dong_max_height').val(0);
- $('#dong_min_height').val(0);
- },
+ //获取点数据
+ getPointData(smxcode){
+ const self = this
+ let url = "http://192.168.0.207:82/blade-ycreal/water/childpage"
+ $.ajax({
+ url: url,
+ type: 'post',
+ dataType: 'json',
+ jsonp: 'callback',
+ jsonpCallback: 'data',
+ data: {
+ parentId:smxcode
+ },
+ success: function (res) {
+ let data = res.data
+ console.log(data,"----")
+ }
+ });
+ }
+
+
});
});
diff --git a/widgets/FloodAnalysis/css/style copy2.css b/widgets/FloodAnalysis/css/style copy2.css
new file mode 100644
index 0000000..677f7db
--- /dev/null
+++ b/widgets/FloodAnalysis/css/style copy2.css
@@ -0,0 +1,250 @@
+.jimu-widget-FloodAnalysis {
+ width: 440px !important;
+ height: 100%;
+ position: fixed !important;
+ left: 30px !important;
+ top: 75px !important;
+ border: 1px solid rgb(69, 154, 251);
+ border-radius: 5px;
+ background: rgba(31, 39, 48, .7);
+ z-index: 41 !important;
+ color: rgb(255, 255, 255);
+}
+
+.jimu-widget-FloodAnalysis div,
+.jimu-widget-FloodAnalysis i,
+.jimu-widget-FloodAnalysis ul,
+.jimu-widget-FloodAnalysis li,
+.jimu-widget-FloodAnalysis span,
+.jimu-widget-FloodAnalysis input,
+.jimu-widget-FloodAnalysis h2 {
+ margin: 0;
+ padding: 0;
+}
+
+.jimu-widget-FloodAnalysis div.analysis-header {
+ position: relative;
+ width: 100%;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+ border-bottom: 1px solid rgb(69, 154, 251);
+}
+
+.jimu-widget-FloodAnalysis div.analysis-header i {
+ display: inline-block;
+ margin-left: 6px;
+ vertical-align: middle;
+ width: 20px;
+ height: 20px;
+ background: url(../../../images/toolbox.png ) no-repeat 0 -20px;
+ background-size: 20px;
+}
+
+.jimu-widget-FloodAnalysis div.dong {
+ margin: 8px 17px;
+}
+
+.jimu-widget-FloodAnalysis ul li {
+ margin: 5px 0;
+ list-style: none;
+ height: 46px;
+ line-height: 46px;
+ font-size: 16px;
+}
+
+
+
+.jimu-widget-FloodAnalysis li span {
+ display: inline-block;
+ width: 51%;
+ text-align: left;
+}
+
+.jimu-widget-FloodAnalysis li input {
+ display: inline-block;
+ width: 49%;
+ height: 42px;
+ border: 0;
+ color: #fff;
+ vertical-align: middle;
+ background: rgba(140, 151, 165, 0.7);
+ padding: 0 10px;
+}
+
+.jimu-widget-FloodAnalysis li:nth-child(5) input {
+ width: 49%;
+}
+
+.jimu-widget-FloodAnalysis li:nth-child(5) input:nth-child(1) {
+ margin-right: 2%;
+}
+
+.jimu-widget-FloodAnalysis li:nth-child(1) input,
+.jimu-widget-FloodAnalysis li:nth-child(5) input {
+ cursor: pointer;
+ background: rgb(2,24,55);
+ border: 1px solid rgb(69, 154, 251);
+ border-radius: 4px;
+}
+
+.jimu-widget-FloodAnalysis .dong-echarts {
+ display: none;
+ position: absolute;
+ top: 360px;
+ background: rgba(90, 87, 87, 0.7);
+ width: 560px;
+ height: 360px;
+ z-index: 55;
+}
+
+.jimu-widget-FloodAnalysis p {
+ display: none;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: 368px;
+ left: 12px;
+ width: 150px;
+ height: 200px;
+ color: #fff;
+ line-height: 20px;
+ text-indent: 2em;
+ letter-spacing: 1.5px;
+ font-size: 16px;
+ word-break: break-all;
+ text-align-last: left;
+ text-align: justify;
+ text-justify: distribute-all-lines;
+ z-index: 56;
+}
+
+.jimu-widget-FloodAnalysis .dong-progress {
+ display: none;
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: auto;
+ width: 500px;
+ height: 0px;
+ z-index: 33;
+ background: rgba(59, 59, 59, 0.7);
+
+}
+
+.jimu-widget-FloodAnalysis .dong-progress h2 {
+ margin: 10px 0;
+ text-align: center;
+ font-size: 16px;
+ font-weight: 400;
+}
+
+.jimu-widget-FloodAnalysis .dong-progress .container {
+ display: inline-block;
+ width: 100%;
+ height: 20px;
+ padding-right: 10px;
+ border: 1px solid #999;
+ border-radius: 5px;
+}
+
+.jimu-widget-FloodAnalysis .dong-progress .container .h-100P {
+ height: 100%;
+}
+
+.jimu-widget-FloodAnalysis .dong-progress .container .bar {
+ display: inline-block;
+ background: linear-gradient(to right, #ff4343, #48adff);
+ color: white;
+ font-weight: bold;
+ padding: 0 5px;
+ text-align: right;
+ border-radius: 5px;
+ border-right: 1px solid #999;
+}
+
+
+
+.jimu-widget-FloodAnalysis .storage-capacity-curve {
+ display: none;
+ padding-top: 10px;
+ position: absolute;
+ top: 360px;
+ left: 580px;
+ background: rgba(206, 204, 204, 0.7);
+ width: 500px;
+ height: 360px;
+ z-index: 55;
+}
+
+.jimu-widget-FloodAnalysis .storage-name {
+ display: none;
+ position: absolute;
+ top: 686px;
+ left: 780px;
+ width: 100px;
+ height: 20px;
+ line-height: 20px;
+ text-align: center;
+ font-size: 14px;
+ color: rgba(40, 37, 161, 0.7);
+ z-index: 111 !important;
+}
+
+/**淹没详情**/
+.flood-detail{
+ position: fixed;
+ top: 420px;
+ width: 440px;
+ height: 200px;
+ left: 30px !important;
+ overflow-x: hidden;
+ background: rgba(31, 39, 48, .7);
+ font-size: 14px;
+ border: 1px solid rgb(69, 154, 251);
+ border-radius: 5px;
+ color: rgb(255, 255, 255);
+ display: none;
+}
+
+.flood-detail-header {
+ position: relative;
+ width: 100%;
+ height: 40px;
+ line-height: 40px;
+ font-size: 20px;
+ border-bottom: 1px solid rgb(69, 154, 251);
+}
+
+.flood-detail-header i {
+ display: inline-block;
+ margin-left: 6px;
+ vertical-align: middle;
+ width: 20px;
+ height: 20px;
+ background: url(../../../images/toolbox.png ) no-repeat 0 -20px;
+ background-size: 20px;
+}
+
+.flood-detail-content{
+ height: 45%;
+ text-align: center;
+ margin: 12px 17px 10px 17px;
+}
+
+.flood-detail-text{
+ height: 95%;
+ font-size: 20px;
+}
+
+.flood-detail-button input{
+ margin: 5px 0;
+ width: 48%;
+ height: 36px;
+ color: #fff;
+ background: rgb(2,24,55);
+ border: 1px solid rgb(69, 154, 251);
+ border-radius: 4px;
+}
diff --git a/widgets/FloodAnalysis/css/style.css b/widgets/FloodAnalysis/css/style.css
index 677f7db..b5fda1e 100644
--- a/widgets/FloodAnalysis/css/style.css
+++ b/widgets/FloodAnalysis/css/style.css
@@ -1,5 +1,5 @@
.jimu-widget-FloodAnalysis {
- width: 440px !important;
+ width: 570px !important;
height: 100%;
position: fixed !important;
left: 30px !important;
@@ -9,6 +9,7 @@
background: rgba(31, 39, 48, .7);
z-index: 41 !important;
color: rgb(255, 255, 255);
+ font-size: 22px;
}
.jimu-widget-FloodAnalysis div,
@@ -22,229 +23,128 @@
padding: 0;
}
-.jimu-widget-FloodAnalysis div.analysis-header {
- position: relative;
- width: 100%;
- height: 40px;
- line-height: 40px;
- font-size: 20px;
- border-bottom: 1px solid rgb(69, 154, 251);
-}
-
-.jimu-widget-FloodAnalysis div.analysis-header i {
- display: inline-block;
- margin-left: 6px;
- vertical-align: middle;
- width: 20px;
- height: 20px;
- background: url(../../../images/toolbox.png ) no-repeat 0 -20px;
- background-size: 20px;
-}
-
-.jimu-widget-FloodAnalysis div.dong {
- margin: 8px 17px;
-}
-
-.jimu-widget-FloodAnalysis ul li {
- margin: 5px 0;
- list-style: none;
- height: 46px;
- line-height: 46px;
- font-size: 16px;
-}
-
-
-
-.jimu-widget-FloodAnalysis li span {
- display: inline-block;
- width: 51%;
- text-align: left;
-}
-
-.jimu-widget-FloodAnalysis li input {
- display: inline-block;
- width: 49%;
- height: 42px;
- border: 0;
- color: #fff;
- vertical-align: middle;
- background: rgba(140, 151, 165, 0.7);
- padding: 0 10px;
-}
-
-.jimu-widget-FloodAnalysis li:nth-child(5) input {
- width: 49%;
-}
-
-.jimu-widget-FloodAnalysis li:nth-child(5) input:nth-child(1) {
- margin-right: 2%;
-}
-
-.jimu-widget-FloodAnalysis li:nth-child(1) input,
-.jimu-widget-FloodAnalysis li:nth-child(5) input {
- cursor: pointer;
- background: rgb(2,24,55);
- border: 1px solid rgb(69, 154, 251);
- border-radius: 4px;
-}
-
-.jimu-widget-FloodAnalysis .dong-echarts {
- display: none;
- position: absolute;
- top: 360px;
- background: rgba(90, 87, 87, 0.7);
- width: 560px;
- height: 360px;
- z-index: 55;
-}
-
-.jimu-widget-FloodAnalysis p {
- display: none;
- margin: 0;
- padding: 0;
- position: absolute;
- top: 368px;
- left: 12px;
- width: 150px;
- height: 200px;
- color: #fff;
- line-height: 20px;
- text-indent: 2em;
- letter-spacing: 1.5px;
- font-size: 16px;
- word-break: break-all;
- text-align-last: left;
- text-align: justify;
- text-justify: distribute-all-lines;
- z-index: 56;
-}
-
-.jimu-widget-FloodAnalysis .dong-progress {
- display: none;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- margin: auto;
- width: 500px;
- height: 0px;
- z-index: 33;
- background: rgba(59, 59, 59, 0.7);
-
-}
-
-.jimu-widget-FloodAnalysis .dong-progress h2 {
- margin: 10px 0;
+.flood-top{
text-align: center;
- font-size: 16px;
- font-weight: 400;
+ display: inline-flex;
+ margin-left: 32% !important;
}
-.jimu-widget-FloodAnalysis .dong-progress .container {
- display: inline-block;
- width: 100%;
- height: 20px;
- padding-right: 10px;
- border: 1px solid #999;
- border-radius: 5px;
+.flood-middle .select-box{
+ margin: 5% 0 0 25%;
}
-.jimu-widget-FloodAnalysis .dong-progress .container .h-100P {
- height: 100%;
-}
-
-.jimu-widget-FloodAnalysis .dong-progress .container .bar {
- display: inline-block;
- background: linear-gradient(to right, #ff4343, #48adff);
- color: white;
- font-weight: bold;
- padding: 0 5px;
- text-align: right;
- border-radius: 5px;
- border-right: 1px solid #999;
-}
-
-
-
-.jimu-widget-FloodAnalysis .storage-capacity-curve {
- display: none;
- padding-top: 10px;
- position: absolute;
- top: 360px;
- left: 580px;
- background: rgba(206, 204, 204, 0.7);
- width: 500px;
- height: 360px;
- z-index: 55;
-}
-
-.jimu-widget-FloodAnalysis .storage-name {
- display: none;
- position: absolute;
- top: 686px;
- left: 780px;
+.flood-top input{
width: 100px;
- height: 20px;
- line-height: 20px;
+ height: 25px;
+ cursor: pointer;
+}
+
+.flood-top .choose-button{
+ background-color: #1f81e0;
+ border: none;
+ color: white;
+}
+
+.flood-top .unchoose-button{
+ background-color: white;
+ border: none;
+ color: #1f81e0;
+}
+
+.search-button{
+ width: 50px;
+ height: 28px;
+ background-color: white;
+ border: none;
+ cursor: pointer;
+}
+
+.flood-middle .select-box select,.flood-middle .select-box input,.search-name-input{
+ height: 30px;
+ width: 260px;
+}
+
+.flood-middle .radio-box{
text-align: center;
- font-size: 14px;
- color: rgba(40, 37, 161, 0.7);
- z-index: 111 !important;
+ margin-top: 5%;
}
-/**淹没详情**/
-.flood-detail{
- position: fixed;
- top: 420px;
- width: 440px;
- height: 200px;
- left: 30px !important;
- overflow-x: hidden;
- background: rgba(31, 39, 48, .7);
- font-size: 14px;
- border: 1px solid rgb(69, 154, 251);
- border-radius: 5px;
- color: rgb(255, 255, 255);
- display: none;
+.flood-middle .tip{
+ font-size: 1px;
+ color: #ff3737;
}
-.flood-detail-header {
- position: relative;
- width: 100%;
- height: 40px;
- line-height: 40px;
- font-size: 20px;
- border-bottom: 1px solid rgb(69, 154, 251);
-}
-
-.flood-detail-header i {
+.select-box label{
display: inline-block;
- margin-left: 6px;
+ width: 80px;
+ height: 30px;
+ line-height: 30px;
vertical-align: middle;
- width: 20px;
- height: 20px;
- background: url(../../../images/toolbox.png ) no-repeat 0 -20px;
- background-size: 20px;
+ text-align: justify;
+ text-align-last: justify;
}
-.flood-detail-content{
- height: 45%;
+/**表格**/
+.flood-middle .table-box{
+ margin-top: 3%;
+}
+
+.flood-middle .table-box table{
+ width: 100%;
+}
+
+.flood-table-thead tr th {
text-align: center;
- margin: 12px 17px 10px 17px;
+ border-top: 1px solid #CFCFCF;
+ border-right: 1px solid #CFCFCF;
+ border-bottom: 1px solid #CFCFCF;
+ color: #ffffff;
+ background: rgb(39, 118, 172);
}
-.flood-detail-text{
- height: 95%;
- font-size: 20px;
+.flood-tbody tr td {
+ text-align: center;
+ border-right: 1px solid #CFCFCF;
+ border-bottom: 1px solid #CFCFCF;
+ color: #ffffff;
}
-.flood-detail-button input{
- margin: 5px 0;
- width: 48%;
- height: 36px;
- color: #fff;
- background: rgb(2,24,55);
- border: 1px solid rgb(69, 154, 251);
- border-radius: 4px;
+.flood-history .search-box{
+ text-align: center;
+ margin-top: 2%;
}
+
+
+
+
+/*.hd {*/
+/* position: relative;*/
+/*}*/
+
+/*.hd input {*/
+/* width: 167px;*/
+/* !* top: 9px; *!*/
+/* outline: none;*/
+/* border: 0pt;*/
+/* !* position: absolute; *!*/
+/* line-height: 30px;*/
+/* !* left: 8px; *!*/
+/* height: 30px;*/
+/* border: 1px solid #999;*/
+/*}*/
+
+/*.hd select {*/
+/* position: absolute;*/
+/* left: 0;*/
+/* width: 167px;*/
+/* height: 106px !important;*/
+/* margin-left: 86px;*/
+/* outline: none;*/
+/* border: 1px solid #999;*/
+/* margin-top: 31px;*/
+/*}*/
+
+/*.hd select option:hover {*/
+/* background: #1388ff;*/
+/* color: white;*/
+/*}*/
diff --git a/widgets/FloodAnalysis/nls/zh-cn/strings.js b/widgets/FloodAnalysis/nls/zh-cn/strings.js
index 06e0acc..d7a4967 100644
--- a/widgets/FloodAnalysis/nls/zh-cn/strings.js
+++ b/widgets/FloodAnalysis/nls/zh-cn/strings.js
@@ -1,5 +1,5 @@
define(
({
- _widgetLabel: "洪水淹没风险"
+ _widgetLabel: "洪水淹没分析"
})
);
diff --git a/widgets/Tool/Widget.js b/widgets/Tool/Widget.js
index 0e2169a..fa52113 100644
--- a/widgets/Tool/Widget.js
+++ b/widgets/Tool/Widget.js
@@ -162,4 +162,4 @@
}
});
- });
\ No newline at end of file
+ });
--
Gitblit v1.9.3