public class Calling
{
public enum CallingAction
{
LoadImage,
Points,
Paths
}
[JsonConverter(typeof(StringEnumConverter))]
public CallingAction Action { get; set; } = CallingAction.LoadImage;
public string JsonData { get; set; }
}
Calling calling = new Calling()
{
Action = CallingAction.Paths,
JsonData = @"
[
{
""tag"": ""茶塘测试"",
""GisPosLists"": [
{
""Longitude"": ""320"",
""Latitude"": ""35""
},
{
""Longitude"": ""279"",
""Latitude"": ""178""
},
{
""Longitude"": ""383"",
""Latitude"": ""218""
},
{
""Longitude"": ""426.3"",
""Latitude"": ""39.6""
}
]
}
]"
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(calling,Formatting.Indented);
JSCallPostUnity(json);
public void Parse(Calling calling)
{
switch (calling.Action)
{
case CallingAction.LoadImage:
var url = calling.JsonData;
// LoadImg(url);
break;
case CallingAction.Points:
points = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PointInfo>>(calling.JsonData);
ShowPoionts(points);
break;
case CallingAction.Paths:
// paths = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PathInfo>>(calling.JsonData);
pathsManager.InitMessage(calling.JsonData);
break;
default:
break;
throw new ArgumentOutOfRangeException();
}
}
public Transform point;
public void ShowPoionts(List<PointInfo> lists)
{
Debug.Log($"ShowPoint:{lists.Count}");
foreach (var itemInfo in lists)
{
var mObj = Instantiate(point);
mObj.gameObject.SetActive(true);
mObj.transform.localScale = Vector3.one;
mObj.transform.position = GeoCoordinateConverter.Instance.GisPosVector3(itemInfo.Latitude, itemInfo.Longitude);
Debug.Log($"--{mObj.transform.position}");
RawImage raw = mObj.transform.Find("Icon").GetComponent<RawImage>();
StartCoroutine(DownLoadImage(itemInfo.Url, raw));
}
}
}
##换算方法
/// <summary>
/// gis 装换成Unity 坐标的方法
/// </summary>
/// <param name="lat"></param>
/// <param name="lon"></param>
/// <returns></returns>
public Vector3 GisPosVector3(float lat,float lon)
{
Vector3 mPos = Vector3.zero;
var lat1 = originLatitude;
var lon1 = originLongitude;
// (float lat2, float lon2) = (lat, lon);
var xcd = CalculateDistanceAndComponents(lat1, lon1, lat1, lon);
var zcd = CalculateDistanceAndComponents(lat1, lon1, lat, lon1);
mPos.x = (float)xcd * ((lat1 - lat) > 0 ? 1 : -1);
mPos.z = (float)zcd * ((lon1 - lon) > 0 ? 1 : -1);
return mPos;
}
// 将角度转换为弧度
private static double ToRadians(double angleInDegrees)
{
return angleInDegrees * (Math.PI / 180.0);
}
// 计算两个坐标之间的距离
public static float CalculateDistanceAndComponents(
double lat1, double lon1, double lat2, double lon2)
{
const double EarthRadius = 6371e3; // 地球半径,单位:米
double lat1Rad = ToRadians(lat1);
double lat2Rad = ToRadians(lat2);
double deltaLatRad = ToRadians(lat2 - lat1);
double deltaLonRad = ToRadians(lon2 - lon1);
// 使用 Haversine 公式计算距离
double a = Math.Sin(deltaLatRad / 2) * Math.Sin(deltaLatRad / 2) +
Math.Cos(lat1Rad) * Math.Cos(lat2Rad) *
Math.Sin(deltaLonRad / 2) * Math.Sin(deltaLonRad / 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
var distance = EarthRadius * c;
// Debug.Log(distance);
return (float)distance;
}