123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace XdCxRhDW.Api
- {
- public class OutputHelper
- {
- public const double WGS84a = 6378137.0;
- public const double f = 1.0 / 298.257224;
- public static List<DtoLinePoint> WriteDtoLine(double[] LOP_Value, int LOP_Len)
- {
- List<DtoLinePoint> list = new List<DtoLinePoint>();
- if (LOP_Len == 0) return list;
- var len = LOP_Len * 2;
- Lla[] line = new Lla[len + 1];
- double? prevLon = null, prevLat = null;
- for (int i = 0; i < LOP_Len; i++)
- {
- var lon1 = LOP_Value[3 * i + 1];
- var lon2 = LOP_Value[3 * i + 2];
- var lat = LOP_Value[3 * i];
- var p2Idx = len - 1 - i;
- if (lon1 != -1 && lon2 != -1)
- {
- if (prevLon == null)
- {
- line[i] = new Lla(lon1, lat);
- line[p2Idx] = new Lla(lon2, lat);
- }
- else
- {
- var disLon1 = DisLon(prevLon.Value, prevLat.Value, lon1, lat);
- var disLon2 = DisLon(prevLon.Value, prevLat.Value, lon2, lat);
- if (disLon1 < disLon2)
- {
- line[i] = new Lla(lon1, lat);
- line[p2Idx] = new Lla(lon2, lat);
- }
- else
- {
- line[i] = new Lla(lon2, lat);
- line[p2Idx] = new Lla(lon1, lat);
- }
- }
- prevLon = line[i].Lon;
- prevLat = line[i].Lat;
- }
- }
- var firstPoint = line.FirstOrDefault(m => m != null);
- if (firstPoint != null)
- {
- line[line.Length - 1] = new Lla(firstPoint.Lon, firstPoint.Lat);
- }
- Array.ForEach(line, lla =>
- {
- if (lla != null)
- {
- DtoLinePoint dtoLine = new DtoLinePoint();
- dtoLine.Lon = lla.Lon;
- dtoLine.Lat = lla.Lat;
- list.Add(dtoLine);
- }
- });
- return list;
- }
- public static double DisLon(double lon1, double lat1, double lon2, double lat2)
- {
- return DistinceLla(new double[] { lon1, lat1, 0 }, new double[] { lon2, lat2, 0 });
- }
- public static double DistinceLla(double[] lla1, double[] lla2)
- {
- double[] xyz1 = LLA2XYZ(lla1[0], lla1[1], lla1[2]), xyz2 = LLA2XYZ(lla2[0], lla2[1], lla2[2]);
- return Distince(xyz1[0], xyz1[1], xyz1[2], xyz2[0], xyz2[1], xyz2[2]);
- }
- public static double Distince(double x1, double y1, double z1, double x2, double y2, double z2)
- {
- double x = (x1 - x2);
- double y = (y1 - y2);
- double z = (z1 - z2);
- double dist = Math.Sqrt(x * x + y * y + z * z);
- return dist;
- }
- public static double[] LLA2XYZ(double lon, double lat, double alt)
- {
- lat = Math.PI * lat / 180.0;
- lon = Math.PI * lon / 180.0;
- double cosLat = Math.Cos(lat);
- double sinLat = Math.Sin(lat);
- double cosLong = Math.Cos(lon);
- double sinLong = Math.Sin(lon);
- double c = 1 / Math.Sqrt(cosLat * cosLat + (1 - f) * (1 - f) * sinLat * sinLat);
- double s = (1 - f) * (1 - f) * c;
- double x = (WGS84a * c + alt) * cosLat * cosLong;
- double y = (WGS84a * c + alt) * cosLat * sinLong;
- double z = (WGS84a * s + alt) * sinLat;
- return new double[3] { x, y, z };
- }
- }
- public class Lla
- {
- public Lla(double lon, double lat)
- {
- this.Lon = lon;
- this.Lat = lat;
- }
- public double Lon { get; set; }
- public double Lat { get; set; }
- public double Alt { get; set; } = 0;
- }
- }
|