62,046
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 经纬度转换为xy坐标
/// </summary>
/// <param name="latitude">纬度</param>
/// <param name="longitude">经度</param>
/// <returns>xy数组</returns>
public static double[] GetGPSToXY(double latitude, double longitude)
{
double[] xy = {0,0 };
//-------------------输入要转换的(度.分)---------------------//
//经度(度.分)
double L = longitude;
//纬度(度.分)
double B = latitude;
//-----------------------------------------------------------//
//椭球参数
double a = 6378245.0;
double f = 1 / 298.3;
//第一偏心率
double ee = Math.Sqrt(0.00669342162297);
double E0 = 0.00673852541468;
double P0 = 0.017453292519943;
//中央子午线
double L0 = 117.07;
//转换为度
//L: ddd.ddddd
L = L / 100;
//B: dd.ddddd
B = B / 100;
//转换为弧度
double b = B * P0;
double l = (L - 117.07) * P0;
double A = 1 + 3 * (Math.Pow(ee, 2)) / 4 + 45 * (Math.Pow(ee, 4)) / 64 + 175 * (Math.Pow(ee, 6)) / 256 + 11025 * (Math.Pow(ee, 8)) / 16384 + 43659 * (Math.Pow(ee, 10)) / 65536;
double BB = 3 * (Math.Pow(ee, 2)) / 4 + 15 * (Math.Pow(ee, 4)) / 16 + 525 * (Math.Pow(ee, 6)) / 512 + 2206 * (Math.Pow(ee, 8)) / 2048 + 72765 * (Math.Pow(ee, 10)) / 65536;
double C = 15 * (Math.Pow(ee, 4)) / 64 + 105 * (Math.Pow(ee, 6)) / 256 + 2205 * (Math.Pow(ee, 8)) / 4096 + 10395 * (Math.Pow(ee, 10)) / 16384;
double D = 35 * (Math.Pow(ee, 6)) / 512 + 315 * (Math.Pow(ee, 8)) / 2048 + 31185 * (Math.Pow(ee, 10)) / 131072;
double E = 315 * (Math.Pow(ee, 8)) / 16384 + 3465 * (Math.Pow(ee, 10)) / 65536;
double F = 693 * (Math.Pow(ee, 10)) / 131072;
//大地坐标为(B,L)的点到赤道的子午线弧长
double X0 = a * (1 - (Math.Pow(ee, 2))) * (A * b - BB * (Math.Sin(4 * b)) / 4 - D * (Math.Sin(6 * b)) / 6 + E * (Math.Sin(8 * b)) / 8 - F * (Math.Sin(10 * b)) / 10);
//高斯投影正算参数
double g = (Math.Sqrt(E0)) * Math.Cos(b);
double t = Math.Tan(b);
double m0 = l * Math.Cos(b);
double N = a / (Math.Sqrt(1 - (Math.Pow(ee, 2)) * (Math.Pow((Math.Sin(b)), 2))));
double X = X0 + N * t * m0 / 2 + N * t * (5 - (Math.Pow(t, 2)) + 9 * (Math.Pow(g, 2)) + 4 * (Math.Pow(g, 4))) * (Math.Pow(m0, 4)) / 24 + N * t * (61 - 58 * (Math.Pow(t, 2)) + (Math.Pow(t, 4)) + 270 * (Math.Pow(g, 2)) - 330 * (Math.Pow(g, 2)) * (Math.Pow(t, 2))) * (Math.Pow(m0, 6)) / 720;
double Y = 500000 + N * m0 + N * (1 - (Math.Pow(t, 2)) + (Math.Pow(g, 2))) * (Math.Pow(m0, 3)) / 6 + N * (5 - 18 * (Math.Pow(t, 2)) + (Math.Pow(t, 4)) + 14 * (Math.Pow(g, 2)) - 58 * (Math.Pow(g, 2)) * (Math.Pow(t, 2))) * (Math.Pow(m0, 5)) / 120;
xy[0] = X;
xy[1] = Y;
return xy;
}
public static Tupe<double, double> GetGPSToXY(double latitude, double longitude)
{
Tupe<double, double> r = new Tupe<double, double>();
r.Item1 = (latitude - 30) * 110; //设 x 原点在 30 度。
r.Item2 = (longitude - 104) * 96; //设 y 原点在 104 度。
return r;
}
public static Tupe<double, double> GetGPSToXY(double latitude, double longitude)
{
Tupe<double, double> r = new Tupe<double, double>();
r.Item1 = (latitude - 40) * 110; //设 x 原点在 40 度。
r.Item2 = (longitude - 116) * 85; //设 y 原点在 116 度。
return r;
}