/// <summary> /// 转换操作。输入待转坐标,输出目标坐标。 /// </summary> /// <param name="oldCoord">待转坐标,只取其数字部分,参考系取自属性本对象的TargetCrs属性 </param> /// <returns></returns> public override ICoordinate MatchedTrans(ICoordinate oldCoord) { IEllipsoid e = (TargetCrs.Datum as GeodeticDatum).Ellipsoid; IGeodeticCoord geo = (IGeodeticCoord)oldCoord; double x, y, z; GeodeticUtils.GeodeticToXyzCoord(geo.Lon, geo.Lat, geo.Height, out x, out y, out z, e.SemiMajorAxis, e.InverseFlattening); return(CoordinateFactory.CreateXyzCoord(x, y, z, oldCoord.Weight)); }
/// <summary> /// 只有基准不同的 XYZ 坐标转换,采用布尔沙 7 参数模型。 /// 以WGS84转换参数作为中间参数,共转换 2 次 /// </summary> /// <param name="oldCoord">待转坐标,只取其数字部分,参考系取自属性本对象的TargetCrs属性 </param> /// <returns></returns> public override ICoordinate MatchedTrans(ICoordinate oldCoord) { BursaTransParams BursaTransParams = ((IGeodeticDatum)SourceCrs.Datum).TransParamsToWgs84; IXYZ temp = GeodeticUtils.BursaTransform((IXYZ)oldCoord, BursaTransParams); //double[] result = BursaTransParams.Transform(new double[] { oldCoord.X, oldCoord.Y, oldCoord.Z }); IXYZ xyz = temp; if (!TargetCrs.Datum.Equals(GeodeticDatum.WGS84)) { xyz = GeodeticUtils.BursaTransform(temp, ((IGeodeticDatum)TargetCrs.Datum).TransParamsToWgs84.GetInverse()); } return(CoordinateFactory.CreateXyzCoord(xyz.X, xyz.Y, xyz.Z)); }
/// <summary> /// 平面坐标(自然坐标或假定坐标)到大地坐标的高斯反算 /// </summary> /// <param name="xy">x为横轴</param> /// <param name="a"></param> /// <param name="YConst">横轴Y加常数</param> /// <param name="InverseFlat ">参考椭球扁率倒数</param> /// <param name="beltWidth">6、3</param> /// <param name="aveGeoHeight">投影面大地高</param> /// <param name="unit">输出角度的单位</param> /// <param name="originLon_deg">中央子午线,度</param> /// <returns></returns> public static LonLat GaussXyToLonLat(XY xy, double aveGeoHeight, int beltWidth, double originLon_deg, double YConst, double a = Ellipsoid.SemiMajorAxisOfCGCS2000, double InverseFlat = Ellipsoid.InverseFlatOfCGCS2000, AngleUnit unit = AngleUnit.Degree) { double B; double L; double x = xy.X; double y = xy.Y; var lonlat = GeodeticUtils.GaussXyToLonLat(xy, aveGeoHeight, originLon_deg, YConst, a, InverseFlat); //GeodeticX.Geodetic.xy_BL(x, y, out B, out L, beltWidth, beltNum, a, InverseFlat ); //单位转换 L = AngularConvert.Convert(lonlat.Lon, AngleUnit.Degree, unit); B = AngularConvert.Convert(lonlat.Lat, AngleUnit.Degree, unit); return(new LonLat(L, B)); }