ShanDongVirtualPowerPlant/u3d-ShanDongVirtualPowerPlant/Assets/Adam/Scripts/DataController.cs

261 lines
8.2 KiB
C#

using Adam;
using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class DataController : MonoSingleton<DataController>
{
private CityInfo[] cityInfos;
[HideInInspector]
public List<UniTask<AreaData>> loadingAreaDataTasks = new List<UniTask<AreaData>>();
[HideInInspector]
public List<UniTask<AreaStationData>> loadingScreenTopStatisticsTasks = new List<UniTask<AreaStationData>>();
/// <summary>
/// 省级视角下得区县信息
/// </summary>
private AreaStationData areaStationData = new AreaStationData();
/// <summary>
/// 弹出框信息
/// </summary>
private AreaData[] areaDatasTasksReturnValue;
/// <summary>
/// 市级视角中得区县信息
/// </summary>
private AreaStationData[] areaStationDatasTasksReturnValue;
/// <summary>
/// 区县站点信息
/// </summary>
private List<ScreenTopStatistics> screenTopStatisticss = new List<ScreenTopStatistics>();
/// <summary>
/// 企业信息
/// </summary>
public AreaCompanyInformationData companyInformationData = new AreaCompanyInformationData();
private Dictionary<string, string> urlDic = new Dictionary<string, string>();
public GameObject companyPoint;
public GameObject btns;
private void Awake()
{
var serverConfig = new System.Uri(Path.Combine(Application.streamingAssetsPath + @"/Config", "WebAddress.json"));
GetText(serverConfig.ToString(), (temp) =>
{
if (!String.IsNullOrWhiteSpace(temp))
{
urlDic = JsonConvert.DeserializeObject<Dictionary<string, string>>(temp);
}
else
{
Debug.Log("加载配置文件错误");
}
});
}
public void GetText(string url, Action<string> actionResult)
{
StartCoroutine(FileUtil.GetTextAsyn(url, actionResult));
}
private void Start()
{
#if UNITY_WEBGL && !UNITY_EDITOR
btns.SetActive(false);
#endif
Bootstrap.Instance.webAdapter.onStation.AddListener(SwitchStation);
Bootstrap.Instance.webAdapter.onStartRequest.AddListener(OnInit);
}
public void TEstStation(int index)
{
SwitchStation(index);
}
public void OnTEstBtn()
{
OnInit();
}
public async void GetAllCompanyInfo()
{
companyInformationData = await GetAreaCompanyInformationData("37");
for (int i = 0; i < companyInformationData.data.Count; i++)
{
Coordinate coords = new Coordinate();
coords.lat = companyInformationData.data[i].latitude;
coords.lon = companyInformationData.data[i].longitude;
coords.alt = 1986;
GameObject obj = Instantiate(companyPoint);
obj.transform.position = coords.AsVector3();
//Vector3 temp = WebApiExtension.GPSToVector3(companyInformationData.data[i].latitude, companyInformationData.data[i].longitude);
}
}
public double originLatitude = 37.7749;
public double originLongitude = -122.4194;
public double originAltitude = 0.0;
// 转换后的Unity位置
public Vector3 GPSToUnityWorld(double latitude, double longitude, double altitude)
{
// 地球半径(单位:米)
double radius = 6378137;
// 计算相对位置
double deltaLat = latitude - originLatitude;
double deltaLon = longitude - originLongitude;
// 经度差转换为米
double deltaX = deltaLon * Mathf.Deg2Rad * radius * Mathf.Cos((float)(originLatitude * Mathf.Deg2Rad));
// 纬度差转换为米
double deltaZ = deltaLat * Mathf.Deg2Rad * radius;
// 高度差
double deltaY = altitude - originAltitude;
// 返回转换后的Unity位置
return new Vector3((float)deltaX, (float)deltaY, (float)deltaZ);
}
private async void OnInit()
{
await UniTask.Delay(1);
GetAllCompanyInfo();
areaStationData = await GetProvincialLevelStationData("37");
cityInfos = transform.GetComponentsInChildren<CityInfo>();
for (int i = 0; i < cityInfos.Length; i++)
{
cityInfos[i].Init();
}
areaDatasTasksReturnValue = await UniTask.WhenAll(loadingAreaDataTasks);
for (int i = 0; i < cityInfos.Length; i++)
{
string distCodeTemp = cityInfos[i].distCode;
cityInfos[i].SetAreaData(GetAreaDateByDistCode(distCodeTemp));
}
areaStationDatasTasksReturnValue = await UniTask.WhenAll(loadingScreenTopStatisticsTasks);
for (int i = 0; i < areaStationDatasTasksReturnValue.Length; i++)
{
List<DataItem> tempDI = areaStationDatasTasksReturnValue[i].data;
if (tempDI != null && tempDI.Count > 0)
{
for (int j = 0; j < tempDI.Count; j++)
{
screenTopStatisticss.Add(tempDI[j].screenTopStatistics);
}
}
}
for (int i = 0; i < cityInfos.Length; i++)
{
string distCodeTemp = cityInfos[i].distCode;
if (distCodeTemp.Length == 6)
cityInfos[i].SetStationData(GetAreLevelStationDataByDistCode(distCodeTemp));
}
}
public void SwitchStation(int stationIndex)
{
for (int i = 0; i < cityInfos.Length; i++)
{
cityInfos[i].SetScreenTopStatistices(stationIndex);
}
}
/// <summary>
/// 获取所有企业信息
/// </summary>
/// <param name="_distCode"></param>
/// <param name="_disName"></param>
/// <returns></returns>
public async UniTask<AreaCompanyInformationData> GetAreaCompanyInformationData(string _distCode)
{
string url = urlDic["地图企业用户资源"];
return await AsyncWebReq.Get<AreaCompanyInformationData>(url + _distCode, Bootstrap.Instance.webAdapter.head, Bootstrap.Instance.webAdapter.token);
}
/// <summary>
/// 通过市级视角去获取区县得资源站点数据
/// </summary>
/// <param name="_distCode"></param>
/// <returns></returns>
public ScreenTopStatistics GetAreLevelStationDataByDistCode(string _distCode)
{
for (int i = 0; i < screenTopStatisticss.Count; i++)
{
if (screenTopStatisticss[i] != null && screenTopStatisticss[i].distCode == _distCode)
{
return screenTopStatisticss[i];
}
}
return null;
}
/// <summary>
/// 针对市级区域
/// </summary>
/// <param name="_distCode"></param>
/// <returns></returns>
public ScreenTopStatistics GetProvincialLevelStationDataByDistCode(string _distCode)
{
for (int i = 0; i < areaStationData.data.Count; i++)
{
if (areaStationData.data[i].distCode == _distCode)
{
return areaStationData.data[i].screenTopStatistics;
}
}
return null;
}
/// <summary>
/// 获取每个区域的聚合信息
/// </summary>
/// <param name="_distCode"></param>
/// <returns></returns>
public async UniTask<AreaData> GetAreaDataByDistCode(string _distCode)
{
await UniTask.Delay(2);
string url = urlDic["地图弹出框"];
AreaData areaData = await AsyncWebReq.Get<AreaData>($"{url}{_distCode}", Bootstrap.Instance.webAdapter.head, Bootstrap.Instance.webAdapter.token);
if (!bool.Parse(areaData.success)) return null;
return areaData;
}
public AreaData GetAreaDateByDistCode(string _distCode)
{
for (int i = 0; i < areaDatasTasksReturnValue.Length; i++)
{
if (areaDatasTasksReturnValue[i].data.distCode == _distCode)
{
return areaDatasTasksReturnValue[i];
}
}
return null;
}
/// <summary>
/// 获取地图汇总
/// </summary>
/// <param name="_distCode"></param>
/// <returns></returns>
public async UniTask<AreaStationData> GetProvincialLevelStationData(string _distCode)
{
string url = urlDic["地图信息汇总"];
AreaStationData areaStationData = await AsyncWebReq.Get<AreaStationData>(url + _distCode, Bootstrap.Instance.webAdapter.head, Bootstrap.Instance.webAdapter.token);
return areaStationData;
}
}