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

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

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

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

///
        /// 将地理坐标转换为投影坐标
        ///
        /// 原坐标系
        /// 目标坐标系
        /// 原始数据
        /// 结果数据
        /// 成功返回true
        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;
        }

///
        /// 将投影坐标系数据转换为地理坐标系数据
        ///
        /// 原坐标系
        /// 目标坐标系
        /// 原始数据
        /// 结果数据
        /// 成功返回true
        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;
        }

///

/// 北京54投影坐标转换为地理坐标
        ///
        /// 带号
        /// 中央经线
        /// 原始投影坐标数据
        /// 转换后地理坐标  
        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)
            {
            }
        }

///
        /// 北京54地理坐标转换为投影坐标,批量转换
        ///
        /// 带号
        /// 中央经线
        /// 原始投影坐标数据
        /// 转换后地理坐标
        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)
            {
            }
        }

作者:金龙-Super
来源:CSDN
原文:https://blog.csdn.net/gishjl/article/details/7637789?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值