首页 > 其他分享 >WGS84转百度地图坐标

WGS84转百度地图坐标

时间:2024-10-24 14:44:53浏览次数:6  
标签:WGS84 double 坐标系 坐标 lat return pi 百度 Math

什么是地图坐标系转换?

目前常用的地图坐标系有多种标准,几家主流地图(如百度地图,高德地图和QQ地图等)使用的坐标系标准也各不相同。
假如您有GPS坐标,想在百度地图上显示;或者有百度地图的坐标,但想在微信地图上显示,这时就需要使用一些算法或通过官方的API来转换坐标,在目标地图上正确显示。
主流地图坐标系说明
1、WGS84坐标系

WGS-84坐标系为一种大地坐标系(地心坐标系,GPS原始坐标体系),也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。对应工
具“输入坐标类型”里的GPS坐标。
2、GCJ02坐标系

GCJ-02坐标系:国测局坐标,又名火星坐标系。

国测局02年发布的坐标体系,它是一种对经纬度数据的加密算法,即加入随机的偏差。

是国内最广泛使用的坐标体系,高德地图、腾讯地图都使用它
3、BD09坐标系

为百度地图坐标系,在GCJ02坐标系基础上再次加密。其中bd09ll表示百度经纬度坐标,bd09mc表示百度墨卡托米制坐标。
4、CGCS2000坐标系

国家大地坐标系。该坐标系是通过中国GPS 连续运行基准站、 空间大地控制网以及天文大地网与空间地网联合平差建立的地心大地坐标系统。

 

说明下、百度的地图加密原始gps地理坐标是这样的:百度地图加密的是 火星坐标系 (GCJ-02),而GCJ-02加密的是原始gps坐标系。所以从原始gps坐标,到百度地图坐标,顺序是WGS-84 --> GCJ-02 --> BD-09

public class BdMapUtil
{
    /** 圆周率 */
    public static double pi = 3.1415926535897932384626;
    public static double a = 6378245.0;
    public static double ee = 0.00669342162296594323;
    private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

    /**
     * 得到百度地图经纬度
     *
     * @author zr
     * @date 2019-09-09
     * @param lat WGS-84 gps的纬度
     * @param lon WGS-84 gps的经度
     * @return com.construn.vehicle.message.util.Gps
     */
    public static Gps getBd09( double lat,  double lon)
    {
        //得到火星坐标经纬度
        Gps gps = gps84ToGcj02(lat, lon);
        if (gps ==  null )
        {
            return null ;
        }
        //得到百度坐标经纬度
        return gcj02ToBd09(gps.getWgLat(), gps.getWgLon());
    }
    /**
     * 火星坐标系 (GCJ-02)转百度地图坐标系
     *
     * @author zr
     * @date 2019-09-09
     * @param  * @param gg_lat
     * @param gg_lon
     * @return void
     */
    private static Gps gcj02ToBd09( double gg_lat,  double gg_lon)
    {
        double x = gg_lon, y = gg_lat;
        double z = Math.Sqrt(x * x + y * y) + 0.00002 * Math.Sin(y * x_pi);
        double theta = Math.Atan2(y, x) + 0.000003 * Math.Cos(x * x_pi);
        double bd_lon = z * Math.Cos(theta) + 0.0065;
        double bd_lat = z * Math.Sin(theta) + 0.006;
        return new Gps(bd_lat, bd_lon);
    }
    /**
      * 84 to 火星坐标系 (GCJ-02)
      *
      * @author zr
      * @date 2019-09-09
      * @param  * @param lat
      * @param lon
      * @return void
      */
    private static Gps gps84ToGcj02( double lat,  double lon)
    {
        if (outOfChina(lat, lon))
        {
            return null ;
        }
        double dLat = transformLat(lon - 105.0, lat - 35.0);
        double dLon = transformLon(lon - 105.0, lat - 35.0);
        double radLat = lat / 180.0 * pi;
        double magic = Math.Sin(radLat);
        magic = 1 - ee * magic * magic;
        double sqrtMagic = Math.Sqrt(magic);
        dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
        dLon = (dLon * 180.0) / (a / sqrtMagic * Math.Cos(radLat) * pi);
        double mgLat = lat + dLat;
        double mgLon = lon + dLon;
        return new Gps(mgLat, mgLon);
    }

    /**
     * 判断有没有超过中国区
     *
     * @author zr
     * @date 2019-09-09
     * @param  * @param lat
     * @param lon
     * @return boolean
     */
    private static bool outOfChina( double lat,  double lon)
    {
        if (lon < 72.004 || lon > 137.8347)
        {
            return true ;
        }
        if (lat < 0.8293 || lat > 55.8271)
        {
            return true ;
        }
        return false ;
    }

    /**
     * 处理纬度
     *
     * @author zr
     * @date 2019-09-09
     * @param  * @param x
     * @param y
     * @return double
     */
    private static double transformLat( double x,  double y)
    {
        double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y
                + 0.2 * Math.Sqrt(Math.Abs(x));
        ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.Sin(y * pi) + 40.0 * Math.Sin(y / 3.0 * pi)) * 2.0 / 3.0;
        ret += (160.0 * Math.Sin(y / 12.0 * pi) + 320 * Math.Sin(y * pi / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    /**
     * 处理经度
     *
     * @author zr
     * @date 2019-09-09
     * @param  * @param x
     * @param y
     * @return double
     */
    private static double transformLon( double x,  double y)
    {
        double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1
                * Math.Sqrt(Math.Abs(x));
        ret += (20.0 * Math.Sin(6.0 * x * pi) + 20.0 * Math.Sin(2.0 * x * pi)) * 2.0 / 3.0;
        ret += (20.0 * Math.Sin(x * pi) + 40.0 * Math.Sin(x / 3.0 * pi)) * 2.0 / 3.0;
        ret += (150.0 * Math.Sin(x / 12.0 * pi) + 300.0 * Math.Sin(x / 30.0
                * pi)) * 2.0 / 3.0;
        return ret;
    }

}





public class Gps
{
    private double wgLat;
    private double wgLon;

    public Gps()
    {
    }
    public Gps( double _wgLat,  double _wgLon)
    {
        wgLat = _wgLat;
        wgLon = _wgLon;
    }



    public double getWgLat()
    {
        return wgLat;
    }

    public double getWgLon() 
    {
        return wgLon;
    }





    public String toString()
    {
        return "Gps{" +
                "wgLat=" + wgLat +
                ", wgLon=" + wgLon +
                '}' ;
    }
}

 

标签:WGS84,double,坐标系,坐标,lat,return,pi,百度,Math
From: https://www.cnblogs.com/fireicesion/p/18499562

相关文章

  • Qt/C++路径轨迹回放/回放每个点信号/回放结束信号/拿到移动的坐标点经纬度
    一、前言说明在使用百度地图的路书功能中,并没有提供移动的信号以及移动结束的信号,但是很多时候都期望拿到移动的哪里了以及移动结束的信号,以便做出对应的处理,比如结束后需要触发一些对应的操作。经过搜索发现很多人都有这个需求,需要在js文件中加上一点代码才行,也就是在start开始......
  • 平面图形中建系 | 平面直角坐标系
    前情概要如果没有笛卡尔平面直角坐标系,那么涉及平面向量的问题只能用基向量的方法[形的角度]求解,不能用代数方法[数的角度]计算;同理如果没有空间直角坐标系的介入,立体几何中的问题也就只能从形的角度思考,而不能用代数方法[数的角度]来计算;所以建系的目的主要是想把有关形的问题,通......
  • PbootCMS自带百度编辑器插入视频不显示怎么办?
    PbootCMS自带的百度编辑器(UEditor)在插入视频时有时会出现不显示的问题。这可能是由于多种原因造成的,包括视频格式不支持、路径错误、配置问题等。以下是一些常见的解决方法:解决方法1.检查视频格式支持的视频格式:UEditor支持的视频格式包括:mp4, flv, webm 等。确保你......
  • manim边学边做--极坐标平面
    PolarPlane,顾名思义,是用于创建极坐标平面的类。与笛卡尔坐标系不同,极坐标系是基于角度和半径来定位点的,这里的每个点由一个角度和距离原点的距离表示。在Manim中,PolarPlane通过极径($r\()和极角(\)\theta$)来展示坐标系,这种表示方式便于处理与角度和半径相关的数学概念。无论是......
  • 2024/10/23日 日志--》关于Maven的基础学习--2 坐标与依赖范围
    对Maven的学习即将步入卫生,下面是Maven中的坐标和依赖范围的简单笔记点击查看代码--Maven坐标详解--·什么是坐标?---》Maven中的坐标是资源的唯一标识---》使用坐标来定义项目或引入项目中需要的依赖--·Maven坐标的主要组成---》groupld:定义当前Maven项目隶......
  • 百度大模型算法工程师二面:我的亲身经历分享!
    百度大模型算法工程师面试题应聘岗位:百度大模型算法工程师面试轮数:第二轮整体面试感觉:偏简单面试过程回顾1.自我介绍在自我介绍环节,我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长,展示了自信和沟通能力。2.Leetcode题具体题意记不清了,但是类似【2......
  • 【八叉树】从上千万个物体中【**瞬间**】就近选取坐标
    众里寻他千百度,蓦然回首,那人却在灯火阑珊处前情提要在某些情况下,我们在场景中创建了数百万个物体,这些物体没有直接的网格或碰撞体(例如,通过GPU绘制的物体),因此无法通过常规的射线检测与碰撞体进行交互。我们仅掌握这些物体的坐标或顶点位置。在这种情况下,我们该如何通过鼠标来......
  • Unity 切换UI坐标和世界坐标
    usingUnityEngine;//这个脚本实现了,本脚本所在的游戏物体能够被拖拽publicclassDragObjectT:MonoBehaviour{privateVector3screenPoint;//存储物体在屏幕上的位置privateVector3offset;//存储鼠标点击位置与物体实际位置的偏移量privatebool......
  • 百度地图引入个性化样式,加载时出现大片白块的解决办法
    百度地图引入个性化样式,加载时出现大片白块的解决办法问题描述大屏使用某个地区的详细地图,设置了百度地图自定义样式为深蓝色地图,但是加载的时候,瓦片会出现大片白色的情况,之后才会加载出来深蓝色地图,本文介绍一个方法,来解决加载的时候出现大片白色的问题直奔主题前端......
  • PbootCMS网站百度site网址异常的解决办法
    解决PBootCMS网站异常URL收录问题的方法1.更新系统和补丁确保安全:首先,登录PBootCMS后台,检查是否有新的系统更新或安全补丁。如果有,请及时安装,以修复可能存在的安全漏洞。操作步骤:进入PBootCMS后台管理界面。导航至“系统设置”或“系统更新”模块。检查并安装所有可用的......