热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

wgstobd09java_GPS经纬度转百度经纬度JAVA

第一种:JAVA写法(考虑double精度问题)packagecom.thinkgem.jeesite.common.utils;importcom.alibaba.

第一种:JAVA写法(考虑double精度问题)package com.thinkgem.jeesite.common.utils;

import com.alibaba.dubbo.common.json.JSONObject;

import java.math.BigDecimal;

/**

* 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具

*/

public class CoordinateTransformUtil {

static String BAIDU_GEOCONV_KEY = "XXXXXXXXXXXXXXXXXXXXXXXX";

static String baiduUrl = "http://api.map.baidu.com/geocoder/v2";

static int B_DIV_SCALE = 15;

static BigDecimal x_pi = new BigDecimal("3.14159265358979324").multiply(new BigDecimal("3000")).divide(new BigDecimal("180"), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP);

// π

static BigDecimal pi = new BigDecimal("3.1415926535897932384626");

// 长半轴

static BigDecimal a = new BigDecimal("6378245");

// 扁率

static BigDecimal ee = new BigDecimal("0.00669342162296594323");

static BigDecimal b_1 = new BigDecimal("-1");

static BigDecimal b_2 = new BigDecimal("10");

static BigDecimal b_3 = new BigDecimal("2");

static BigDecimal b_4 = new BigDecimal("105");

static BigDecimal b_5 = new BigDecimal("3");

static BigDecimal b_6 = new BigDecimal("35");

static BigDecimal b_7 = new BigDecimal("160");

static BigDecimal b_8 = new BigDecimal("1");

static BigDecimal b_9 = new BigDecimal("150");

static BigDecimal b_10 = new BigDecimal("180");

static BigDecimal b_11 = new BigDecimal("0.00002");

static BigDecimal b_12 = new BigDecimal("0.000003");

static BigDecimal b_13 = new BigDecimal("0.0065");

static BigDecimal b_14 = new BigDecimal("0.006");

/**

* WGS坐标转百度坐标系(BD-09)

*

* @param lng WGS84坐标系的经度

* @param lat WGS84坐标系的纬度

* @return 百度坐标数组

*/

public static double[] wgs84tobd09(double lng, double lat) {

double[] gcj = wgs84togcj02(lng, lat);

double[] bd09 = gcj02tobd09(gcj[0], gcj[1]);

return bd09;

}

/**

* 火星坐标系(GCJ-02)转百度坐标系(BD-09)

*

* @param lng 火星坐标经度

* @param lat 火星坐标纬度

* @return 百度坐标数组

* @see 谷歌、高德——>百度

*/

public static double[] gcj02tobd09(double lng, double lat) {

BigDecimal b_lng = new BigDecimal(lng);

BigDecimal b_lat = new BigDecimal(lat);

BigDecimal z = new BigDecimal(Math.sqrt(b_lng.multiply(b_lng).add(b_lat.multiply(b_lat)).doubleValue())).add(b_11.multiply(new BigDecimal(Math.sin(b_lat.multiply(x_pi).doubleValue()))));

BigDecimal theta = new BigDecimal(Math.atan2(b_lat.doubleValue(), b_lng.doubleValue())).add(b_12.multiply(new BigDecimal(Math.cos(b_lng.multiply(x_pi).doubleValue()))));

BigDecimal bd_lng = z.multiply(new BigDecimal(Math.cos(theta.doubleValue()))).add(b_13);

// z * Math.cos(theta) + 0.0065;

BigDecimal bd_lat = z.multiply(new BigDecimal(Math.sin(theta.doubleValue()))).add(b_14);

return new double[]{bd_lng.doubleValue(), bd_lat.doubleValue()};

}

/**

* WGS84转GCJ02(火星坐标系)

*

* @param lng WGS84坐标系的经度

* @param lat WGS84坐标系的纬度

* @return 火星坐标数组

*/

public static double[] wgs84togcj02(double lng, double lat) {

BigDecimal b_lng = new BigDecimal(lng + "");

BigDecimal b_lat = new BigDecimal(lat + "");

if (out_of_china(b_lng, b_lat)) {

return new double[]{b_lng.doubleValue(), b_lat.doubleValue()};

}

BigDecimal dlat = transformlat(b_lng.subtract(b_4), b_lat.subtract(b_6));

BigDecimal dlng = transformlng(b_lng.subtract(b_4), b_lat.subtract(b_6));

BigDecimal radlat = b_lat.divide(b_10, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi);

BigDecimal magic = new BigDecimal(Math.sin(radlat.doubleValue()));

magic = b_8.subtract(ee.multiply(magic).multiply(magic));

BigDecimal sqrtmagic = new BigDecimal(Math.sqrt(magic.doubleValue()));

dlat = (dlat.multiply(b_10)).divide((a.multiply(b_8.subtract(ee))).divide((magic.multiply(sqrtmagic)), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP);

dlng = (dlng.multiply(b_10)).divide((a.divide(sqrtmagic, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(Math.cos(radlat.doubleValue())).multiply(pi))), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP);

BigDecimal mglat = b_lat.add(dlat);

BigDecimal mglng = b_lng.add(dlng);

return new double[]{mglng.doubleValue(), mglat.doubleValue()};

}

/**

* 纬度转换

*

* @param lng

* @param lat

* @return

*/

public static BigDecimal transformlat(BigDecimal lng, BigDecimal lat) {

BigDecimal bet = b_1.multiply(b_2).multiply(b_2)

.add(b_3.multiply(lng))

.add(b_5.multiply(lat))

.add(b_3.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lat).multiply(lat))

.add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lng).multiply(lat))

.add(b_3.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(Math.sqrt(Math.abs(lng.doubleValue())))));

bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(b_5).multiply(lng).multiply(pi).doubleValue())))

.add(b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(lng).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP));

bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(lat.multiply(pi).doubleValue())))

.add(b_3.multiply(b_3).multiply(b_2).multiply(new BigDecimal(Math.sin(lat.divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP));

bet = bet.add((b_7.multiply(new BigDecimal(Math.sin(lat.divide(b_5.multiply(b_3).multiply(b_3), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue())))

.add(b_7.multiply(b_3).multiply(new BigDecimal(Math.sin(lat.multiply(pi).divide(b_5.multiply(b_2), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP));

return bet;

}

/**

* 经度转换

*

* @param lng

* @param lat

* @return

*/

public static BigDecimal transformlng(BigDecimal lng, BigDecimal lat) {

BigDecimal bet = b_2.multiply(b_2).multiply(b_5).add(lng).add(b_3.multiply(lat)).add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lng).multiply(lng))

.add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(lng).multiply(lat)).add(b_8.divide(b_2, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(Math.sqrt(Math.abs(lng.doubleValue())))));

bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(b_5).multiply(lng).multiply(pi).doubleValue())))

.add(b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(b_3.multiply(lng).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP));

bet = bet.add((b_3.multiply(b_2).multiply(new BigDecimal(Math.sin(lng.multiply(pi).doubleValue())))

.add(b_3.multiply(b_3).multiply(b_2).multiply(new BigDecimal(Math.sin(lng.divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue()))))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP));

bet = bet.add((b_9.multiply(new BigDecimal(Math.sin(lng.divide(b_3.multiply(b_3).multiply(b_5), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue())))

.add(b_9.multiply(b_3).multiply(new BigDecimal(Math.sin(lng.divide(b_5.multiply(b_2), B_DIV_SCALE, BigDecimal.ROUND_HALF_UP).multiply(pi).doubleValue())))).multiply(b_3).divide(b_5, B_DIV_SCALE, BigDecimal.ROUND_HALF_UP)));

return bet;

}

/**

* 判断是否在国内,不在国内不做偏移

*

* @param lng

* @param lat

* @return

*/

public static boolean out_of_china(BigDecimal lng, BigDecimal lat) {

if (lng.compareTo(new BigDecimal("73.66")) <0 || lng.compareTo(new BigDecimal("135.05")) > 0) {

return true;

} else if (lat.compareTo(new BigDecimal("3.86")) <0 || lat.compareTo(new BigDecimal("53.55")) > 0) {

return true;

}

return false;

}



推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
author-avatar
Leilani-lysbp_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有