SWYJLayer.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Networking;
  6. using UnityEngine.Serialization;
  7. using UnityEngine.UI;
  8. using UnityAsync;
  9. using XCharts.Runtime;
  10. using Newtonsoft.Json.Linq;
  11. using Newtonsoft.Json;
  12. using Unity.Mathematics;
  13. using static XCharts.Runtime.RadarCoord;
  14. public enum shuiWeiYuJingDataType
  15. {
  16. BuYuan,
  17. TaoKou
  18. }
  19. [System.Serializable]
  20. public class StationData:IComparable
  21. {
  22. public string ADDVCD = "421083";
  23. public string ADMAUTH = "荆州水文";
  24. public string ATCUNIT = "荆州市水文局";
  25. public string BGFRYM = "201404";
  26. public string BSNM = "长江";
  27. public string COMMENTS = "中小河流";
  28. public string DRNA; // null, 用string表示
  29. public string DTMNM = "吴淞";
  30. public string ESSTYM = "201404";
  31. public string FRGRD = "3";
  32. public string HNNM = "内荆河";
  33. public float LGTD = 113.209264f;
  34. public string LOCALITY = "湖北水文";
  35. public float LTTD = 29.960969f;
  36. public string MODITIME = "2022-02-23";
  37. public string PHCD = "ZBYZS";
  38. public int ROWNUM_ = 185;
  39. public string RVNM = "子贝渊河";
  40. public string STAZT; // null, 用string表示
  41. public string STBK = "0";
  42. public string STCD = "61016161";
  43. public string STLC = "荆州市洪湖市瞿家湾镇月池村一组";
  44. public string STNM = "子贝渊(闸上)";
  45. public string STTP = "DD";
  46. public string USFL = "1";
  47. public float dwz; // null, 用string表示
  48. public float tgtq; // null, 用string表示
  49. public float upz = 25.5f;
  50. public int CompareTo(object obj)
  51. {
  52. StationData other = (StationData)obj;
  53. float max = MathF.Max(dwz, upz);
  54. float max1 = MathF.Max(other.dwz, other.upz);
  55. if (max > max1)
  56. {
  57. return -1;
  58. }
  59. else if (max < max1)
  60. {
  61. return 1;
  62. }
  63. else {
  64. return 0;
  65. }
  66. }
  67. }
  68. public class SWYJLayer : YZTRootLayer
  69. {
  70. public shuiWeiYuJingDataType currentDataType = shuiWeiYuJingDataType.BuYuan;
  71. //全域雨量
  72. private Text _dangQianYuLiangText;
  73. private Text _zuiDaYuLiangText;
  74. private Text _pingJunYuLiangText;
  75. private Text _chaoJingZhanDianText;
  76. private Text _weatherTypeText;
  77. private Image _weatherTypeIcon;
  78. private QuanYuYuLiangData currentQuanYuYuLiangData = null;
  79. //站点排名
  80. private Text _paiMing_1_Text;
  81. private Text _paiMing_6_Text;
  82. private Text _paiMing_12_Text;
  83. private Text _paiMing_24_Text;
  84. private Text _paiMing_1_Name_Text;
  85. private Text _paiMing_6_Name_Text;
  86. private Text _paiMing_12_Name_Text;
  87. private Text _paiMing_24_Name_Text;
  88. //工程安全监测
  89. //检测数据
  90. private Text _pingJunShuiWeiText;
  91. private Text _sheFangShuiWeiText;
  92. private Text _jingJieShuiWeiText;
  93. private Text _baoZhengShuiWeiText;
  94. private Text _shuiWeiText;
  95. //水位变化与统计
  96. private BarChart shuiWeiBianHua;
  97. [Header("工程安全监测-水位变化与统计数据")]
  98. public ShuiWeiBianHuaData ShuiWeiBianHuaData_TK_Month;
  99. public ShuiWeiBianHuaData ShuiWeiBianHuaData_TK_Day;
  100. public ShuiWeiBianHuaData ShuiWeiBianHuaData_TK_Hour;
  101. private Dropdown shuiWeiBarChartDropdown;
  102. //异常警告
  103. [Header("异常警告数据")] public List<YiChangJingGaoData> currentYiChangJingGaoDatas;
  104. private List<YiChangJingGaoItem> currentYiChangJingGaoItems;
  105. private RectTransform _yiChangJingGaoListContent;
  106. public GameObject YiChangJingGaoItemOri;
  107. public RectTransform main;
  108. public RectTransform miniMap;
  109. public UnityEngine.UI.Button globalSWBtn;
  110. public UnityEngine.UI.Button exitGlobalSWBtn;
  111. public Sprite highLightBtn;
  112. public Sprite normalBtn;
  113. private Button BuYuanDataButton;
  114. private Button TaoKouDataButton;
  115. public GameObject miniMapSWContent;
  116. public List<SWHeightUnit> sWHeightUnits = new List<SWHeightUnit>();
  117. public GameObject sWHeightUnitPrefab;
  118. public GameObject runtimePointObj;
  119. public GameObject shuiweiIconPrefab;
  120. private List<ShuiWeiIconCtrl> _shuiWeiIconCtrls = new List<ShuiWeiIconCtrl>();
  121. private Transform _shuiWeiIconContent;
  122. private bool creatShuiWeiIcon = false;
  123. public GameObject[] zdpmObjs;
  124. private void Awake()
  125. {
  126. Init();
  127. BuYuanDataButton = this.transform.Find("Main/BuYuanButton").GetComponent<Button>();
  128. BuYuanDataButton.onClick.AddListener(() =>
  129. {
  130. BuYuanDataButton.GetComponent<UnityEngine.UI.Image>().sprite = highLightBtn;
  131. TaoKouDataButton.GetComponent<UnityEngine.UI.Image>().sprite = normalBtn;
  132. StaticLod.instance.OnFoucusStatic(0);
  133. ChangeDataType(shuiWeiYuJingDataType.BuYuan);
  134. });
  135. TaoKouDataButton = this.transform.Find("Main/TaoKouButton").GetComponent<Button>();
  136. TaoKouDataButton.onClick.AddListener(() =>
  137. {
  138. BuYuanDataButton.GetComponent<UnityEngine.UI.Image>().sprite = normalBtn;
  139. TaoKouDataButton.GetComponent<UnityEngine.UI.Image>().sprite = highLightBtn;
  140. StaticLod.instance.OnFoucusStatic(1);
  141. ChangeDataType(shuiWeiYuJingDataType.TaoKou);
  142. });
  143. //水位
  144. _shuiWeiIconContent = this.transform.Find("Main/ShuiWeiIconContent").transform;
  145. HttpHelper._Instance.OnSWYJRefresh += () =>
  146. {
  147. SetZhanDianPaiMingData();
  148. CreateOrRefreshShuiWeiIcon();
  149. RefreshThreeLevel();
  150. };
  151. }
  152. private async void OnEnable()
  153. {
  154. StaticLod.instance.OnFoucusStatic(currentDataType==shuiWeiYuJingDataType.BuYuan?0:1);
  155. //水位统计图
  156. OnShuiWeiDropDownSelect(shuiWeiBarChartDropdown.value);
  157. SetZhanDianPaiMingData();
  158. CreateOrRefreshShuiWeiIcon();
  159. RefreshThreeLevel();
  160. }
  161. private void OnDisable()
  162. {
  163. }
  164. public void RefreshThreeLevel() {
  165. if (GlobalData.threeLevelShuiWeiDatas.Count < 1 || GlobalData.BuYuanShuiWeiDataList.Count < 1)
  166. return;
  167. if (currentDataType == shuiWeiYuJingDataType.BuYuan) {
  168. float value1 = GlobalData.BuYuanShuiWeiDataList[0].value;
  169. float value2 = GlobalData.BuYuanShuiWeiDataList[1].value;
  170. if (value1 > 1000) {
  171. value1 = value1 / 100.0f;
  172. }
  173. if (value2 > 1000)
  174. {
  175. value2 = value2 / 100.0f;
  176. }
  177. _pingJunShuiWeiText.text = $"{((value1 + value2) / 2).ToString("0.00")} <color=#A5BBE2>m</color>";
  178. _sheFangShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[0].floodProtectionLevel} m";
  179. _jingJieShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[0].warningLevel} m";
  180. _baoZhengShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[0].guaranteeLevel} m";
  181. _shuiWeiText.text = $"{value1.ToString("0.00")}";
  182. }
  183. else
  184. {
  185. float value1 = GlobalData.TaoKouShuiWeiDataList[0].value;
  186. float value2 = GlobalData.TaoKouShuiWeiDataList[1].value;
  187. if (value1 > 1000)
  188. {
  189. value1 = value1 / 100.0f;
  190. }
  191. if (value2 > 1000)
  192. {
  193. value2 = value2 / 100.0f;
  194. }
  195. _pingJunShuiWeiText.text = $"{((value1 + value2) / 2).ToString("0.00")} <color=#A5BBE2>m</color>";
  196. _sheFangShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[1].floodProtectionLevel} m";
  197. _jingJieShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[1].warningLevel} m";
  198. _baoZhengShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[1].guaranteeLevel} m";
  199. _shuiWeiText.text = $"{value1.ToString("0.00")}";
  200. }
  201. }
  202. //水位图标
  203. public void CreateOrRefreshShuiWeiIcon()
  204. {
  205. if (_shuiWeiIconCtrls.Count < 1)
  206. {
  207. for (int i = 0; i < GlobalData.BuYuanShuiWeiDataList.Count; i++)
  208. {
  209. ShuiWeiIconCtrl tempIcon =
  210. Instantiate(shuiweiIconPrefab, _shuiWeiIconContent).GetComponent<ShuiWeiIconCtrl>();
  211. tempIcon.Init(GlobalData.BuYuanShuiWeiDataList[i]);
  212. _shuiWeiIconCtrls.Add(tempIcon);
  213. }
  214. if (_shuiWeiIconCtrls.Count < 1)
  215. {
  216. return;
  217. }
  218. GameObject[] BY_targs = GameObject.FindGameObjectsWithTag(shuiWeiType.BuYuanShuiWei.ToString());
  219. GameObject[] TK_targs = GameObject.FindGameObjectsWithTag(shuiWeiType.TaoKouShuiWei.ToString());
  220. for (int i = 0; i < _shuiWeiIconCtrls.Count; i++)
  221. {
  222. string objName = _shuiWeiIconCtrls[i]._data.targetName;
  223. if (_shuiWeiIconCtrls[i]._data.type == shuiWeiType.BuYuanShuiWei)
  224. {
  225. for (int j = 0; j < BY_targs.Length; j++)
  226. {
  227. if (BY_targs[j].gameObject.name == objName)
  228. {
  229. _shuiWeiIconCtrls[i].targetTransForm = BY_targs[j].transform;
  230. break;
  231. }
  232. }
  233. }
  234. else
  235. {
  236. for (int j = 0; j < TK_targs.Length; j++)
  237. {
  238. if (TK_targs[j].gameObject.name == objName)
  239. {
  240. _shuiWeiIconCtrls[i].targetTransForm = TK_targs[j].transform;
  241. break;
  242. }
  243. }
  244. }
  245. }
  246. }
  247. else {
  248. for (int i = 0; i < GlobalData.BuYuanShuiWeiDataList.Count; i++)
  249. {
  250. _shuiWeiIconCtrls[i].Init(GlobalData.BuYuanShuiWeiDataList[i]);
  251. }
  252. }
  253. }
  254. public void Init()
  255. {
  256. //全域雨量
  257. _dangQianYuLiangText = this.transform.Find("Left/QuanYuYuLiang/DangQianYuLiang/numText").GetComponent<Text>();
  258. _zuiDaYuLiangText = this.transform.Find("Left/QuanYuYuLiang/ZuiDaYuLiang/numText").GetComponent<Text>();
  259. _pingJunYuLiangText = this.transform.Find("Left/QuanYuYuLiang/PingJunYuLiang/numText").GetComponent<Text>();
  260. _chaoJingZhanDianText = this.transform.Find("Left/QuanYuYuLiang/ChaoZhanYuJing/numText").GetComponent<Text>();
  261. _weatherTypeText = this.transform.Find("Left/QuanYuYuLiang/weatherTypeName").GetComponent<Text>();
  262. _weatherTypeIcon = this.transform.Find("Left/QuanYuYuLiang/weatherIcon").GetComponent<Image>();
  263. if (currentQuanYuYuLiangData != null)
  264. {
  265. _dangQianYuLiangText.text =
  266. $"{currentQuanYuYuLiangData.dangQianYuLiang} <size=14><color=#A5BBE2>m</color></size>";
  267. _zuiDaYuLiangText.text =
  268. $"{currentQuanYuYuLiangData.zuiDaYuLiang} <size=14><color=#A5BBE2>m</color></size>";
  269. _pingJunYuLiangText.text =
  270. $"{currentQuanYuYuLiangData.pingJunYuLiang} <size=14><color=#A5BBE2>m</color></size>";
  271. _chaoJingZhanDianText.text =
  272. $"{currentQuanYuYuLiangData.chaoJingZhanDian} <size=14><color=#A5BBE2>个</color></size>";
  273. _weatherTypeText.text = $"{currentQuanYuYuLiangData.dangQianYuLiang}";
  274. //todo 换图标
  275. }
  276. //工程安全监测
  277. //检测数据
  278. _pingJunShuiWeiText = this.transform.Find("RightUp/JianKongShuJu/PingJunShuiWei/numText").GetComponent<Text>();
  279. _sheFangShuiWeiText = this.transform.Find("RightUp/JianKongShuJu/SheFangShuiWei/numText").GetComponent<Text>();
  280. _jingJieShuiWeiText = this.transform.Find("RightUp/JianKongShuJu/JingJieShuiWei/numText").GetComponent<Text>();
  281. _baoZhengShuiWeiText =
  282. this.transform.Find("RightUp/JianKongShuJu/BaoZhengShuiWei/numText").GetComponent<Text>();
  283. _shuiWeiText = this.transform.Find("RightUp/JianKongShuJu/ShuiWei/numText").GetComponent<Text>();
  284. //水位变化与统计
  285. shuiWeiBianHua = this.transform.Find("RightUp/ShuiWeiTongJi/BarChart").GetComponent<BarChart>();
  286. shuiWeiBarChartDropdown = this.transform.Find("RightUp/ShuiWeiTongJi/Dropdown").GetComponent<Dropdown>();
  287. shuiWeiBarChartDropdown.onValueChanged.AddListener(OnShuiWeiDropDownSelect);
  288. //异常警告
  289. currentYiChangJingGaoItems = new List<YiChangJingGaoItem>();
  290. _yiChangJingGaoListContent = this.transform.Find("YiChangJingGao/ScrollView/Viewport/Content")
  291. .GetComponent<RectTransform>();
  292. if (currentYiChangJingGaoDatas != null && currentYiChangJingGaoDatas.Count > 0)
  293. {
  294. for (int i = 0; i < currentYiChangJingGaoDatas.Count; i++)
  295. {
  296. YiChangJingGaoItem tempItem = Instantiate(YiChangJingGaoItemOri, _yiChangJingGaoListContent)
  297. .GetComponent<YiChangJingGaoItem>();
  298. tempItem.Init();
  299. tempItem.SetData(currentYiChangJingGaoDatas[i]);
  300. currentYiChangJingGaoItems.Add(tempItem);
  301. }
  302. }
  303. globalSWBtn.onClick.AddListener(OnGlobalSWBtnClick);
  304. exitGlobalSWBtn.onClick.AddListener(() =>
  305. {
  306. CameraManager.SwitchCamera(0);
  307. viewMode = ViewMode.normal;
  308. miniMap.gameObject.SetActive(false);
  309. main.gameObject.SetActive(true);
  310. });
  311. }
  312. public async void OnGlobalSWBtnClick() {
  313. CameraManager.SwitchCamera(1);
  314. viewMode = ViewMode.miniMap;
  315. GameObject shaPan = GameObject.FindGameObjectWithTag("ShaPan");
  316. if (sWHeightUnits.Count < 1)
  317. {
  318. for (int i = 0; i < GlobalData.swDatas.Count; i++)
  319. {
  320. GameObject gameObject = Instantiate(sWHeightUnitPrefab);
  321. SWHeightUnit swHUnit = gameObject.GetComponent<SWHeightUnit>();
  322. swHUnit.transform.SetParent(miniMapSWContent.transform);
  323. float max = math.max(GlobalData.swDatas[i].upz, GlobalData.swDatas[i].dwz);
  324. swHUnit.Init(GlobalData.swDatas[i].LGTD, GlobalData.swDatas[i].LTTD, GlobalData.swDatas[i].STNM, max.ToString());
  325. sWHeightUnits.Add(swHUnit);
  326. swHUnit.bingObj = Instantiate(runtimePointObj).gameObject;
  327. swHUnit.bingObj.transform.SetParent(shaPan.transform.GetChild(11));
  328. swHUnit.bingObj.transform.localEulerAngles = Vector3.zero;
  329. swHUnit.bingObj.transform.localScale = Vector3.one;
  330. swHUnit.bingObj.transform.localPosition = CoordinateConverter.GeoToUGUISmall(GlobalData.swDatas[i].LGTD, GlobalData.swDatas[i].LTTD);
  331. swHUnit.bingObj.name = GlobalData.swDatas[i].STNM;
  332. }
  333. }
  334. else
  335. {
  336. for (int i = 0; i < GlobalData.swDatas.Count; i++)
  337. {
  338. float max = math.max(GlobalData.swDatas[i].upz, GlobalData.swDatas[i].dwz);
  339. sWHeightUnits[i].Init(GlobalData.swDatas[i].LGTD, GlobalData.swDatas[i].LTTD, GlobalData.swDatas[i].STNM, max.ToString());
  340. }
  341. }
  342. miniMap.gameObject.SetActive(true);
  343. main.gameObject.SetActive(false);
  344. }
  345. public void OnShuiWeiDropDownSelect(int value)
  346. {
  347. if (currentDataType == shuiWeiYuJingDataType.BuYuan)
  348. {
  349. switch (value)
  350. {
  351. case 0:
  352. SetShuiWeiTongJiBarChart(GlobalData.buYuanShuiWei_month);
  353. break;
  354. case 1:
  355. SetShuiWeiTongJiBarChart(GlobalData.buYuanShuiWei_day);
  356. break;
  357. case 2:
  358. SetShuiWeiTongJiBarChart(GlobalData.buYuanShuiWei_hour);
  359. break;
  360. }
  361. }
  362. else
  363. {
  364. switch (value)
  365. {
  366. case 0:
  367. SetShuiWeiTongJiBarChart(GlobalData.taoKouShuiWei_month);
  368. break;
  369. case 1:
  370. SetShuiWeiTongJiBarChart(GlobalData.taoKouShuiWei_day);
  371. break;
  372. case 2:
  373. SetShuiWeiTongJiBarChart(GlobalData.taoKouShuiWei_hour);
  374. break;
  375. }
  376. }
  377. }
  378. public void SetShuiWeiTongJiBarChart(ShuiWeiBianHuaData ShuiWeiBianHuaData)
  379. {
  380. if (ShuiWeiBianHuaData != null)
  381. {
  382. var x_chart = shuiWeiBianHua.GetChartComponent<XAxis>();
  383. x_chart.data.Clear();
  384. for (int i = 0; i < ShuiWeiBianHuaData.name.Length; i++)
  385. {
  386. x_chart.data.Add(ShuiWeiBianHuaData.name[i]);
  387. }
  388. x_chart.refreshComponent?.Invoke();
  389. var tempSeries = shuiWeiBianHua.series;
  390. tempSeries[0].ClearData();
  391. tempSeries[1].ClearData();
  392. SerieData[] serieDatas = new SerieData[ShuiWeiBianHuaData.value.Length];
  393. for (int i = 0; i < ShuiWeiBianHuaData.value.Length; i++)
  394. {
  395. serieDatas[i] = new SerieData();
  396. serieDatas[i].data = new List<double>();
  397. serieDatas[i].data.Add(i);
  398. serieDatas[i].data.Add(ShuiWeiBianHuaData.value[i]);
  399. }
  400. tempSeries[0].data.AddRange(serieDatas);
  401. tempSeries[1].data.AddRange(serieDatas);
  402. }
  403. }
  404. public void SetZhanDianPaiMingData()
  405. {
  406. if (GlobalData.swDatas.Count < 1)
  407. return;
  408. if (currentDataType == shuiWeiYuJingDataType.BuYuan)
  409. {
  410. List<StationData> stationDatas = new List<StationData>(GlobalData.swDatas);
  411. stationDatas.Sort();
  412. for (int i = 0; i < zdpmObjs.Length; i++) {
  413. zdpmObjs[i].transform.GetChild(1).GetComponent<Text>().text = stationDatas[i].STNM;
  414. float max = MathF.Max(stationDatas[i].upz, stationDatas[i].dwz);
  415. zdpmObjs[i].transform.GetChild(1).GetChild(0).GetComponent<Text>().text = $"{max} <size=14><color=#A5BBE2>mm</color></size>";
  416. }
  417. }
  418. else
  419. {
  420. //_paiMing_1_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  421. //_paiMing_1_Name_Text.text = $"套口水闸";
  422. //_paiMing_6_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  423. //_paiMing_6_Name_Text.text = $"套口水闸";
  424. //_paiMing_12_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  425. //_paiMing_12_Name_Text.text = $"套口水闸";
  426. //_paiMing_24_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  427. //_paiMing_24_Name_Text.text = $"套口水闸";
  428. }
  429. }
  430. public void ChangeDataType(shuiWeiYuJingDataType _type)
  431. {
  432. if (currentDataType != _type)
  433. {
  434. currentDataType = _type;
  435. OnShuiWeiDropDownSelect(shuiWeiBarChartDropdown.value);
  436. SetZhanDianPaiMingData();
  437. RefreshThreeLevel();
  438. }
  439. }
  440. }