百度墨卡托坐标转百度经纬度坐标方法实现【C#版本】

转载,原文地址:https://www.cnblogs.com/niudieyi/p/8706951.html

该方法参考了 https://blog.csdn.net/qq_16664325/article/details/67639684

这篇文章中主要是Java版本的,我把它改成了C#版本。该方法主要实现了百度地图api中pointToLngLat ()这个方法,用于将百度墨卡托投影坐标转换为百度经纬度坐标,经过测试,与官方完全一致。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
 
namespace DataProcess
{
    class CoordinatesConver
    {
        private static double[] Sp = { 1.289059486E7, 8362377.87, 5591021, 3481989.83, 1678043.12, 0 };
        private static String BAIDU_LBS_TYPE = "bd09ll";
        private static double pi = 3.1415926535897932384626;
        private static double a = 6378245.0;
        private static double ee = 0.00669342162296594323;
 
        /// <summary>
        /// Bd09mc To Bd09(精度高)
        /// </summary>
        /// <param name="lng"></param>
        /// <param name="lat"></param>
        /// <returns></returns>
        public static double[] Mercator2BD09(double lng, double lat)
        {
            double[] lnglat = new double[2];
            ArrayList c = null;
            //List<Double> d0 = new ArrayList<Double>();
            ArrayList d0 = new ArrayList();
            double[] d0str = { 1.410526172116255E-8, 8.98305509648872E-6, -1.9939833816331, 200.9824383106796, -187.2403703815547, 91.6087516669843, -23.38765649603339, 2.57121317296198, -0.03801003308653, 1.73379812E7 };
            for (int i = 0; i < d0str.Length; i++)
            {
                d0.Add(d0str[i]);
            }
 
            ArrayList d1 = new ArrayList();
            double[] d1str = { -7.435856389565537E-9, 8.983055097726239E-6, -0.78625201886289, 96.32687599759846, -1.85204757529826, -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 1.026014486E7 };
            for (int i = 0; i < d1str.Length; i++)
            {
                d1.Add(d1str[i]);
            }
 
            ArrayList d2 = new ArrayList();
            double[] d2str = { -3.030883460898826E-8, 8.98305509983578E-6, 0.30071316287616, 59.74293618442277, 7.357984074871, -25.38371002664745, 13.45380521110908, -3.29883767235584, 0.32710905363475, 6856817.37 };
            for (int i = 0; i < d2str.Length; i++)
            {
                d2.Add(d2str[i]);
            }
 
            ArrayList d3 = new ArrayList();
            double[] d3str = { -1.981981304930552E-8, 8.983055099779535E-6, 0.03278182852591, 40.31678527705744, 0.65659298677277, -4.44255534477492, 0.85341911805263, 0.12923347998204, -0.04625736007561, 4482777.06 };
            for (int i = 0; i < d3str.Length; i++)
            {
                d3.Add(d3str[i]);
            }
 
            ArrayList d4 = new ArrayList();
            double[] d4str = { 3.09191371068437E-9, 8.983055096812155E-6, 6.995724062E-5, 23.10934304144901, -2.3663490511E-4, -0.6321817810242, -0.00663494467273, 0.03430082397953, -0.00466043876332, 2555164.4 };
            for (int i = 0; i < d4str.Length; i++)
            {
                d4.Add(d4str[i]);
            }
 
            ArrayList d5 = new ArrayList();
            double[] d5str = { 2.890871144776878E-9, 8.983055095805407E-6, -3.068298E-8, 7.47137025468032, -3.53937994E-6, -0.02145144861037, -1.234426596E-5, 1.0322952773E-4, -3.23890364E-6, 826088.5 };
            for (int i = 0; i < d5str.Length; i++)
            {
                d5.Add(d5str[i]);
            }
 
            lnglat[0] = Math.Abs(lng);
            lnglat[1] = Math.Abs(lat);
 
            for (int d = 0; d < 6; d++)
            {
                if (lnglat[1] >= Sp[d])
                {
                    if (d == 0)
                    {
                        c = d0;
                    }
 
                    if (d == 1)
                    {
                        c = d1;
                    }
 
                    if (d == 2)
                    {
                        c = d2;
                    }
 
                    if (d == 3)
                    {
                        c = d3;
                    }
 
                    if (d == 4)
                    {
                        c = d4;
                    }
 
                    if (d == 5)
                    {
                        c = d5;
                    }
 
                    break;
                }
            }
            lnglat = Yr(lnglat, c);
            return lnglat;
        }
 
        private static double[] Yr(double[] lnglat, ArrayList b)
        {
            if (b != null)
            {
                double c = double.Parse(b[0].ToString()) + double.Parse(b[1].ToString()) * Math.Abs(lnglat[0]);
                double d = Math.Abs(lnglat[1]) / double.Parse(b[9].ToString());
                d = double.Parse(b[2].ToString()) + double.Parse(b[3].ToString()) * d + double.Parse(b[4].ToString()) * d * d + double.Parse(b[5].ToString()) * d * d * d + double.Parse(b[6].ToString()) * d * d * d * d + double.Parse(b[7].ToString()) * d * d * d * d * d + double.Parse(b[8].ToString()) * d * d * d * d * d * d;
                double bd;
                if (0 > lnglat[0])
                {
                    bd = -1 * c;
                }
                else
                {
                    bd = c;
                }
                lnglat[0] = bd;
 
                double bd2;
                if (0 > lnglat[1])
                {
                    bd2 = -1 * d;
                }
                else
                {
                    bd2 = d;
                }
                lnglat[1] = bd2;
                return lnglat;
            }
            return null;
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 投影是一种等角圆柱投影。在这种投影下,地球被看作是一个圆柱体,经线与纬线被投影成水平和垂直的直线,并且保持角度相等。这种投影方法被广泛应用于航海、航空和地图制作中。 WGS84是一种地理坐标系统,用于确定一个点在地球上的位置。这种坐标系统使用经度和纬度来描述点的位置。经度是用于测量一个点在地球上东西方向的角度,而纬度用于测量一个点在地球上南北方向的角度。 将Mercator坐标和WGS84互相换可以使用特定的数学公式和算法。实际上,这种换已经成为GIS(地理信息系统)中的一个重要组成部分之一。 下面是一些基本步骤,可用于将Mercator坐标换为WGS84坐标: 1. 计算Mercator坐标点到地球表面的距离。 2. 确定新的经度和纬度,将距离除以地球半径,并在现有的经度和纬度上加上这些值。 3. 将新的经度和纬度从弧度为度。 将WGS84坐标换为Mercator坐标方法有所不同。下面列出了一些基本步骤: 1. 将经度和纬度从度换为弧度。 2. 计算Mercator投影的纬线。 3. 将结果乘以地球半径。 4. 计算具有位移和比例因子的新x坐标和y坐标。 通过了解这些基本步骤,可以换Mercator坐标和WGS84坐标,以便更好地在GIS系统中使用。 ### 回答2: Mercator坐标和WGS84经纬度是两种常用的地理坐标系,它们在地图制图和空间信息处理中都有广泛的应用。在实际工作中,经常需要在这两种坐标系之间进行换,因此熟悉两种坐标系之间的方法是十分必要的。 Mercator坐标是一种平面直角坐标系,常用于地图的制作和测量。它的坐标轴分别与赤道和子午线平行。由于地球是近似于一个椭球体,Mercator坐标系采用投影方式将地球表面展开为一个矩形,从而实现坐标系与经纬度的互换。 与之不同,WGS84经纬度是一种球面坐标系,采用经度和纬度来描述地球表面的位置。经度是以子午线为基准线的角度度量,而纬度则是以赤道为基准的角度度量。通过与参考椭球体的配合,可以实现WGS84经纬度与三维空间坐标换,并进行空间分析和处理。 为了实现两种坐标系之间的相互换,可以采用一些现有的软件或者应用程序,比如常见的地图软件、GIS软件和开源库等。以Python的pyproj库为例,可以通过以下方法将Mercator坐标换为WGS84经纬度: ```python import pyproj #定义投影坐标系 p = pyproj.Proj(proj='merc', lon_0=0, lat_ts=0, ellps='WGS84', units='m') #坐标 x, y = p(lon, lat) ``` 其中,lon和lat是Mercator坐标系下的经度和纬度值,x和y则是相应的平面坐标值。同样的,也可以采用相似的方法将WGS84经纬度换为坐标: ```python import pyproj #定义投影坐标系 p = pyproj.Proj(proj='merc', lon_0=0, lat_ts=0, ellps='WGS84', units='m') #坐标 lon, lat = p(x, y, inverse=True) ``` 需要注意的是,在进行坐标换时,需要确认坐标系的参数设置,并根据实际情况进行调整和修正。同时,不同的应用场景中,也会有一些特定的方法和注意事项,需要根据具体情况进行选择和判断。 ### 回答3: Mercator坐标和WGS84经纬度是两种地理坐标系,分别用于不同的地图投影方式。要实现它们之间的换,需要进行以下步骤: 1. 确定Mercator投影的参考椭球体 Mercator投影不适用于整个地球,只适用于某个狭长的区域。因此,在进行换之前,需要确定Mercator投影的参考椭球体。通常使用的是WGS84椭球体,即地球的几何模型,定义了地球的形状和大小。 2. 将WGS84经纬度换为坐标 将WGS84经纬度换为坐标需要进行如下计算: X = R(lon - L0) Y = R * ln[tan(π/4 + φ/2)] 其中,R是参考椭球体的半长轴,L0是中央经线,lon是待换的经度,φ是待换的纬度。这样可以得到对应的X、Y坐标。 3. 将坐标换为WGS84经纬度坐标换为WGS84经纬度需要进行如下计算: lon = X/R + L0 lat = 2 * atan(exp(Y/R)) - π/2 其中,R是参考椭球体的半长轴,L0是中央经线,X、Y是待换的X、Y坐标。这样就可以得到对应的经纬度。 需要注意的是,坐标的X、Y值通常比较大,而且用于不同区域的中央经线也不同,因此在换时需要进行一些调整和限制,以保证计算的正确性和实用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值