1. 主流坐标系简介

  • WGS84坐标系

    地球坐标系,国际上通用的坐标系

    使用GPS芯片或者北斗芯片的设备,获取的经纬度就是WGS84地理坐标系。

    地图API:谷歌地图使用的是WGS84坐标系,但是中国范围使用的是GCJ02坐标系

  • GCJ02坐标系

    火星坐标系,WGS84坐标系经过加密后的坐标系

    出于国家安全考虑,国内的所有导航电子地图必须使用国家测绘局制定的加密坐标系,即将一个真实的经纬度通过加密变成一个对应位置不正确的经纬度

    地图API:高德MapABC地图、腾讯搜搜地图、阿里云地图

  • BD09坐标系

    百度坐标系,GCJ02加密后的坐标系

    地图API:百度地图

2. 坐标转换工具类

2.1 坐标实体类

public class Point {private double lng;private double lat;public Point() {}public Point(double lng, double lat) {this.lng = lng;this.lat = lat;}public double getLng() {return lng;}public void setLng(double lng) {this.lng = lng;}public double getLat() {return lat;}public void setLat(double lat) {this.lat = lat;}@Overridepublic String toString() {return "Point{" +"lng=" + lng +", lat=" + lat +'}';}
}

2.2 工具类

public class CoordinateTransform {/*** 圆周率*/private static final double PI = 3.1415926535897932384626D;/*** 火星坐标系与百度坐标系转换的中间量*/private static final double X_PI = 3.14159265358979324 * 3000.0 / 180.0D;/*** 地球长半轴*/private static final double SEMI_MAJOR = 6378245.0D;/*** 扁率* 计算方式: 长半轴 a,  1/f = 298.3* b = a * (1 - f)* 扁率 ae = (a^2 - b^2) / a^2*/private static final double FLATTENING = 0.00669342162296594323D;/*** 中国的经纬度位置*/private static final double LNG_E1 = 72.004;private static final double LNG_E2 = 137.8347;private static final double LAT_N1 = 0.8293;private static final double LAT_N2 = 55.8271;/*** WGS84 => GCJ02 地球坐标系 => 火星坐标系* @param lng* @param lat* @return*/public static Point wgs84ToGcj02(double lng, double lat) {if (isInChina(lng, lat)) {return new Point(lng, lat);}double[] offset = offset(lng, lat);double mglng = lng + offset[0];double mglat = lat + offset[1];return new Point(mglng, mglat);}/*** GCJ02 => WGS84 火星坐标系 => 地球坐标系(有误差)* @param lng* @param lat* @return*/public static Point gcj02ToWgs84(double lng, double lat) {if (isInChina(lng, lat)) {return new Point(lng, lat);}double[] offset = offset(lng, lat);double mglng = lng - offset[0];double mglat = lat - offset[1];return new Point(mglng, mglat);}/*** GCJ02 => WGS84 火星坐标系 => 地球坐标系(精确)* @param lng* @param lat* @return*/public static Point gcj02ToWgs84Exactly(double lng, double lat) {if (isInChina(lng, lat)) {return new Point(lng, lat);}double initDelta = 0.01;double threshold = 0.000000001;double dLat = initDelta, dLon = initDelta;double mLat = lat - dLat, mLon = lng - dLon;double pLat = lat + dLat, pLon = lng + dLon;double wgsLat, wgsLng, i = 0;while (true) {wgsLat = (mLat + pLat) / 2;wgsLng = (mLon + pLon) / 2;Point point = wgs84ToGcj02(wgsLng, wgsLat);dLon = point.getLng() - lng;dLat = point.getLat() - lat;if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold)) {break;}if (dLat > 0) {pLat = wgsLat;} else{mLat = wgsLat;}if (dLon > 0) {pLon = wgsLng;} else {mLon = wgsLng;}if (++i > 10000) {break;}}return new Point(wgsLng, wgsLat);}/*** GCJ02 => BD09 火星坐标系 => 百度坐标系* @param lng* @param lat* @return*/public static Point gcj02ToBd09(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 Point(bd_lng, bd_lat);}/*** BD09 => GCJ02 百度坐标系 => 火星坐标系* @param lng* @param lat* @return*/public static Point bd09ToGcj02(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 Point(gcj_lng, gcj_lat);}/*** WGS84 => BD09 地球坐标系 => 百度坐标系* @param lng* @param lat* @return*/public static Point wgs84ToBd09(double lng, double lat) {Point point = wgs84ToGcj02(lng, lat);return gcj02ToBd09(point.getLng(), point.getLat());}/*** BD09 => WGS84 百度坐标系 => 地球坐标系* @param lng* @param lat* @return*/public static Point bd09ToWgs84(double lng, double lat) {Point point = bd09ToGcj02(lng, lat);return gcj02ToWgs84(point.getLng(), point.getLat());}/*** 经纬度位于中国境外返回true,境内返回false* @param lng  经度* @param lat 纬度* @return*/public static boolean isInChina(double lng, double lat) {if (lng < LNG_E1 || lng > LNG_E2) {return true;}if (lat < LAT_N1 || lat > LAT_N2) {return true;}return false;}/*** 经度偏移量* @param lng* @param lat* @return*/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*/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;}/*** 偏移量* @param lng* @param lat* @return*/public static double[] offset(double lng, double lat) {double[] lngLat = new double[2];double dlng = transformLng(lng - 105.0, lat - 35.0);double dlat = transformLat(lng - 105.0, lat - 35.0);double radlat = lat / 180.0 * PI;double magic = Math.sin(radlat);magic = 1 - FLATTENING * magic * magic;double sqrtMagic = Math.sqrt(magic);dlng = (dlng * 180.0) / (SEMI_MAJOR / sqrtMagic * Math.cos(radlat) * PI);dlat = (dlat * 180.0) / ((SEMI_MAJOR * (1 - FLATTENING)) / (magic * sqrtMagic) * PI);lngLat[0] = dlng;lngLat[1] = dlat;return lngLat;}
}

【Java】 # java实现坐标转换工具类相关推荐

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

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

  2. java图片缩放工具类,一个JAVA图形缩放处置工具类

    一个JAVA图形缩放处理工具类 调用的例子 import java.io.FileOutputStream; import java.io.IOException; import javax.imag ...

  3. JAVA I/O流工具类TextFile

    JAVA I/O流工具类TextFile由广州疯狂软件java培训分享: 本文是一个TextFile类,通过这个类我们可以调用其中的方法来简化对文件的读写,这段代码的可用性比较强.这个TextFile ...

  4. java redis remove_最全的Java操作Redis的工具类

    RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...

  5. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  6. java 代理ip工具类_Java基础之java处理ip的工具类

    java处理ip的工具类,包括把long类型的Ip转为一般Ip类型.把xx.xx.xx.xx类型的转为long类型.根据掩码位获取掩码.根据 ip/掩码位 计算IP段的起始IP.根据 ip/掩码位 计 ...

  7. java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]

    java练习(数组工具类的封装)[目前写过最长的代码,虽然不难] package myUtil.arrayUtil;public class ArraysUtil {/*** 升序排列一个byte数组 ...

  8. java工具类应该抛异常吗,java学习阶段一 工具类(异常)

    java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...

  9. java Excel导入导出工具类 及使用demo

    java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...

最新文章

  1. Javascript学习7 - 脚本化浏览器窗口
  2. C#学习基本概念之匿名方法及Lambda表达式
  3. 用mtrace定位内存泄漏
  4. 专业课程设计之客户与服务器程序的同步与通信机制的设计(一)项目介绍
  5. HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
  6. 7 环境变量 立即生效_不服已经生效的刑事判决书该怎么办?刑事案件如何执行?...
  7. python是一种编译语言_解释型语言和编译型语言的不同以及Python如何运行
  8. 用存储过程实现的分页程序
  9. html百分比实现边框而不挤出
  10. WPS客户端更新日志留着备用
  11. app运营推广投放策略
  12. 手机开热点但是电脑一直连接不上_电脑连接手机热点无法上网的三种解决方法...
  13. 微信公众号怎么发红包?
  14. 女子连WiFi结果收到巨额话费单:有些WiFi其实是收费的
  15. order by是怎么工作的?
  16. 刷脸支付行业代理的几个坑,你踩了吗?
  17. 乳腺结节属于癌前病变吗?
  18. Android去除默认提示音
  19. html2Canvas 边框虚线
  20. 重磅!西安交通大学使用脑机接口技术实现了高位截瘫失语患者“说”出“心里话”

热门文章

  1. BZOJ4808马——二分图最大独立集
  2. 接口文档神器Swagger(上篇)
  3. Python基础知识(八):模块化、标准库、第三方库
  4. 无损数据地将动态磁盘转换为基本磁盘
  5. 四、Pinia 的安装及其基本使用
  6. UE ReplayKit for iOS插件使用
  7. 卸载计算机应用程序的步骤,图文教您win10系统快速卸载应用程序的具体步骤
  8. laravel+ldap统一用户登录连接
  9. Extjs6 gridPanel排序与获取Store的排序信息
  10. 一张图认识Python(附基本语法总结)