SWYJLayer.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  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. [Header("全域流量数据")] public QuanYuYuLiangData currentQuanYuYuLiangData;
  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. _pingJunShuiWeiText.text = $"{((value1 + value2)/2).ToString("0.00")} <color=#A5BBE2>m</color>";
  171. _sheFangShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[0].flood_protection_level} m";
  172. _jingJieShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[0].warning_level} m";
  173. _baoZhengShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[0].guarantee_level} m";
  174. _shuiWeiText.text = $"{value1.ToString("0.00")}";
  175. }
  176. else
  177. {
  178. float value1 = GlobalData.BuYuanShuiWeiDataList[0].value;
  179. float value2 = GlobalData.BuYuanShuiWeiDataList[1].value;
  180. _pingJunShuiWeiText.text = $"{((value1 + value2) / 2).ToString("0.00")} <color=#A5BBE2>m</color>";
  181. _sheFangShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[1].flood_protection_level} m";
  182. _jingJieShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[1].warning_level} m";
  183. _baoZhengShuiWeiText.text = $"{GlobalData.threeLevelShuiWeiDatas[1].guarantee_level} m";
  184. _shuiWeiText.text = $"{value1.ToString("0.00")}";
  185. }
  186. }
  187. //水位图标
  188. public void CreateOrRefreshShuiWeiIcon()
  189. {
  190. if (_shuiWeiIconCtrls.Count < 1)
  191. {
  192. for (int i = 0; i < GlobalData.BuYuanShuiWeiDataList.Count; i++)
  193. {
  194. ShuiWeiIconCtrl tempIcon =
  195. Instantiate(shuiweiIconPrefab, _shuiWeiIconContent).GetComponent<ShuiWeiIconCtrl>();
  196. tempIcon.Init(GlobalData.BuYuanShuiWeiDataList[i]);
  197. _shuiWeiIconCtrls.Add(tempIcon);
  198. }
  199. if (_shuiWeiIconCtrls.Count < 1)
  200. {
  201. return;
  202. }
  203. GameObject[] BY_targs = GameObject.FindGameObjectsWithTag(shuiWeiType.BuYuanShuiWei.ToString());
  204. GameObject[] TK_targs = GameObject.FindGameObjectsWithTag(shuiWeiType.TaoKouShuiWei.ToString());
  205. for (int i = 0; i < _shuiWeiIconCtrls.Count; i++)
  206. {
  207. string objName = _shuiWeiIconCtrls[i]._data.targetName;
  208. if (_shuiWeiIconCtrls[i]._data.type == shuiWeiType.BuYuanShuiWei)
  209. {
  210. for (int j = 0; j < BY_targs.Length; j++)
  211. {
  212. if (BY_targs[j].gameObject.name == objName)
  213. {
  214. _shuiWeiIconCtrls[i].targetTransForm = BY_targs[j].transform;
  215. break;
  216. }
  217. }
  218. }
  219. else
  220. {
  221. for (int j = 0; j < TK_targs.Length; j++)
  222. {
  223. if (TK_targs[j].gameObject.name == objName)
  224. {
  225. _shuiWeiIconCtrls[i].targetTransForm = TK_targs[j].transform;
  226. break;
  227. }
  228. }
  229. }
  230. }
  231. }
  232. else {
  233. for (int i = 0; i < GlobalData.BuYuanShuiWeiDataList.Count; i++)
  234. {
  235. _shuiWeiIconCtrls[i].Init(GlobalData.BuYuanShuiWeiDataList[i]);
  236. }
  237. }
  238. }
  239. public void Init()
  240. {
  241. //全域雨量
  242. _dangQianYuLiangText = this.transform.Find("Left/QuanYuYuLiang/DangQianYuLiang/numText").GetComponent<Text>();
  243. _zuiDaYuLiangText = this.transform.Find("Left/QuanYuYuLiang/ZuiDaYuLiang/numText").GetComponent<Text>();
  244. _pingJunYuLiangText = this.transform.Find("Left/QuanYuYuLiang/PingJunYuLiang/numText").GetComponent<Text>();
  245. _chaoJingZhanDianText = this.transform.Find("Left/QuanYuYuLiang/ChaoZhanYuJing/numText").GetComponent<Text>();
  246. _weatherTypeText = this.transform.Find("Left/QuanYuYuLiang/weatherTypeName").GetComponent<Text>();
  247. _weatherTypeIcon = this.transform.Find("Left/QuanYuYuLiang/weatherIcon").GetComponent<Image>();
  248. if (currentQuanYuYuLiangData != null)
  249. {
  250. _dangQianYuLiangText.text =
  251. $"{currentQuanYuYuLiangData.dangQianYuLiang} <size=14><color=#A5BBE2>m</color></size>";
  252. _zuiDaYuLiangText.text =
  253. $"{currentQuanYuYuLiangData.zuiDaYuLiang} <size=14><color=#A5BBE2>m</color></size>";
  254. _pingJunYuLiangText.text =
  255. $"{currentQuanYuYuLiangData.pingJunYuLiang} <size=14><color=#A5BBE2>m</color></size>";
  256. _chaoJingZhanDianText.text =
  257. $"{currentQuanYuYuLiangData.chaoJingZhanDian} <size=14><color=#A5BBE2>个</color></size>";
  258. _weatherTypeText.text = $"{currentQuanYuYuLiangData.dangQianYuLiang}";
  259. //todo 换图标
  260. }
  261. //工程安全监测
  262. //检测数据
  263. _pingJunShuiWeiText = this.transform.Find("RightUp/JianKongShuJu/PingJunShuiWei/numText").GetComponent<Text>();
  264. _sheFangShuiWeiText = this.transform.Find("RightUp/JianKongShuJu/SheFangShuiWei/numText").GetComponent<Text>();
  265. _jingJieShuiWeiText = this.transform.Find("RightUp/JianKongShuJu/JingJieShuiWei/numText").GetComponent<Text>();
  266. _baoZhengShuiWeiText =
  267. this.transform.Find("RightUp/JianKongShuJu/BaoZhengShuiWei/numText").GetComponent<Text>();
  268. _shuiWeiText = this.transform.Find("RightUp/JianKongShuJu/ShuiWei/numText").GetComponent<Text>();
  269. //水位变化与统计
  270. shuiWeiBianHua = this.transform.Find("RightUp/ShuiWeiTongJi/BarChart").GetComponent<BarChart>();
  271. shuiWeiBarChartDropdown = this.transform.Find("RightUp/ShuiWeiTongJi/Dropdown").GetComponent<Dropdown>();
  272. shuiWeiBarChartDropdown.onValueChanged.AddListener(OnShuiWeiDropDownSelect);
  273. //异常警告
  274. currentYiChangJingGaoItems = new List<YiChangJingGaoItem>();
  275. _yiChangJingGaoListContent = this.transform.Find("YiChangJingGao/ScrollView/Viewport/Content")
  276. .GetComponent<RectTransform>();
  277. if (currentYiChangJingGaoDatas != null && currentYiChangJingGaoDatas.Count > 0)
  278. {
  279. for (int i = 0; i < currentYiChangJingGaoDatas.Count; i++)
  280. {
  281. YiChangJingGaoItem tempItem = Instantiate(YiChangJingGaoItemOri, _yiChangJingGaoListContent)
  282. .GetComponent<YiChangJingGaoItem>();
  283. tempItem.Init();
  284. tempItem.SetData(currentYiChangJingGaoDatas[i]);
  285. currentYiChangJingGaoItems.Add(tempItem);
  286. }
  287. }
  288. globalSWBtn.onClick.AddListener(OnGlobalSWBtnClick);
  289. exitGlobalSWBtn.onClick.AddListener(() =>
  290. {
  291. CameraManager.SwitchCamera(0);
  292. viewMode = ViewMode.normal;
  293. miniMap.gameObject.SetActive(false);
  294. main.gameObject.SetActive(true);
  295. });
  296. }
  297. public async void OnGlobalSWBtnClick() {
  298. CameraManager.SwitchCamera(1);
  299. viewMode = ViewMode.miniMap;
  300. GameObject shaPan = GameObject.FindGameObjectWithTag("ShaPan");
  301. if (sWHeightUnits.Count < 1)
  302. {
  303. for (int i = 0; i < GlobalData.swDatas.Count; i++)
  304. {
  305. GameObject gameObject = Instantiate(sWHeightUnitPrefab);
  306. SWHeightUnit swHUnit = gameObject.GetComponent<SWHeightUnit>();
  307. swHUnit.transform.SetParent(miniMapSWContent.transform);
  308. float max = math.max(GlobalData.swDatas[i].upz, GlobalData.swDatas[i].dwz);
  309. swHUnit.Init(GlobalData.swDatas[i].LGTD, GlobalData.swDatas[i].LTTD, GlobalData.swDatas[i].STNM, max.ToString());
  310. sWHeightUnits.Add(swHUnit);
  311. swHUnit.bingObj = Instantiate(runtimePointObj).gameObject;
  312. swHUnit.bingObj.transform.SetParent(shaPan.transform.GetChild(11));
  313. swHUnit.bingObj.transform.localEulerAngles = Vector3.zero;
  314. swHUnit.bingObj.transform.localScale = Vector3.one;
  315. swHUnit.bingObj.transform.localPosition = CoordinateConverter.GeoToUGUISmall(GlobalData.swDatas[i].LGTD, GlobalData.swDatas[i].LTTD);
  316. swHUnit.bingObj.name = GlobalData.swDatas[i].STNM;
  317. }
  318. }
  319. else
  320. {
  321. for (int i = 0; i < GlobalData.swDatas.Count; i++)
  322. {
  323. float max = math.max(GlobalData.swDatas[i].upz, GlobalData.swDatas[i].dwz);
  324. sWHeightUnits[i].Init(GlobalData.swDatas[i].LGTD, GlobalData.swDatas[i].LTTD, GlobalData.swDatas[i].STNM, max.ToString());
  325. }
  326. }
  327. miniMap.gameObject.SetActive(true);
  328. main.gameObject.SetActive(false);
  329. }
  330. public void OnShuiWeiDropDownSelect(int value)
  331. {
  332. if (currentDataType == shuiWeiYuJingDataType.BuYuan)
  333. {
  334. switch (value)
  335. {
  336. case 0:
  337. SetShuiWeiTongJiBarChart(GlobalData.buYuanShuiWei_month);
  338. break;
  339. case 1:
  340. SetShuiWeiTongJiBarChart(GlobalData.buYuanShuiWei_day);
  341. break;
  342. case 2:
  343. SetShuiWeiTongJiBarChart(GlobalData.buYuanShuiWei_hour);
  344. break;
  345. }
  346. }
  347. else
  348. {
  349. switch (value)
  350. {
  351. case 0:
  352. SetShuiWeiTongJiBarChart(ShuiWeiBianHuaData_TK_Month);
  353. break;
  354. case 1:
  355. SetShuiWeiTongJiBarChart(ShuiWeiBianHuaData_TK_Day);
  356. break;
  357. case 2:
  358. SetShuiWeiTongJiBarChart(ShuiWeiBianHuaData_TK_Hour);
  359. break;
  360. }
  361. }
  362. }
  363. public void SetShuiWeiTongJiBarChart(ShuiWeiBianHuaData ShuiWeiBianHuaData)
  364. {
  365. if (ShuiWeiBianHuaData != null)
  366. {
  367. var x_chart = shuiWeiBianHua.GetChartComponent<XAxis>();
  368. x_chart.data.Clear();
  369. for (int i = 0; i < ShuiWeiBianHuaData.name.Length; i++)
  370. {
  371. x_chart.data.Add(ShuiWeiBianHuaData.name[i]);
  372. }
  373. x_chart.refreshComponent?.Invoke();
  374. var tempSeries = shuiWeiBianHua.series;
  375. tempSeries[0].ClearData();
  376. tempSeries[1].ClearData();
  377. SerieData[] serieDatas = new SerieData[ShuiWeiBianHuaData.value.Length];
  378. for (int i = 0; i < ShuiWeiBianHuaData.value.Length; i++)
  379. {
  380. serieDatas[i] = new SerieData();
  381. serieDatas[i].data = new List<double>();
  382. serieDatas[i].data.Add(i);
  383. serieDatas[i].data.Add(ShuiWeiBianHuaData.value[i]);
  384. }
  385. tempSeries[0].data.AddRange(serieDatas);
  386. tempSeries[1].data.AddRange(serieDatas);
  387. }
  388. }
  389. public void SetZhanDianPaiMingData()
  390. {
  391. if (GlobalData.swDatas.Count < 1)
  392. return;
  393. if (currentDataType == shuiWeiYuJingDataType.BuYuan)
  394. {
  395. List<StationData> stationDatas = new List<StationData>(GlobalData.swDatas);
  396. stationDatas.Sort();
  397. for (int i = 0; i < zdpmObjs.Length; i++) {
  398. zdpmObjs[i].transform.GetChild(1).GetComponent<Text>().text = stationDatas[i].STNM;
  399. float max = MathF.Max(stationDatas[i].upz, stationDatas[i].dwz);
  400. zdpmObjs[i].transform.GetChild(1).GetChild(0).GetComponent<Text>().text = $"{max} <size=14><color=#A5BBE2>mm</color></size>";
  401. }
  402. }
  403. else
  404. {
  405. //_paiMing_1_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  406. //_paiMing_1_Name_Text.text = $"套口水闸";
  407. //_paiMing_6_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  408. //_paiMing_6_Name_Text.text = $"套口水闸";
  409. //_paiMing_12_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  410. //_paiMing_12_Name_Text.text = $"套口水闸";
  411. //_paiMing_24_Text.text = $"未知 <size=14><color=#A5BBE2>mm</color></size>";
  412. //_paiMing_24_Name_Text.text = $"套口水闸";
  413. }
  414. }
  415. public void ChangeDataType(shuiWeiYuJingDataType _type)
  416. {
  417. if (currentDataType != _type)
  418. {
  419. currentDataType = _type;
  420. OnShuiWeiDropDownSelect(shuiWeiBarChartDropdown.value);
  421. SetZhanDianPaiMingData();
  422. RefreshThreeLevel();
  423. }
  424. }
  425. }