diff --git a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/FormPanel.jsx b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/FormPanel.jsx index 63e4bea..7bdac8b 100644 --- a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/FormPanel.jsx +++ b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/FormPanel.jsx @@ -1,4 +1,4 @@ -import { Button, Form, Input, InputNumber, Select } from "antd"; +import { Button, Form, InputNumber, Select } from "antd"; const layout = { labelCol: { span: 10 }, @@ -8,7 +8,7 @@ const tailLayout = { wrapperCol: { offset: 10, span: 14 }, }; -export default function FormPanel({ setShow }) { +export default function FormPanel({ setShowResult }) { const [form] = Form.useForm(); return ( @@ -25,8 +25,7 @@ export default function FormPanel({ setShow }) { L: 5000, }} onFinish={(values) => { - // 根据values生成charts - // setShow(true); + setShowResult(true); }} > new WebMapServiceImageryProvider({ @@ -19,14 +19,14 @@ function LandImageLayer() { }), [name, url] ); + + return null; return ( ); } - -export default LandImageLayer; diff --git a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/ResultPanel.jsx b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/ResultPanel.jsx new file mode 100644 index 0000000..68bec6b --- /dev/null +++ b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/ResultPanel.jsx @@ -0,0 +1,51 @@ +import { useCallback, useState } from "react"; +import { Radio, Spin } from "antd"; +import { Loading3QuartersOutlined, LoadingOutlined } from "@ant-design/icons"; + +let dataList = []; + +for (let index = 10; index < 20; index++) { + const text = `${index * 100 + 1} ~ ${(index + 1) * 100}`; + dataList.push(text); +} + +export default function ResultPanel({ setYearRange }) { + const [loading, setLoading] = useState(true); + + const changeHandler = useCallback((e) => { + setYearRange(e.target.value.split(" ~ ")); + }); + + setTimeout(() => { + setLoading(false); + }, Math.random() + 2000); + + return ( +
+
选择年份范围
+ {loading ? ( +
+ +
+ ) : ( + + {dataList.map((data, index) => { + return ( + + {data} + + ); + })} + + )} +
+ ); +} diff --git a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.jsx b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.jsx index 70fa326..8fc93eb 100644 --- a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.jsx +++ b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.jsx @@ -1,17 +1,41 @@ +import { useState } from "react"; import MapLayout from "@/components/map/Layout"; +import TextInfoPanel from "@/components/common/TextInfoPanel"; import FormPanel from "./FormPanel"; -import styles from "./index.module.less"; import Legend from "./Legend"; +import ResultPanel from "./ResultPanel"; +import ImageLayer from "./ImageLayer"; +import styles from "./index.module.less"; function ClimateReconDataAssim() { + const [showResult, setShowResult] = useState(false); + const [yearRange, setYearRange] = useState([]); + return (
过去千年气候重建数据同化
- + +
+ {showResult && ( +
+ +
+ )} +
+
+
); diff --git a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.module.less b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.module.less index ee393a2..8f0d60d 100644 --- a/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.module.less +++ b/src/components/catalog/IntegrationAndOnlineCalc/ClimateReconDataAssim/index.module.less @@ -5,6 +5,7 @@ right: 12px; width: 450px; background-color: #000000e7; + border-radius: 8px; .form-panel { width: 100%; @@ -43,6 +44,56 @@ } } } + + .result-panel { + height: 100%; + border: 1px solid #04fbfd; + border-radius: 8px; + + .panel-title { + height: 72px; + color: white; + font-weight: bold; + font-size: 22px; + padding-left: 12px; + display: flex; + align-items: center; + } + + .loading { + height: calc(100% - 72px); + display: flex; + justify-content: center; + align-items: center; + background-color: #0000004f; + } + + .result-panel-radio { + height: calc(100% - 72px); + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; + gap: 12px; + + .ant-radio-button-wrapper { + width: 200px; + border-radius: 8px; + + &::before { + width: 0; + } + } + } + } + + .text-info-panel { + position: absolute; + top: 50%; + bottom: 12px; + left: 12px; + width: 450px; + } } .legend :global { diff --git a/src/components/common/CustomToolbar/index.jsx b/src/components/common/CustomToolbar/index.jsx index 10d7275..2f3ffdc 100644 --- a/src/components/common/CustomToolbar/index.jsx +++ b/src/components/common/CustomToolbar/index.jsx @@ -20,12 +20,12 @@ function CustomToolbar() { { label: "数据集成和共享", title: "数据集成和共享", - value: "/map/", + value: "http://casearthpoles.tpdc.ac.cn/zh-hans/", icon: , onClick: () => { - navigate("/", { replace: true }); + window.open("http://casearthpoles.tpdc.ac.cn/zh-hans/", "_blank"); }, - // key: "/ ", + key: "http://casearthpoles.tpdc.ac.cn/zh-hans/", }, { label: "随机森林方法在线计算案例", diff --git a/src/components/domain/One/CustomFlyTo.jsx b/src/components/domain/One/CustomFlyTo.jsx index e118075..cd42781 100644 --- a/src/components/domain/One/CustomFlyTo.jsx +++ b/src/components/domain/One/CustomFlyTo.jsx @@ -1,9 +1,12 @@ +import { useEffect } from "react"; +import { useSelector } from "react-redux"; import { Cartesian3, EasingFunction, Math } from "cesium"; import { useCesium } from "resium"; function CustomFlyTo() { const { viewer } = useCesium(); const { camera } = viewer; + const { replayVersion } = useSelector((state) => state.data); function cameraFlyToLine() { const step1 = { @@ -65,6 +68,12 @@ function CustomFlyTo() { } cameraFlyToLine(); + useEffect(() => { + viewer.clock.shouldAnimate = false; + viewer.clock.currentTime = viewer.clock.startTime.clone(); + cameraFlyToLine(); + }, [replayVersion]); + return <>; } diff --git a/src/components/domain/One/Labels.jsx b/src/components/domain/One/Labels.jsx deleted file mode 100644 index 02f7c63..0000000 --- a/src/components/domain/One/Labels.jsx +++ /dev/null @@ -1,89 +0,0 @@ -import { - CorridorGraphics, - Entity, - LabelGraphics, - PolylineGraphics, - useCesium, -} from "resium"; -import { - CallbackProperty, - Cartesian2, - Cartesian3, - Color, - ColorBlendMode, - CornerType, - LabelStyle, - Material, - PolylineArrowMaterialProperty, -} from "cesium"; -import { Fragment, useCallback, useState } from "react"; -import { useInterval } from "ahooks"; - -function Labels() { - const { viewer } = useCesium(); - - const [showOne, setShowOne] = useState(false); - const [showTwo, setShowTwo] = useState(false); - const [showThree, setShowThree] = useState(false); - - const showAnimate = useCallback(() => { - const { currentTime, stopTime } = viewer.clock; - const leftTime = Math.floor( - stopTime.secondsOfDay - currentTime.secondsOfDay - ); - - if (leftTime < 20) { - setShowOne(true); - } else if (showOne) setShowOne(false); - - if (leftTime < 15) { - setShowTwo(true); - } else if (showTwo) setShowTwo(false); - - if (leftTime < 5) { - setShowThree(true); - } else if (showThree) setShowThree(false); - }, [showOne, showTwo, showThree, viewer]); - - useInterval(showAnimate, 300); - - return ( - - - - - - - - - - - - ); -} - -export default Labels; diff --git a/src/components/domain/One/Labels/LabelEtity.jsx b/src/components/domain/One/Labels/LabelEtity.jsx new file mode 100644 index 0000000..086b064 --- /dev/null +++ b/src/components/domain/One/Labels/LabelEtity.jsx @@ -0,0 +1,58 @@ +import { useEffect, useState } from "react"; +import { useSelector } from "react-redux"; +import { Entity, LabelGraphics, useCesium } from "resium"; +import { useInterval, useToggle } from "ahooks"; +import { Cartesian2, Color, LabelStyle } from "cesium"; + +export default function LabelEntity({ showTime, text, position }) { + const { viewer } = useCesium(); + const { replayVersion } = useSelector((state) => state.data); + const [deley, setDeley] = useState(300); + const [show, setShow] = useState(false); + + useEffect(() => { + setDeley(300); + setShow(false); + }, [replayVersion]); + + const [font, { toggle: fontToggle }] = useToggle( + "24px Helvetica", + "bold 32px Helvetica" + ); + const [fillColor, { toggle: colorToggle }] = useToggle( + Color.fromCssColorString("#04fbfd").withAlpha(0.9), + Color.fromCssColorString("#04fbfd") + ); + + useInterval(() => { + const { startTime, currentTime } = viewer.clock; + const passtime = currentTime.secondsOfDay - startTime.secondsOfDay; + + if (passtime >= showTime) { + setShow(true); + let timer = setInterval(() => { + fontToggle(); + colorToggle(); + }, 500); + + setTimeout(() => { + clearInterval(timer); + }, 3000); + setDeley(undefined); + } + }, deley); + + return ( + + + + ); +} diff --git a/src/components/domain/One/Labels/index.jsx b/src/components/domain/One/Labels/index.jsx new file mode 100644 index 0000000..c339b11 --- /dev/null +++ b/src/components/domain/One/Labels/index.jsx @@ -0,0 +1,30 @@ +import { Fragment } from "react"; +import { Cartesian3 } from "cesium"; +import LabelEntity from "./LabelEtity"; + +export default function Labels() { + return ( + + + + + + + ); +} diff --git a/src/components/domain/One/ReplayButton.jsx b/src/components/domain/One/ReplayButton.jsx new file mode 100644 index 0000000..7252b69 --- /dev/null +++ b/src/components/domain/One/ReplayButton.jsx @@ -0,0 +1,20 @@ +import { useCallback } from "react"; +import { useDispatch } from "react-redux"; +import { Button } from "antd"; +import styles from "./index.module.less"; + +export default function ReplayButton() { + const dispatch = useDispatch(); + + const playHandler = useCallback(() => { + dispatch.data.update({ replayVersion: Date.now() }); + }, []); + + return ( +
+ +
+ ); +} diff --git a/src/components/domain/One/WavePoints.jsx b/src/components/domain/One/WavePoints.jsx index b39700a..f8b825e 100644 --- a/src/components/domain/One/WavePoints.jsx +++ b/src/components/domain/One/WavePoints.jsx @@ -4,11 +4,7 @@ import WavePoint from "@/components/common/WavePoint"; export default function WavePoints() { return ( - + ); diff --git a/src/components/domain/One/index.jsx b/src/components/domain/One/index.jsx index 0fc80a4..1740575 100644 --- a/src/components/domain/One/index.jsx +++ b/src/components/domain/One/index.jsx @@ -13,6 +13,7 @@ import JJAImageLayer from "./JJAImageLayer"; import CustomChartPanel from "./CustomChartPanel"; import EntityLegend from "./EntityLegend"; import Labels from "./Labels"; +import ReplayButton from "./ReplayButton"; // import WaterVaporPath from "./WaterVaporPath"; export default function DomainOne() { @@ -40,6 +41,7 @@ export default function DomainOne() { + ); } diff --git a/src/components/domain/One/index.module.less b/src/components/domain/One/index.module.less index e69de29..2379bfe 100644 --- a/src/components/domain/One/index.module.less +++ b/src/components/domain/One/index.module.less @@ -0,0 +1,5 @@ +.replayButton :global { + position: absolute; + top: 12px; + left: 12px; +} diff --git a/src/components/domain/Three/LandImageLayer.jsx b/src/components/domain/Three/LandImageLayer.jsx deleted file mode 100644 index 2cfaa40..0000000 --- a/src/components/domain/Three/LandImageLayer.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import { useMemo } from "react"; -import { ImageryLayer } from "resium"; -import { WebMapServiceImageryProvider } from "cesium"; - -const url = "http://analysis.tpdc.ac.cn/gs/geoserver/phitrellis/wms"; -const name = "phitrellis:4_3_t2m_era_1024"; - -function LandImageLayer() { - const tempProvider = useMemo( - () => - new WebMapServiceImageryProvider({ - url: url, - layers: name, - parameters: { - service: "WMS", - format: "image/png", - transparent: true, - }, - }), - [name, url] - ); - return ( - - ); -} - -export default LandImageLayer; diff --git a/src/components/domain/Three/Legend.jsx b/src/components/domain/Three/Legend.jsx deleted file mode 100644 index b495bdc..0000000 --- a/src/components/domain/Three/Legend.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import styles from "./index.module.less"; - -const colorBar = [ - "#7F20F0", - "#2A09FA", - "#1C33F1", - "#3B6CE3", - "#2388F8", - "#0EA5FE", - "#23C0FB", - "#85CAF1", - "#B8E1F3", - "#FEF995", - "#FEDD30", - "#FEB709", - "#FF8B00", - "#FF5D00", - "#FF1001", - "#E00000", - "#D62A2A", - "#FFB1B1", -]; - -function Legend({ style }) { - return ( -
-
-
- {colorBar.map((color, index) => { - return ( -
- ); - })} -
-
- {[-0.8, -0.4, 0, 0.4, 0.8].map((item, index) => { - return ( -
- {item} -
- ); - })} -
-
- ); -} - -export default Legend; diff --git a/src/components/domain/Three/OceanImageLayer.jsx b/src/components/domain/Three/OceanImageLayer.jsx deleted file mode 100644 index cea4b47..0000000 --- a/src/components/domain/Three/OceanImageLayer.jsx +++ /dev/null @@ -1,32 +0,0 @@ -import { useMemo } from "react"; -import { ImageryLayer } from "resium"; -import { WebMapServiceImageryProvider } from "cesium"; - -const url = "http://analysis.tpdc.ac.cn/gs/geoserver/phitrellis/wms"; -const name = "phitrellis:4_3_hadisst_1822"; - -function OceanImageLayer() { - const tempProvider = useMemo( - () => - new WebMapServiceImageryProvider({ - url: url, - layers: name, - parameters: { - service: "WMS", - format: "image/png", - transparent: true, - }, - }), - [name, url] - ); - return ( - - ); -} - -export default OceanImageLayer; diff --git a/src/components/domain/Three/SceneOne/CustomChartPanel.jsx b/src/components/domain/Three/SceneOne/CustomChartPanel.jsx deleted file mode 100644 index 5d68f36..0000000 --- a/src/components/domain/Three/SceneOne/CustomChartPanel.jsx +++ /dev/null @@ -1,187 +0,0 @@ -import ChartPanel from "@/components/common/ChartPanel"; - -const years = []; - -for (let year = 1900; year <= 2000; year++) { - years.push(year); -} - -// 北极 -const AntarcticaData = [ - 0.101942611, 0.121527548, 0.139042908, 0.153372484, 0.163348844, 0.16781324, - 0.165740405, 0.156668394, 0.140792524, 0.118786901, 0.091903343, 0.062313072, - 0.032977812, 0.00716395, -0.012074836, -0.022308346, -0.021755523, - -0.00911355, 0.016196573, 0.053416993, 0.100564819, 0.155328769, 0.215351821, - 0.278252395, 0.341745714, 0.40383823, 0.463006888, 0.518309403, 0.569408932, - 0.616333481, 0.65915749, 0.697835067, 0.732192543, 0.761939745, 0.78659761, - 0.805314271, 0.81708585, 0.820876623, 0.815679973, 0.800851314, 0.776409401, - 0.742721875, 0.700509783, 0.651004076, 0.595858743, 0.536937172, 0.476075479, - 0.414725656, 0.353864772, 0.294239451, 0.236327526, 0.18015056, 0.125260938, - 0.070978964, 0.016363941, -0.039809019, -0.09861786, -0.160770418, - -0.226238681, -0.294159838, -0.363174145, -0.431703208, -0.497831469, - -0.559188985, -0.613384987, -0.658281488, -0.692634725, -0.716904761, - -0.73222222, -0.739942379, -0.741611283, -0.73898482, -0.733815531, - -0.727389051, -0.720449369, -0.713466528, -0.706847385, -0.700922099, - -0.695911133, -0.691920829, -0.688978939, -0.687022002, -0.685739611, - -0.684476492, -0.682376879, -0.678508387, -0.672015068, -0.662330127, - -0.649157058, -0.632405431, -0.612100964, -0.588400678, -0.56151658, - -0.531629308, -0.498751783, -0.462720586, -0.423305188, -0.380187818, - -0.332990445, -0.281392986, -0.225240753, -]; - -// 南极 -const ArcticData = [ - 0.280477536, 0.259957371, 0.238217659, 0.215366218, 0.191558571, 0.167050728, - 0.142221385, 0.117514405, 0.093353739, 0.070136018, 0.048165337, 0.027449274, - 0.007551689, -0.012191879, -0.032557296, -0.054358257, -0.078483167, - -0.105781444, -0.137208672, -0.174049223, -0.217858518, -0.26986764, - -0.329886107, -0.395653113, -0.463819615, -0.530529991, -0.591308473, - -0.641252419, -0.675396192, -0.689099366, -0.679883827, -0.649742172, - -0.602149752, -0.540699996, -0.469155442, -0.39235518, -0.317187358, - -0.251641431, -0.203124483, -0.175400473, -0.167133512, -0.174805821, - -0.194600911, -0.222664488, -0.254875954, -0.286753396, -0.31384639, - -0.331733387, -0.335992097, -0.322259345, -0.28761534, -0.234372353, - -0.167389335, -0.091870697, -0.013026713, 0.063931601, 0.133955753, - 0.193415777, 0.241940543, 0.280019233, 0.308168154, 0.326938643, 0.337234614, - 0.34096367, 0.340608802, 0.338547054, 0.336593745, 0.335321866, 0.334127457, - 0.331817533, 0.327341923, 0.320216724, 0.310432332, 0.298228465, 0.284102612, - 0.268784935, 0.253114795, 0.237954629, 0.224151962, 0.212536008, 0.203736355, - 0.198010458, 0.195233614, 0.194960735, 0.196490857, 0.19901247, 0.201666439, - 0.203617401, 0.204129573, 0.202630823, 0.19873752, 0.192336315, 0.183625216, - 0.173000981, 0.16106866, 0.148653001, 0.136669759, 0.12600632, 0.117368896, - 0.111065474, 0.107060448, -]; - -// 青藏高原 -const TibetanData = [ - -0.054774324, -0.072074468, -0.088166217, -0.102150868, -0.113128752, - -0.12021764, -0.122708696, -0.12041877, -0.113696453, -0.103130771, - -0.089455408, -0.073531475, -0.056259257, -0.03854918, -0.021352917, - -0.005665395, 0.007550856, 0.01747264, 0.023473197, 0.025172256, 0.022567986, - 0.01612004, 0.006575074, -0.005110343, -0.017780686, -0.030203073, - -0.041154273, -0.04937311, -0.053563998, -0.052516092, -0.045257867, - -0.031279225, -0.010592879, 0.016344502, 0.048680379, 0.085233754, - 0.124518788, 0.164767706, 0.204092074, 0.240587798, 0.272353213, 0.297512938, - 0.314395917, 0.321976324, 0.320031404, 0.309041322, 0.289958303, 0.26397781, - 0.232447596, 0.196815201, 0.15858192, 0.119195224, 0.079906512, 0.041729979, - 0.005377081, -0.028807517, -0.060676589, -0.09016857, -0.11718843, - -0.141549386, -0.163019079, -0.181382947, -0.196521195, -0.208451503, - -0.21726015, -0.223065102, -0.226003897, -0.226234158, -0.223991288, - -0.219766729, -0.214261928, -0.208224121, -0.202386774, -0.197405298, - -0.193729514, -0.191661726, -0.191394367, -0.192960556, -0.196177765, - -0.20070803, -0.206145455, -0.212083352, -0.218149914, -0.223985256, - -0.229195822, -0.233329665, -0.235927137, -0.236550243, -0.234784989, - -0.230241493, -0.222529731, -0.211284994, -0.196192431, -0.177010405, - -0.153629275, -0.126243447, -0.095383816, -0.061763417, -0.026131148, - 0.010750252, 0.048064799, -]; - -function CustomChartPanel() { - const option = { - title: { - // text: "Stacked Line", - }, - tooltip: { - trigger: "axis", - }, - legend: { - data: ["南极", "北极", "青藏高原"], - textStyle: { color: "#04fbfd", cursor: "point", fontSize: 20 }, - }, - animationDuration: 10 * 1000, - animationEasing: "cubicInOut", - grid: { - left: "3%", - right: "4%", - bottom: "3%", - containLabel: true, - }, - // toolbox: { - // feature: { - // // 下载 - // saveAsImage: {}, - // }, - // }, - xAxis: { - type: "category", - boundaryGap: false, - data: years, - axisLine: { - onZero: false, - symbol: ["none", "arrow"], - symbolOffser: [0, 10], - lineStyle: { - color: "#04fbfd", - }, - }, - axisLabel: { - interval: 4, - }, - }, - yAxis: { - type: "value", - min: -1, - max: 1, - interval: 0.5, - splitNumber: 5, - splitLine: { show: false }, - axisLine: { - onZero: false, - show: true, - symbol: ["none", "arrow"], - symbolOffset: [0, 10], - lineStyle: { - color: "#04fbfd", - }, - }, - axisLabel: { - show: true, - }, - axisTick: { show: true }, - scale: true, - }, - dataZoom: { type: "inside", start: 0, end: 100 }, - series: [ - { - name: "北极", - type: "line", - stack: "Total", - data: AntarcticaData, - smooth: true, - color: "red", - symbol: "none", - itemStyle: { - color: "red", - }, - }, - { - name: "南极", - type: "line", - // stack: "Total", - data: ArcticData, - smooth: true, - color: "blue", - symbol: "none", - itemStyle: { - color: "blue", - }, - }, - { - name: "青藏高原", - type: "line", - // stack: "Total", - data: TibetanData, - smooth: true, - color: "green", - symbol: "none", - itemStyle: { - color: "green", - }, - }, - ], - }; - - return ; -} - -export default CustomChartPanel; diff --git a/src/components/domain/Three/SceneOne/Legend.jsx b/src/components/domain/Three/SceneOne/Legend.jsx deleted file mode 100644 index 780323d..0000000 --- a/src/components/domain/Three/SceneOne/Legend.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import styles from "./index.module.less"; - -const colorBar = [ - "#801FEF", - "#050CFB", - "#3B6EE6", - "#159AFF", - "#36C1F8", - "#AADBF2", - "#FFF479", - "#FFC113", - "#FF7E00", - "#FF7E00", - "#CD0000", - "#FFB1B1", -]; - -function Legend() { - return ( -
-
全球温度异常空间分布
-
- {colorBar.map((color, index) => { - return ( -
- ); - })} -
-
- {["", -1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1.0, ""].map( - (item, index) => { - return ( -
- {item} -
- ); - } - )} -
-
- ); -} - -export default Legend; diff --git a/src/components/domain/Three/SceneOne/ViewerOne.jsx b/src/components/domain/Three/SceneOne/ViewerOne.jsx deleted file mode 100644 index 6daaf75..0000000 --- a/src/components/domain/Three/SceneOne/ViewerOne.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import { CameraFlyTo } from "resium"; -import { Cartesian3 } from "cesium"; -import MapLayout from "@/components/map/Layout"; -import CustomToolbar from "@/components/common/CustomToolbar"; -import CustomClock from "@/components/common/CustomClock"; -import ViewerImageLayer from "./ViewerImageLayer"; -import WavePoint from "@/components/common/WavePoint"; - -function ViewerOne({ children }) { - return ( -
- -
- 两极协同—连接南极和北极的热带大西洋经向模的媒介作用 -
- - - - - - - {children} -
-
- ); -} - -export default ViewerOne; diff --git a/src/components/domain/Three/SceneOne/ViewerThree.jsx b/src/components/domain/Three/SceneOne/ViewerThree.jsx deleted file mode 100644 index b5f6390..0000000 --- a/src/components/domain/Three/SceneOne/ViewerThree.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import { CameraFlyTo } from "resium"; -import { Cartesian3 } from "cesium"; -import MapLayout from "@/components/map/Layout"; -import WavePoint from "@/components/common/WavePoint"; -import ViewerImageLayer from "./ViewerImageLayer"; - -function ViewerThree({ children }) { - return ( -
- - - - {children} - - -
- ); -} - -export default ViewerThree; diff --git a/src/components/domain/Three/SceneOne/ViewerTwo.jsx b/src/components/domain/Three/SceneOne/ViewerTwo.jsx deleted file mode 100644 index 3766263..0000000 --- a/src/components/domain/Three/SceneOne/ViewerTwo.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { CameraFlyTo } from "resium"; -import { Cartesian3 } from "cesium"; -import MapLayout from "@/components/map/Layout"; -import ViewerImageLayer from "./ViewerImageLayer"; -import WavePoint from "@/components/common/WavePoint"; - -function ViewerTwo({ children }) { - return ( -
- - - - - {children} - -
- ); -} - -export default ViewerTwo; diff --git a/src/components/domain/Three/SceneOne/index.jsx b/src/components/domain/Three/SceneOne/index.jsx deleted file mode 100644 index 4422b25..0000000 --- a/src/components/domain/Three/SceneOne/index.jsx +++ /dev/null @@ -1,30 +0,0 @@ -import TextInfoPanel from "@/components/common/TextInfoPanel"; -import CustomChartPanel from "./CustomChartPanel"; -import Legend from "./Legend"; -import ViewerOne from "./ViewerOne"; -import ViewerTwo from "./ViewerTwo"; -import ViewerThree from "./ViewerThree"; -import styles from "./index.module.less"; - -function SceneOne() { - return ( -
-
- - - -
-
-
- -
-
- -
-
- -
- ); -} - -export default SceneOne; diff --git a/src/components/domain/Three/SceneOne/index.module.less b/src/components/domain/Three/SceneOne/index.module.less deleted file mode 100644 index c6c6a53..0000000 --- a/src/components/domain/Three/SceneOne/index.module.less +++ /dev/null @@ -1,142 +0,0 @@ -.sceneOne :global { - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - background-color: darkslategray; - - .domain-viewers { - width: 100%; - flex: 1; - display: flex; - - .domain-viewer { - flex: 1; - position: relative; - - .title { - pointer-events: none; - } - } - } - - .domain-info { - flex: 1; - margin: 12px; - display: flex; - justify-content: space-between; - gap: 12px; - - .left-panel { - width: 450px; - display: flex; - flex-direction: column; - height: 100%; - } - - .right-panel { - flex: 1; - min-width: 450px; - display: flex; - flex-direction: column; - gap: 12px; - - .top-panel { - flex: 1; - } - - .bottom-panel { - flex: 1; - } - - .form-panel { - width: 100%; - height: 100%; - pointer-events: auto; - padding: 12px; - border: 1px solid #04fbfd; - color: #02f9ff !important; - background-color: #000000e7; - border-radius: 8px; - - .ant-form-item-label { - label { - color: white; - } - } - - .ant-form-item-control { - .ant-select-multiple { - max-height: 300px; - overflow-y: scroll; - - &::-webkit-scrollbar { - width: 6px; - height: 1px; - } - &::-webkit-scrollbar-thumb { - border-radius: 6px; - background: #00a2a2; - } - &::-webkit-scrollbar-track { - border-radius: 6px; - background: none; - } - } - } - } - } - } -} - -.legend :global { - position: absolute; - bottom: calc(50% + 14px); - width: 50%; - left: 25%; - z-index: 1000; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - background-color: #000000e7; - border: 1px solid #04fbfd; - border-radius: 8px; - padding: 8px; - - .legend-title { - color: #04fbfd; - } - - .colorbar { - width: 100%; - height: 14px; - display: flex; - margin: 8px 0; - - .colorbar-item { - flex: 1; - height: 100%; - border: 1px black solid; - - &:not(:nth-child(1)) { - border-left: none; - } - } - } - - .legend-text { - display: flex; - justify-content: space-evenly; - width: 100%; - height: 20px; - - .legend-text-item { - flex: 1; - text-align: right; - font-weight: 600; - color: white; - -webkit-text-stroke: #04fbfd 1px; - } - } -} diff --git a/src/components/domain/Three/SceneSwitch.jsx b/src/components/domain/Three/SceneSwitch.jsx deleted file mode 100644 index 7b29f62..0000000 --- a/src/components/domain/Three/SceneSwitch.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Button } from "antd"; - -function SceneSwitch({ scene, setScene }) { - const switchHandler = () => { - setScene(scene === 1 ? 2 : 1); - }; - - return ( - - ); -} - -export default SceneSwitch; diff --git a/src/components/domain/Three/SceneTwo/index.jsx b/src/components/domain/Three/SceneTwo/index.jsx index 7c03b3b..c65f0e9 100644 --- a/src/components/domain/Three/SceneTwo/index.jsx +++ b/src/components/domain/Three/SceneTwo/index.jsx @@ -1,9 +1,6 @@ import MapLayout from "@/components/map/Layout"; import Legend from "./Legend"; -import ViewerOne from "../SceneOne/ViewerOne"; import CustomFlyTo from "./CustomFlyTo"; -import SSTImageLayer from "./SSTImageLayer"; -import TSImageLayer from "./TSImageLayer"; import HGTImageLayer from "./HGTImageLayer"; import Point from "./Point"; import Circles from "./Circles"; @@ -25,8 +22,6 @@ function SceneTwo() { - {/* */} - {/* */}
diff --git a/src/components/domain/Three/WavePoints.jsx b/src/components/domain/Three/WavePoints.jsx deleted file mode 100644 index 4678205..0000000 --- a/src/components/domain/Three/WavePoints.jsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Fragment } from "react"; -import WavePoint from "@/components/common/WavePoint"; - -export default function WavePoints() { - return ( - - - - - ); -} diff --git a/src/components/domain/Three/index.jsx b/src/components/domain/Three/index.jsx index 632006b..c8c23f6 100644 --- a/src/components/domain/Three/index.jsx +++ b/src/components/domain/Three/index.jsx @@ -1,17 +1,10 @@ -import { useState } from "react"; import styles from "./index.module.less"; -import SceneOne from "./SceneOne"; import SceneTwo from "./SceneTwo"; -import SceneSwitch from "./SceneSwitch"; export default function DomainThree() { - const [scene, setScene] = useState(1); - return (
- {/* {scene === 1 ? : } */} - {/* */}
); } diff --git a/src/components/domain/Two/CustomFlyTo.jsx b/src/components/domain/Two/CustomFlyTo.jsx index daefe13..143e5b5 100644 --- a/src/components/domain/Two/CustomFlyTo.jsx +++ b/src/components/domain/Two/CustomFlyTo.jsx @@ -1,8 +1,11 @@ import { Cartesian3, EasingFunction } from "cesium"; +import { useEffect } from "react"; +import { useSelector } from "react-redux"; import { useCesium } from "resium"; function CustomFlyTo() { const { viewer, camera } = useCesium(); + const { replayVersion } = useSelector((state) => state.data); function cameraFlyToLine() { const area1Options = { @@ -80,12 +83,28 @@ function CustomFlyTo() { duration: 3, complete: function () { setTimeout(() => { - camera.flyTo(QTPlateauOption); + camera.flyTo(HadleyCellOptions); }, 3000); }, easingFunction: EasingFunction.LINEAR_NONE, }; + const HadleyCellOptions = { + destination: Cartesian3.fromDegrees(94, 1, 5000000), + duration: 2, + orientation: { + heading: 6, + pitch: -1.2, + roll: -6.28, + }, + complete: function () { + setTimeout(() => { + camera.flyTo(QTPlateauOption); + }, 1000); + }, + easingFunction: EasingFunction.LINEAR_NONE, + }; + const QTPlateauOption = { destination: Cartesian3.fromDegrees(92, 8, 5000000), duration: 2, @@ -100,6 +119,13 @@ function CustomFlyTo() { camera.flyTo(area1Options); } cameraFlyToLine(); + + useEffect(() => { + viewer.clock.shouldAnimate = false; + viewer.clock.currentTime = viewer.clock.startTime.clone(); + cameraFlyToLine(); + }, [replayVersion]); + return <>; } diff --git a/src/components/domain/Two/HadleyCell.jsx b/src/components/domain/Two/HadleyCell.jsx index b728fbf..c805c1d 100644 --- a/src/components/domain/Two/HadleyCell.jsx +++ b/src/components/domain/Two/HadleyCell.jsx @@ -33,7 +33,7 @@ export default function HadleyCell() { { - const { currentTime, stopTime } = viewer.clock; - const leftTime = Math.floor( - stopTime.secondsOfDay - currentTime.secondsOfDay - ); - - if (leftTime < 5) { - setShowIO(true); - } else if (showIO) { - setShowIO(false); - } - if (leftTime < 3) { - setShowTB(true); - } else if (showIO) { - setShowTB(false); - } - }, [showIO]); - - useInterval(showAnimate, 100); - - return ( - - - - - - - - - - - - ); -} - -export default Labels; diff --git a/src/components/domain/Two/Labels/LabelEtity.jsx b/src/components/domain/Two/Labels/LabelEtity.jsx new file mode 100644 index 0000000..086b064 --- /dev/null +++ b/src/components/domain/Two/Labels/LabelEtity.jsx @@ -0,0 +1,58 @@ +import { useEffect, useState } from "react"; +import { useSelector } from "react-redux"; +import { Entity, LabelGraphics, useCesium } from "resium"; +import { useInterval, useToggle } from "ahooks"; +import { Cartesian2, Color, LabelStyle } from "cesium"; + +export default function LabelEntity({ showTime, text, position }) { + const { viewer } = useCesium(); + const { replayVersion } = useSelector((state) => state.data); + const [deley, setDeley] = useState(300); + const [show, setShow] = useState(false); + + useEffect(() => { + setDeley(300); + setShow(false); + }, [replayVersion]); + + const [font, { toggle: fontToggle }] = useToggle( + "24px Helvetica", + "bold 32px Helvetica" + ); + const [fillColor, { toggle: colorToggle }] = useToggle( + Color.fromCssColorString("#04fbfd").withAlpha(0.9), + Color.fromCssColorString("#04fbfd") + ); + + useInterval(() => { + const { startTime, currentTime } = viewer.clock; + const passtime = currentTime.secondsOfDay - startTime.secondsOfDay; + + if (passtime >= showTime) { + setShow(true); + let timer = setInterval(() => { + fontToggle(); + colorToggle(); + }, 500); + + setTimeout(() => { + clearInterval(timer); + }, 3000); + setDeley(undefined); + } + }, deley); + + return ( + + + + ); +} diff --git a/src/components/domain/Two/Labels/index.jsx b/src/components/domain/Two/Labels/index.jsx new file mode 100644 index 0000000..3b91c0e --- /dev/null +++ b/src/components/domain/Two/Labels/index.jsx @@ -0,0 +1,35 @@ +import { Fragment } from "react"; +import { Cartesian3 } from "cesium"; +import LabelEntity from "./LabelEtity"; + +export default function Labels() { + return ( + + + + + + + + ); +} diff --git a/src/components/domain/Two/ReplayButton.jsx b/src/components/domain/Two/ReplayButton.jsx new file mode 100644 index 0000000..7252b69 --- /dev/null +++ b/src/components/domain/Two/ReplayButton.jsx @@ -0,0 +1,20 @@ +import { useCallback } from "react"; +import { useDispatch } from "react-redux"; +import { Button } from "antd"; +import styles from "./index.module.less"; + +export default function ReplayButton() { + const dispatch = useDispatch(); + + const playHandler = useCallback(() => { + dispatch.data.update({ replayVersion: Date.now() }); + }, []); + + return ( +
+ +
+ ); +} diff --git a/src/components/domain/Two/index.jsx b/src/components/domain/Two/index.jsx index 58b8809..f5f63eb 100644 --- a/src/components/domain/Two/index.jsx +++ b/src/components/domain/Two/index.jsx @@ -16,6 +16,7 @@ import SiteLegend from "./SiteLegend"; import Labels from "./Labels"; import TimeLinePanel from "./TimeLinePanel"; import HadleyCell from "./HadleyCell"; +import ReplayButton from "./ReplayButton"; export default function DomainTwo() { return ( @@ -37,8 +38,9 @@ export default function DomainTwo() {
- + {/* */} + {/* */} ); diff --git a/src/components/domain/Two/index.module.less b/src/components/domain/Two/index.module.less index 566fcc6..9e6bb64 100644 --- a/src/components/domain/Two/index.module.less +++ b/src/components/domain/Two/index.module.less @@ -54,3 +54,9 @@ } } } + +.replayButton :global { + position: absolute; + top: 12px; + left: 12px; +} diff --git a/src/components/home/Layout/NavBar.jsx b/src/components/home/Layout/NavBar.jsx index d2bf5c8..3d4e9ed 100644 --- a/src/components/home/Layout/NavBar.jsx +++ b/src/components/home/Layout/NavBar.jsx @@ -29,7 +29,11 @@ const itemsThree = [ { key: "1", label: ( - + 北极海冰预报 ), @@ -37,7 +41,11 @@ const itemsThree = [ { key: "2", label: ( - + 北极航线智能规划 ), @@ -95,14 +103,16 @@ const itemsFour = [ ]; function NavBar() { - const navigateHandler = (type) => window.open(`/map/${type}`, "_blank"); + const navigateHandler = (url) => window.open(url, "_blank"); return (
navigateHandler("http://casearthpoles.tpdc.ac.cn/zh-hans/")} + onClick={() => + navigateHandler("http://casearthpoles.tpdc.ac.cn/zh-hans/") + } /> > ", heading, pitch, roll); + // console.log("heading,pitch,roll :>> ", heading, pitch, roll); }); return <>; diff --git a/src/models/data.js b/src/models/data.js index 194dbf9..43f1101 100644 --- a/src/models/data.js +++ b/src/models/data.js @@ -1,5 +1,7 @@ export const data = { - state: {}, + state: { + replayVersion: Date.now(), + }, reducers: { update(state, payload) { return { ...state, ...payload };