火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法

package com.hjb.util;

import java.util.HashMap;
import java.util.Map;

public class BaiduMapstoAutoNaviMapUtils {
    static double pi = 3.14159265358979324;
    static double a = 6378245.0;
    static double ee = 0.00669342162296594323;
    static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

    // World Geodetic System ==> Mars Geodetic System
    public static Map<String, String> transform(double wgLat, double wgLon) {
        Map<String, String> resultMap = new HashMap<String, String>();
        double mgLat = 0;
        double mgLon = 0;
        if (outOfChina(wgLat, wgLon)) {
            mgLat = wgLat;
            mgLon = wgLon;
            resultMap.put("mgLat", String.valueOf(mgLat));
            resultMap.put("mgLon", String.valueOf(mgLon));
            return resultMap;
        }
        double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);
        double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);
        double radLat = wgLat / 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);
        mgLat = wgLat + dLat;
        mgLon = wgLon + dLon;
        resultMap.put("mgLat", String.valueOf(mgLat));
        resultMap.put("mgLon", String.valueOf(mgLon));
        return resultMap;
    }

    static boolean 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;
    }

    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;
    }

    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;
    }

    /**
     * GCJ-02(火星坐标) 和 BD-09 (百度坐标)
     * bd_encrypt 将 GCJ-02 坐标转换成 BD-09 坐标, bd_decrypt 反之。
     * @param bd_lat
     * @param bd_lon
     * @param gg_lat
     * @param gg_lon
     */
    public static Map<String, String>  bd_encrypt(double gg_lat, double gg_lon)    {
        Map<String, String> resultMap = new HashMap<String,String>();
        double bd_lat = 0;
        double bd_lon = 0;
        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);

        bd_lon = z * Math.cos(theta) + 0.0065;

        bd_lat = z * Math.sin(theta) + 0.006;

        resultMap.put("mgLat", String.valueOf(bd_lat));
        resultMap.put("mgLon", String.valueOf(bd_lon));
        return resultMap;
    }

    /**
     * GCJ-02(火星坐标) 和 BD-09 (百度坐标)
     * bd_encrypt 将 GCJ-02 坐标转换成 BD-09 坐标, bd_decrypt 反之。
     * @param bd_lat
     * @param bd_lon
     * @param gg_lat
     * @param gg_lon
     */
    public static Map<String, String>  bd_decrypt(double bd_lat, double bd_lon){
        Map<String, String> resultMap = new HashMap<String,String>();
         double gg_lat = 0;
         double gg_lon = 0;
        double x = bd_lon - 0.0065, y = bd_lat - 0.006;

        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);

        gg_lon = z * Math.cos(theta);

        gg_lat = z * Math.sin(theta);
        resultMap.put("mgLat", String.valueOf(gg_lat));
        resultMap.put("mgLon", String.valueOf(gg_lon));
        return resultMap;

    }
}
时间: 2024-08-29 03:36:56

火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法的相关文章

[C#]火星坐标系 (GCJ-02)与百度坐标系 (BD-09) 转换帮助类

关键代码: using System; using YanZhiwei.DotNet2.Utilities.Models; namespace YanZhiwei.DotNet2.Utilities.Common { /// <summary> /// 火星坐标系 (GCJ-02)与百度坐标系 (BD-09) 转换帮助类 /// </summary> public class BDGCJLatLonHelper { /* *参考: *BD09坐标系:即百度坐标系,GCJ02坐标系经

高德百度坐标系转换方法

本文来自:http://blog.csdn.net/meegomeego/article/details/39927017 在开始这个题目之前,先给大家再次扫扫盲,扫的不是坐标系统的盲,而是我们国家所使用的坐标系统.大家都知道,美国GPS使用的是WGS84的坐标系统,以经纬度的形式来表示地球平面上的某一个位置,这应该是国际共识.但在我国,出于国家安全考虑,国内所有导航电子地图必须使用国家测绘局制定的加密坐标系统,即将一个真实的经纬度坐标加密成一个不正确的经纬度坐标,我们在业内将前者称之为地球坐标

iOS7上地球坐标系到火星坐标系转换算法

2013年01月31日 ? 综合 ? 共 2595字 ? 字号 小 中 大 ? 评论关闭 今天在一个项目中需要用到地球坐标系到火星坐标系的转换,找了好几种实现方法,但都无法在iOS6以上的系统中使用,最后找到了一个C#的转换算法,对照着写了一个iOS版的,在这里分享给大家. 地球坐标和火星坐标的具体含义可以见:http://blog.sina.com.cn/s/blog_7581a4c301015230.html 目前网上的方法主要有以下几种: 1.在iOS4.3之前的系统上通过私有类MKLoc

Objective-C上地球坐标系到火星坐标系转换算法

Objective-C上地球坐标系到火星坐标系转换算法 http://blog.csdn.net/zhaoxy_thu/article/details/17033347

Windows的三种坐标系:屏幕坐标系,非客户区坐标系,客户区坐标系

1. 屏幕坐标系:以屏幕的左上角为原点,如图所示GetWindowRect() 函数获得的 RECT 就是以屏幕坐标系算的. 2. 非客户区坐标系(窗口坐标系)包括标题栏的部分.GetWindowDC 返回的设备环境就是基于此坐标系,一般只在 WM_NCPAINT 消息中使用. 3. 客户区坐标系不包括标题栏,坐标的原点在标题栏下的客户区的左上角.BeginPaint 函数返回的设备环境是基于客户区坐标系的,只在 WM_PAINT 消息中使用,与 EndPaint 函数成对使用.GetDC 函数

利用百度地图API和群蚁算法,对TSP问题进行模拟与求解

前言 最近由于换了工作,期间也有反思和总结上家公司的得失,总觉得有什么事情当初可以完成或者完成得更好,其中TSP问题就是其中之一.当初在开发一个仓配系统的时候,有一个线路排程的需求,当时自己简单在纸上画了思路,发现求精确解算法复杂度是N!,所以去百度,发现了NPC问题的概念,但是一直以来都没有对这个问题好好研究过,最终只是选择了贪心算法这一求近似解的方案,正好这是我的第一篇博客,就拿这个“遗憾”开刀吧. 1.  利用百度地图API模拟TSP的各个城市点 1.1. 调用百度地图API解析经纬度 这

百度地图热力图--批量地址转换应用(基于百度api)

需求:把外卖订餐地址做个用户分布热力图 思路分析:第一步去百度地图api开放平台找例子 http://lbsyun.baidu.com/jsdemo.htm#c1_15 首先从百度API的demo例子参考静态页面,其中数据格式是 然后我们就想把数据库里的地址批量转换但是百度API没有提供批量转换的接口.但是我们找到了百度webapi单个地址转换的接口 利用这个接口,在后台读取地址和统计个数,返回一个json 用HttpWebRequest去发起get请求返回json,在把返回的json转成对象

利用百度语音识别接口将语音转换成文字教程

一.说明 如果有一个工具能识别音视中的语音并转换成文字输出,由于可以复制粘贴而不需要逐字逐句地打,那我们进行为音频配字幕工作时将会事半功倍. 其中的关键点是音文转换,音文转换其实在很多地方都可以看到比如qq,百度搜索,讯飞输入法等等,具体到技术而言前述的三个场景其背后的技术都是一样的,都是利用AI进行语音识别.而且腾讯.百度.讯飞当前都开放了自家的语音识别接口免费使用,本文就是利用的百度语音识别接口实现的转换. 其实就配字幕这种工作而言,当前应该可以实现通过写代码自动给音频文件配上字幕,复制粘贴

百度坐标系和火星坐标系互转

1.火星坐标转为百度坐标: function bd_encrypt(gg_lon, gg_lat){ var X_PI = Math.PI * 3000.0 / 180.0; var x = gg_lon, y = gg_lat; var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * X_PI); var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * X_PI); var bd_