/*** 坐标转换工具类* WGS84坐标系:即地球坐标系,国际上通用的坐标系。Earth          (GPS坐标系)* GCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。Mars  (谷歌地图(中国)、高德地图、腾讯地图)* BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。  Bd09 (百度地图)* 搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。 (该类地图使用较少)*/
public class CoordinateConvert {/*** 元周率*/private static final double PI = Math.PI;/*** 卫星椭球坐标投影到平面地图坐标系的投影因子*/private static final double AXIS = 6378245.0;/*** 椭球的偏心率 (a^2 - b^2) / a^2*/private static final double OFFSET = 0.00669342162296594323;private static final double X_PI = PI * 3000.0 / 180.0;/*** 地球半径,单位 m*/private static final double EARTH_RADIUS = 6378137.0;/*** GCJ-02=>BD09 火星坐标系=>百度坐标系*/public static double[] gcj2BD09(double glat, double glon) {double x = glon;double y = glat;double[] latlon = new double[2];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);latlon[0] = z * Math.sin(theta) + 0.006;latlon[1] = z * Math.cos(theta) + 0.0065;return latlon;}/*** BD09=>GCJ-02 百度坐标系=>火星坐标系*/public static double[] bd092GCJ(double glat, double glon) {double x = glon - 0.0065;double y = glat - 0.006;double[] latlon = new double[2];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);latlon[0] = z * Math.sin(theta);latlon[1] = z * Math.cos(theta);return latlon;}/*** BD09=>WGS84 百度坐标系=>地球坐标系*/public static double[] bd092WGS(double glat, double glon) {double[] latlon = bd092GCJ(glat, glon);return gcj2WGSExactly(latlon[0], latlon[1]);}/*** WGS84=>BD09   地球坐标系=>百度坐标系*/public static double[] wgs2BD09(double wgLat, double wgLng) {double[] latlon = wgs2GCJ(wgLat, wgLng);return gcj2BD09(latlon[0], latlon[1]);}/*** WGS84=>GCJ02   地球坐标系=>火星坐标系*/public static double[] wgs2GCJ(double wgLat, double wgLng) {double[] latlon = new double[2];if (outOfChina(wgLat, wgLng)) {latlon[0] = wgLat;latlon[1] = wgLng;return latlon;}double[] deltaD = delta(wgLat, wgLng);latlon[0] = wgLat + deltaD[0];latlon[1] = wgLng + deltaD[1];return latlon;}/*** GCJ02=>WGS84   火星坐标系=>地球坐标系(粗略)*/public static double[] gcj2WGS(double glat, double glon) {double[] latlon = new double[2];if (outOfChina(glat, glon)) {latlon[0] = glat;latlon[1] = glon;return latlon;}double[] deltaD = delta(glat, glon);latlon[0] = glat - deltaD[0];latlon[1] = glon - deltaD[1];return latlon;}/*** GCJ02=>WGS84   火星坐标系=>地球坐标系(精确)*/public static double[] gcj2WGSExactly(double gcjLat, double gcjLng) {double initDelta = 0.01;double threshold = 0.000000001;double dLat = initDelta, dLng = initDelta;double mLat = gcjLat - dLat, mLng = gcjLng - dLng;double pLat = gcjLat + dLat, pLng = gcjLng + dLng;double wgsLat, wgsLng, i = 0;while (true) {wgsLat = (mLat + pLat) / 2;wgsLng = (mLng + pLng) / 2;double[] tmp = wgs2GCJ(wgsLat, wgsLng);dLat = tmp[0] - gcjLat;dLng = tmp[1] - gcjLng;if ((Math.abs(dLat) < threshold) && (Math.abs(dLng) < threshold)) {break;}if (dLat > 0) {pLat = wgsLat;} else {mLat = wgsLat;}if (dLng > 0) {pLng = wgsLng;} else {mLng = wgsLng;}if (++i > 10000) {break;}}double[] latlon = new double[2];latlon[0] = wgsLat;latlon[1] = wgsLng;return latlon;}/*** 根据经纬度,计算两点间的距离** @param longitude1 第一个点的经度* @param latitude1  第一个点的纬度* @param longitude2 第二个点的经度* @param latitude2  第二个点的纬度* @return 返回距离 单位米*/public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {// 纬度double lat1 = Math.toRadians(latitude1);double lat2 = Math.toRadians(latitude2);// 经度double lng1 = Math.toRadians(longitude1);double lng2 = Math.toRadians(longitude2);// 纬度之差double a = lat1 - lat2;// 经度之差double b = lng1 - lng2;// 计算两点距离的公式double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));// 弧长乘地球半径, 返回单位: 米s =  s * EARTH_RADIUS;return s;}private static double[] delta(double wgLat, double wgLng) {double[] latlng = new double[2];double dLat = transformLat(wgLng - 105.0, wgLat - 35.0);double dLng = transformLng(wgLng - 105.0, wgLat - 35.0);double radLat = wgLat / 180.0 * PI;double magic = Math.sin(radLat);magic = 1 - OFFSET * magic * magic;double sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((AXIS * (1 - OFFSET)) / (magic * sqrtMagic) * PI);dLng = (dLng * 180.0) / (AXIS / sqrtMagic * Math.cos(radLat) * PI);latlng[0] = dLat;latlng[1] = dLng;return latlng;}private 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;}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;}private static double transformLng(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;}/*** 精确计算两个除数的结果* @param d1    除数* @param d2    被除数* @param digit 精度* @return: double*/public static double calDvi(double d1, double d2, int digit) {if (d2 == 0) {return 0;}BigDecimal bi1 = BigDecimal.valueOf(d1);BigDecimal bi2 = BigDecimal.valueOf(d2);return bi1.divide(bi2, digit, RoundingMode.HALF_UP).doubleValue();}}

各地图坐标转换工具类相关推荐

  1. 【Java】 # java实现坐标转换工具类

    1. 主流坐标系简介 WGS84坐标系 地球坐标系,国际上通用的坐标系 使用GPS芯片或者北斗芯片的设备,获取的经纬度就是WGS84地理坐标系. 地图API:谷歌地图使用的是WGS84坐标系,但是中国 ...

  2. 【地图转换工具类】:GCJ02与BD09标准转换

    [地图转换工具类]:GCJ02与BD09标准转换 public class GCJ02_BD09 {public static double pi = 3.141592653589793 * 3000 ...

  3. android 定位工具类,高德地图定位工具类

    引言 定位功能初始化设置时耗时较多,如果放在Activity中操作,难免会有Activity切换较慢的问题.通过该工具类,可以实现一次初始化,多处随时调用.具有占用资源少,使用方便,便于复用,速度快, ...

  4. 【地图转换工具类】:GCJ02与WGS84标准转换

    [地图转换工具类]:GCJ02与WGS84标准转换 public class GCJ02_WGS84 {public static double pi = 3.14159265358979323846 ...

  5. java 坐标转换工具类(很全面哦!wgs84.... gcj02(即火星坐标).... )

    今天给大家分享一个java实现的地图坐标系经纬度转换工具类 /** Copyright (c). All rights reserved.* Use is subject to license ter ...

  6. 百度地图绘制工具类 DrawingManager.js 源码

    类 BMapLib.DrawingManager 鼠标绘制管理类,实现鼠标绘制管理的入口. 实例化该类后,即可调用该类提供的open 方法开启绘制模式状态. 也可加入工具栏进行选择操作.  源文件:  ...

  7. Android 百度地图定位工具类

    注意点:百度的定位编码:是bd09ll,09后面是英文字母l package mwteck.ettda.map;import android.app.Activity; import android. ...

  8. java常用地图坐标系转换工具类,支持谷歌,腾讯,百度等主流的地理坐标转换

    package com.shen.springboot.redis.util;import java.util.ArrayList; import java.util.HashMap; import ...

  9. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.2

    /*** 百度地图使用工具类-v1.5* * @author boonya* @date 2013-7-7* @address Chengdu,Sichuan,China* @email boonya ...

最新文章

  1. soapui + groovy 接口自动化测试 第八章
  2. linux c 定时器
  3. minute教会你shell
  4. Activity功能控件
  5. c++ 共享内存_关于Linux共享内存的实验 [二] - 原因
  6. bean的作用域和生命周期
  7. 无线网络:家庭 WiFi 的安全隐患及实用的防范建议
  8. 使用 Docker 在 Linux 上托管 ASP.NET Core 应用程序
  9. 【HDU - 1247】Hat’s Words(字典树,预处理,tricks)
  10. Java RMI 服务易受 SSRF 攻击
  11. tensorflow支持python3.7吗_前端开发行业真的会被AI取代吗?
  12. USB3.0 HUB方案之GL3520
  13. TensorFlow 2.10 Unable to register cuBLAS factory Attempting to register factory for plugin cuBLAS方案
  14. 菱形的常见图案_菱形图案,简约而不简单
  15. JavaWEB10:Request、Response
  16. 有个程序员的老公是种什么体验,嫁给程序员,我超级后悔!
  17. 小米红米6Pro线刷兼救砖_解账户锁_纯净刷机包_教程
  18. 山西省2021年高考试成绩查询,山西省2021年普通高等学校招生体育专业考试成绩查询入口...
  19. spotify能免费下歌吗_什么是Spotify Duo,它适合您吗?
  20. 某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候,1、5、1、3、5、2、4、1、2,出现缓存直接命中的次数是(),最后缓存中即将准备淘汰的数据项是()

热门文章

  1. 计算机基础知识考试题库-----复习资料
  2. 编写一个程序,模拟扔硬币的结果.
  3. Python创建微信聊天机器人
  4. 首届中国富豪,谁笑到了最后?
  5. m1芯片安装PS2021 已经支持M1芯片安装 M1处理器安装PS2021解决方案教程,2021最新方法!
  6. mysql 用法之 统计各地区注册人数
  7. linux kernel git clone加速
  8. 计算机二级11成绩查询时间,2020计算机二级考试成绩查询时间
  9. @Cacheable key的使用
  10. ASP.NET Zero 11.1.0