示例#1
0
        /// <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));
        }
示例#2
0
        /// <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));
        }
示例#3
0
        /// <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));
        }