package com.util;
/*** 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换** @author Daniel* @since 2016/7/27 0027*/
public class CoordTransform {private static final double x_PI = 3.14159265358979324 * 3000.0 / 180.0;private static final double PI = 3.1415926535897932384626;private static final double a = 6378245.0;private static final double ee = 0.00669342162296594323;/*** 百度坐标(BD09)转 GCJ02** @param lng 百度经度* @param lat 百度纬度* @return GCJ02 坐标:[经度,纬度]*/public static double[] transformBD09ToGCJ02(double lng, double lat) {double x = lng - 0.0065;double y = 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);double gcj_lng = z * Math.cos(theta);double gcj_lat = z * Math.sin(theta);return new double[]{gcj_lng, gcj_lat};}/*** GCJ02 转百度坐标** @param lng GCJ02 经度* @param lat GCJ02 纬度* @return 百度坐标:[经度,纬度]*/public static double[] transformGCJ02ToBD09(double lng, double lat) {double z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);double theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);double bd_lng = z * Math.cos(theta) + 0.0065;double bd_lat = z * Math.sin(theta) + 0.006;return new double[]{bd_lng, bd_lat};}/*** GCJ02 转 WGS84** @param lng 经度* @param lat 纬度* @return WGS84坐标:[经度,纬度]*/public static double[] transformGCJ02ToWGS84(double lng, double lat) {if (outOfChina(lng, lat)) {return new double[]{lng, lat};} else {double dLat = transformLat(lng - 105.0, lat - 35.0);double dLng = transformLng(lng - 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);dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI);double mgLat = lat + dLat;double mgLng = lng + dLng;return new double[]{lng * 2 - mgLng, lat * 2 - mgLat};}}/*** WGS84 坐标 转 GCJ02** @param lng 经度* @param lat 纬度* @return GCJ02 坐标:[经度,纬度]*/public static double[] transformWGS84ToGCJ02(double lng, double lat) {if (outOfChina(lng, lat)) {return new double[]{lng, lat};} else {double dLat = transformLat(lng - 105.0, lat - 35.0);double dLng = transformLng(lng - 105.0, lat - 35.0);double redLat = lat / 180.0 * PI;double magic = Math.sin(redLat);magic = 1 - ee * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);dLng = (dLng * 180.0) / (a / sqrtMagic * Math.cos(redLat) * PI);double mgLat = lat + dLat;double mgLng = lng + dLng;return new double[]{mgLng, mgLat};}}/*** 百度坐标BD09 转 WGS84** @param lng 经度* @param lat 纬度* @return WGS84 坐标:[经度,纬度]*/public static double[] transformBD09ToWGS84(double lng, double lat) {double[] lngLat = transformBD09ToGCJ02(lng, lat);return transformGCJ02ToWGS84(lngLat[0], lngLat[1]);}/*** WGS84 转 百度坐标BD09** @param lng 经度* @param lat 纬度* @return BD09 坐标:[经度,纬度]*/public static double[] transformWGS84ToBD09(double lng, double lat) {double[] lngLat = transformWGS84ToGCJ02(lng, lat);return transformGCJ02ToBD09(lngLat[0], lngLat[1]);}/*** 经纬度转墨卡托* @param lng 经度* @param lat 纬度* @return wgs墨卡托[经度,纬度]*/public static double [] transformLonLatToMecator(double lng,double lat){double earthRad = 6378137.0;double x = lng * Math.PI / 180 * earthRad;double a = lat * Math.PI / 180;double y = earthRad / 2 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));return new double []{x, y}; //[12727039.383734727, 3579066.6894065146]}/*** 墨卡托转经纬度* @param x* @param y* @return 经纬度[经度,纬度]*/public static double [] transformMercatorToLngLat(double x,double y){double lng = x / 20037508.34 * 180;double lat = y / 20037508.34 * 180;lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);return new double []{lng,lat}; //[12727039.383734727, 3579066.6894065146]}private static double transformLat(double lng, double lat) {double ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;return ret;};private static double transformLng(double lng, double lat) {double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;return ret;};/*** 判断坐标是否不在国内** @param lng 经度* @param lat 纬度* @return 坐标是否在国内*/public static boolean outOfChina(double lng, double lat) {return (lng < 72.004 || lng > 137.8347) || (lat < 0.8293 || lat > 55.8271);}
}

各类经纬度转换工具类相关推荐

  1. android 字体像素转换工具类_Android中px与dip,sp与dip等的转换工具类

    Android中px与dip,sp与dip等的转换工具类 功能 通常在代码中设置组件或文字大小只能用px,通过这个工具类我们可以把dip(dp)或sp为单位的值转换为以px为单位的值而保证大小不变.方 ...

  2. java gson 工具类_GSON 实体 转换工具类

    /** * Gson转换工具类 */ public class GsonUtils { /** * @param jsonString *            json字符串 * @param cl ...

  3. android 日期时间类,Android 日期时间等转换工具类

    package com.easyder.util; import java.text.SimpleDateFormat; import java.util.Date; /** * 日期时间等转换工具类 ...

  4. android 字体像素转换工具类_android px,dp,sp大小转换工具

    package com.voole.playerlib.util; import android.content.Context; /** * Android大小单位转换工具类 * * float s ...

  5. java 视频转码工具类_JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇)...

    JavaCV入门指南:FrameConverter转换工具类及CanvasFrame图像预览工具类(javaCV教程完结篇) 前言 再此章之前,我们已经详细介绍和剖析了javacv的结构和ffmpeg ...

  6. java字体颜色编程_Java 字体颜色转换工具类 ColorUtil

    Java 字体颜色转换工具类 ColorUtil,Java 字体颜色转换工具类 ColorUtil-- import java.awt.Color; import jxl.format.Colour; ...

  7. Java 字体颜色转换工具类 ColorUtil

    import java.awt.Color;  import jxl.format.Colour;       /**  *字体颜色转换工具类  * @author tanghui  *  */ pu ...

  8. 自定义java对象转换工具类

    背景 项目中经常有VO.PO.DTO等之间转换,由于apache工具类中BeanUtils.copyProperties及Json序列化反序列化方式转换性能比较低(阿里巴巴规范检查有提示不建议采用). ...

  9. ImageTools-图片格式转换工具类

    /*** 图片转换工具类*/ public final class ImageTools {/*** Transfer drawable to bitmap 把drawable转换为bitmap** ...

  10. Java金额转换工具类

    package com.healthy.prms.common.util;import java.math.BigDecimal;/*** @ClassName: RMBUtils* @Descrip ...

最新文章

  1. kernel 3.10内核源码分析--中断--中断和异常返回流程
  2. windows无法新建计算机对象,win10系统ie浏览器提示“Automation 服务器不能创建对象”的办法...
  3. php 不解析,php不解析html代码
  4. HDU 2066 一个人的旅行(地杰斯特拉)
  5. 训练中Loss为Nan的原因,梯度消失或者爆炸的优化
  6. Android 科大讯飞语音识别(详细步骤+源码)
  7. SVN汉化包安装后无效果(已解决)
  8. 软件比较 - Sniffer、Omnipeek、科来网络分析系统过滤器比较之位过滤 在捕获数据包时,有时候需要对一个字节中的某一个位进行精确匹配,这时,我们就需要用到位过滤。位过滤相对于地址、端口、协
  9. 经纬度 android,android....中国各城市的经纬度,
  10. 网站性能优化的10种方法
  11. FPGA设计中提高工作频率及降低功耗题目合集
  12. php aria2离线下载器,下载神器——Aria2,打造你自己的离线下载服务器
  13. ATM(异步传输模式)
  14. 找不到sct文件解决方法:Could not open scatter descript
  15. CoAP协议学习笔记——CoAP格式详解
  16. C语言给小学生出题(随机1~99进行四则运算)
  17. warning: LF will be replaced by CRLF in The file will hav
  18. 《一文搞懂NMS发展历程》Soft-NMS、Weighted NMS、IoU-Net、Softer-NMS、Adaptive NMS、DIoU-NMS
  19. OpenSSL v0.9.8a随机数发生器分析之二——随机数发生器函数说明
  20. asterisk1.8中设置presence或blf

热门文章

  1. Delphi 导出Excel功能
  2. 深圳计算机软考培训哪家好,深圳计算机软考——信息系统项目管理报名培训
  3. 2018 ACM-ICPC 西安邀请赛记录
  4. 装机大师无法发现linux硬盘,进入pe系统找不到硬盘的解决办法
  5. 统计学中p值计算公式_统计学中的P值应该怎么计算
  6. 我的爬虫(一)之抓取优美图库图片
  7. tt服务器显示start dcs,TT服务器使用手册
  8. Python(pybrain模块)搭建神经网络BPNN
  9. jsp与jspx文件
  10. 【数字信号处理】划重点