利用proj.net进行投影坐标变换(c#,北京54坐标)

using ProjNet.CoordinateSystems;
using ProjNet.Converters.WellKnownText;
using ProjNet.CoordinateSystems.Transformations;    

    /// <summary>
    /// 坐标位置结构体
    /// </summary>
    public struct stPosition
    {
        public double X;
        public double Y;


        public stPosition(double x, double y)
        {
            X = x;
            Y = y;
        }
    }

/// <summary>
        /// 将地理坐标转换为投影坐标
        /// </summary>
        /// <param name="fromCS">原坐标系</param>
        /// <param name="toCS">目标坐标系</param>
        /// <param name="pts">原始数据</param>
        /// <param name="results">结果数据</param>
        /// <returns>成功返回true</returns>
        public static bool DegreeToMeter(ICoordinateSystem fromCS, ICoordinateSystem toCS, List<double[]> pts, out List<double[]> results)
        {
            bool bRes = false;
            results = new List<double[]>();
            try
            {
                CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
                ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(toCS, fromCS);
                results = trans.MathTransform.TransformList(pts);
                bRes = true;
            }
            catch (SystemException sysEx)
            {
            }
            return bRes;
        }

/// <summary>
        /// 将投影坐标系数据转换为地理坐标系数据
        /// </summary>
        /// <param name="fromCS">原坐标系</param>
        /// <param name="toCS">目标坐标系</param>
        /// <param name="pts">原始数据</param>
        /// <param name="results">结果数据</param>
        /// <returns>成功返回true</returns>
        public static bool MeterToDegree(ICoordinateSystem fromCS, ICoordinateSystem toCS, List<double[]> pts, out List<double[]> results)
        {
            bool bRes = false;
            results = new List<double[]>();
            try
            {
                CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
                ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(fromCS, toCS);
                results = trans.MathTransform.TransformList(pts);
                bRes = true;
            }
            catch (SystemException sysEx)
            {
            }
            return bRes;
        }

/// <summary>

        /// 北京54投影坐标转换为地理坐标
        /// </summary>
        /// <param name="iCodeNum">带号</param>
        /// <param name="dCenter_Meridian">中央经线</param>
        /// <param name="sourPt">原始投影坐标数据</param>
        /// <param name="destPt">转换后地理坐标</param>  
        public static void BJ54PrjToGeo(int iCodeNum, double dCenter_Meridian, stPosition sourPt, out stPosition destPt)
        {
            destPt = new stPosition(0, 0);
            try
            {
                //高斯克吕格投影类型|横轴莫卡托投影类型


                string bj1954Lcc = string.Format("PROJCS[\"hejl\","
                    + "GEOGCS[\"GCS_Beijing_1954\","
                    + "DATUM[\"D_Beijing_1954\", SPHEROID[\"Krasovsky_1940\", 6378245.0, 298.3]],"
                      + "PRIMEM[\"Greenwich\", 0.0],"
                      + "UNIT[\"Degree\", 0.017453292519943299]],"
                    + "PROJECTION[\"Transverse Mercator\"],"
                    + "PARAMETER[\"False_Easting\", {0}500000.0],"
                    + "PARAMETER[\"False_Northing\", 0.0],"
                    + "PARAMETER[\"Central_Meridian\", {1} ],"
                    + "PARAMETER[\"Scale_Factor\", 1],"
                    + "PARAMETER[\"Latitude_Of_Origin\", 0],"
                    + "UNIT[\"Meter\", 1]];", iCodeNum, dCenter_Meridian);
                IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;
                GeographicCoordinateSystem toCS = (GeographicCoordinateSystem)fromCS.GeographicCoordinateSystem;
                List<double[]> pts = new List<double[]>();
                double[] xy = new double[] { sourPt.X, sourPt.Y };
                pts.Add(xy);
                List<double[]> results = new List<double[]>();
                //执行转换函数
                MeterToDegree(fromCS, toCS, pts, out results);
                destPt.X = results[0][0];
                destPt.Y = results[0][1];
            }
            catch (SystemException sysEx)
            {
            }

        }

  /// <summary>
        /// 北京54地理坐标转换为投影坐标,批量转换
        /// </summary>
        /// <param name="iCodeNum">带号</param>
        /// <param name="dCenter_Meridian">中央经线</param>
        /// <param name="sourPt">原始投影坐标数据</param>
        /// <param name="destPt">转换后地理坐标</param>
        public static void GeoToBJ54Prj(int iCodeNum, double dCenter_Meridian, stPosition sourPt, out stPosition destPt)
        {
            destPt = new stPosition(0, 0);
            try
            {
                //高斯克吕格投影类型|横轴莫卡托投影类型


                string bj1954Lcc = string.Format("PROJCS[\"hejl\","
                    + "GEOGCS[\"GCS_Beijing_1954\","
                    + "DATUM[\"D_Beijing_1954\", SPHEROID[\"Krasovsky_1940\", 6378245.0, 298.3]],"
                      + "PRIMEM[\"Greenwich\", 0.0],"
                      + "UNIT[\"Degree\", 0.017453292519943299]],"
                    + "PROJECTION[\"Transverse Mercator\"],"
                    + "PARAMETER[\"False_Easting\", {0}500000.0],"
                    + "PARAMETER[\"False_Northing\", 0.0],"
                    + "PARAMETER[\"Central_Meridian\", {1} ],"
                    + "PARAMETER[\"Scale_Factor\", 1],"
                    + "PARAMETER[\"Latitude_Of_Origin\", 0],"
                    + "UNIT[\"Meter\", 1]];", iCodeNum, dCenter_Meridian);
                IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;
                GeographicCoordinateSystem toCS = (GeographicCoordinateSystem)fromCS.GeographicCoordinateSystem;
                List<double[]> pts = new List<double[]>();
                double[] xy = new double[] { sourPt.X, sourPt.Y };
                pts.Add(xy);
                List<double[]> results = new List<double[]>();
                //执行转换函数
                DegreeToMeter(fromCS, toCS, pts, out results);
                destPt.X = results[0][0];
                destPt.Y = results[0][1];
            }
            catch (SystemException sysEx)
            {
            }
        }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值