/// <summary> /// 将大地坐标转换为高斯平面坐标 /// </summary> /// <param name="gBLH">大地坐标</param> /// <returns>高斯平面坐标</returns> private GeoxyH ConvertBLHToxyH(GeoBLH gBLH) { double _h = gBLH.gH; double X = GeodeticCalculate.LengthOfMeridian(re, gBLH.gB); double N = GeodeticCalculate.UnitaryCircleRadius(re, gBLH.gB); double centerL = (gBLH.gL + 3600 * 360.0) % (3600 * 360.0); int beltNo = (int)(centerL / (6.0 * 3600)) + 1; centerL = 6.0 * 3600 * beltNo - 3.0 * 3600; double dl = gBLH.gL - centerL; double sinB = Math.Sin(gBLH.gB / Angle.Rou); double cosB = Math.Cos(gBLH.gB / Angle.Rou); double t2 = Math.Pow(Math.Tan(gBLH.gB / Angle.Rou), 2); double yita2 = re.firste2 * cosB * cosB; double x1 = N * sinB * cosB * dl * dl / (2.0 * Angle.Rou * Angle.Rou); double x2 = N * sinB * Math.Pow(cosB, 3) * (5 - t2 + 9 * yita2 + 4 * yita2 * yita2) * Math.Pow(dl, 4) / (24.0 * Math.Pow(Angle.Rou, 4)); double x3 = N * sinB * Math.Pow(cosB, 5) * (61 - 58 * t2 + t2 * t2) * Math.Pow(dl, 6) / (720.0 * Math.Pow(Angle.Rou, 6)); double y1 = N * cosB * dl / Angle.Rou; double y2 = N * Math.Pow(cosB, 3) * (1 - t2 + yita2) * Math.Pow(dl, 3) / (6.0 * Math.Pow(Angle.Rou, 3)); double y3 = N * Math.Pow(cosB, 5) * (5 - 18 * t2 + t2 * t2 + 14 * yita2 - 58 * t2 * yita2) * Math.Pow(dl, 5) / (120.0 * Math.Pow(Angle.Rou, 5)); double _x = X + x1 + x2 + x3; double _y = y1 + y2 + y3 + 500000.0 + beltNo * 1000000.0; return(new GeoxyH(_x, _y, _h)); }
/// <summary> /// 将大地坐标转换为空间直角坐标 /// </summary> /// <param name="gblh">大地坐标</param> /// <returns>空间直角坐标</returns> private GeoXYZ ConvertBLHToXYZ(GeoBLH gblh) { double n = GeodeticCalculate.UnitaryCircleRadius(re, gblh.gB); double cosB = Math.Cos(gblh.gB / Angle.Rou); double sinB = Math.Sin(gblh.gB / Angle.Rou); double cosL = Math.Cos(gblh.gL / Angle.Rou); double sinL = Math.Sin(gblh.gL / Angle.Rou); double _X = (n + gblh.gH) * cosB * cosL; double _Y = (n + gblh.gH) * cosB * sinL; double _Z = (n * (1 - re.firste2) + gblh.gH) * sinB; return(new GeoXYZ(_X, _Y, _Z)); }
public GeodeticPoint(ReferenceEllipsoid refEll, GeoCoordinateType geoType, params string[] data) { re = refEll; GeoXYZ gXYZ = new GeoXYZ(0, 0, 0); GeoBLH gBLH = new GeoBLH(0, 0, 0); GeoxyH gxyH = new GeoxyH(0, 0, 0); switch (geoType) { case GeoCoordinateType.XYZ: if (data.Length != 3) { break; } else { gXYZ = new GeoXYZ(data[0], data[1], data[2]); gBLH = ConvertXYZToBLH(gXYZ); gxyH = ConvertBLHToxyH(gBLH); } break; case GeoCoordinateType.BLH: if (data.Length == 2) { gBLH = new GeoBLH(data[0], data[1]); gXYZ = ConvertBLHToXYZ(gBLH); gxyH = ConvertBLHToxyH(gBLH); } else if (data.Length == 3) { gBLH = new GeoBLH(data[0], data[1], data[2]); gXYZ = ConvertBLHToXYZ(gBLH); gxyH = ConvertBLHToxyH(gBLH); } else { break; } break; default: if (data.Length == 2) { gxyH = new GeoxyH(data[0], data[1]); gBLH = ConvertxyHToBLH(gxyH); gXYZ = ConvertBLHToXYZ(gBLH); } else if (data.Length == 3) { gxyH = new GeoxyH(data[0], data[1], data[3]); gBLH = ConvertxyHToBLH(gxyH); gXYZ = ConvertBLHToXYZ(gBLH); } else { break; } break; } gX = gXYZ.gX; gY = gXYZ.gY; gZ = gXYZ.gZ; gB = gBLH.gB; gL = gBLH.gL; gH = gBLH.gH; gx = gxyH.gx; gy = gxyH.gy; }