WGS-84 ,GCJ-02与BD-09的坐标进行转换

2024-01-28 15:58
文章标签 进行 02 坐标 转换 09 84 bd gcj wgs

本文主要是介绍WGS-84 ,GCJ-02与BD-09的坐标进行转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java实现

package com.zehin.map.util;public class GPSUtil {  public static double pi = 3.1415926535897932384626;  public static double x_pi = 3.14159265358979324 * 3000.0 / 180.0;  public static double a = 6378245.0;  public static double ee = 0.00669342162296594323;  public 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;  }  public 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;  }  public static double[] transform(double lat, double lon) {  if (outOfChina(lat, lon)) {  return new double[]{lat,lon};  }  double dLat = transformLat(lon - 105.0, lat - 35.0);  double dLon = transformLon(lon - 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);  dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  double mgLat = lat + dLat;  double mgLon = lon + dLon;  return new double[]{mgLat,mgLon};  }  public 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;  }  /** * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System * * @param lat * @param lon * @return */  public static double[] gps84_To_Gcj02(double lat, double lon) {  if (outOfChina(lat, lon)) {  return new double[]{lat,lon};  }  double dLat = transformLat(lon - 105.0, lat - 35.0);  double dLon = transformLon(lon - 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);  dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);  double mgLat = lat + dLat;  double mgLon = lon + dLon;  return new double[]{mgLat, mgLon};  }  /** * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return * */  public static double[] gcj02_To_Gps84(double lat, double lon) {  double[] gps = transform(lat, lon);  double lontitude = lon * 2 - gps[1];  double latitude = lat * 2 - gps[0];  return new double[]{latitude, lontitude};  }  /** * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 * * @param lat * @param lon */  public static double[] gcj02_To_Bd09(double lat, double lon) {  double x = lon, y = 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);  double tempLon = z * Math.cos(theta) + 0.0065;  double tempLat = z * Math.sin(theta) + 0.006;  double[] gps = {tempLat,tempLon};  return gps;  }  /** * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param * bd_lat * @param bd_lon * @return */  public static double[] bd09_To_Gcj02(double lat, double lon) {  double x = lon - 0.0065, 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 tempLon = z * Math.cos(theta);  double tempLat = z * Math.sin(theta);  double[] gps = {tempLat,tempLon};  return gps;  }  /**将gps84转为bd09 * @param lat * @param lon * @return */  public static double[] gps84_To_bd09(double lat,double lon){  double[] gcj02 = gps84_To_Gcj02(lat,lon);  double[] bd09 = gcj02_To_Bd09(gcj02[0],gcj02[1]);  return bd09;  }  public static double[] bd09_To_gps84(double lat,double lon){  double[] gcj02 = bd09_To_Gcj02(lat, lon);  double[] gps84 = gcj02_To_Gps84(gcj02[0], gcj02[1]);  //保留小数点后六位  gps84[0] = retain6(gps84[0]);  gps84[1] = retain6(gps84[1]);  return gps84;  }  /**保留小数点后六位 * @param num * @return */  private static double retain6(double num){  String result = String .format("%.6f", num);  return Double.valueOf(result);  }  } 

js实现

var GPS = {PI : 3.14159265358979324,x_pi : 3.14159265358979324 * 3000.0 / 180.0,delta : function (lat, lon) {// Krasovsky 1940//// a = 6378245.0, 1/f = 298.3// b = a * (1 - f)// ee = (a^2 - b^2) / a^2;var a = 6378245.0; //  a: 卫星椭球坐标投影到平面地图坐标系的投影因子。var ee = 0.00669342162296594323; //  ee: 椭球的偏心率。var dLat = this.transformLat(lon - 105.0, lat - 35.0);var dLon = this.transformLon(lon - 105.0, lat - 35.0);var radLat = lat / 180.0 * this.PI;var magic = Math.sin(radLat);magic = 1 - ee * magic * magic;var sqrtMagic = Math.sqrt(magic);dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * this.PI);dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * this.PI);return {'lat': dLat, 'lon': dLon};},//WGS-84 to GCJ-02gcj_encrypt : function (wgsLat, wgsLon) {if (this.outOfChina(wgsLat, wgsLon))return {'lat': wgsLat, 'lon': wgsLon};var d = this.delta(wgsLat, wgsLon);return {'lat' : wgsLat + d.lat,'lon' : wgsLon + d.lon};},//GCJ-02 to WGS-84gcj_decrypt : function (gcjLat, gcjLon) {if (this.outOfChina(gcjLat, gcjLon))return {'lat': gcjLat, 'lon': gcjLon};var d = this.delta(gcjLat, gcjLon);return {'lat': gcjLat - d.lat, 'lon': gcjLon - d.lon};},//GCJ-02 to WGS-84 exactlygcj_decrypt_exact : function (gcjLat, gcjLon) {var initDelta = 0.01;var threshold = 0.000000001;var dLat = initDelta, dLon = initDelta;var mLat = gcjLat - dLat, mLon = gcjLon - dLon;var pLat = gcjLat + dLat, pLon = gcjLon + dLon;var wgsLat, wgsLon, i = 0;while (1) {wgsLat = (mLat + pLat) / 2;wgsLon = (mLon + pLon) / 2;var tmp = this.gcj_encrypt(wgsLat, wgsLon)dLat = tmp.lat - gcjLat;dLon = tmp.lon - gcjLon;if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold))break;if (dLat > 0) pLat = wgsLat; else mLat = wgsLat;if (dLon > 0) pLon = wgsLon; else mLon = wgsLon;if (++i > 10000) break;}//console.log(i);return {'lat': wgsLat, 'lon': wgsLon};},//GCJ-02 to BD-09bd_encrypt : function (gcjLat, gcjLon) {var x = gcjLon, y = gcjLat;var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi);var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi);bdLon = z * Math.cos(theta) + 0.0065;bdLat = z * Math.sin(theta) + 0.006;return {'lat' : bdLat,'lon' : bdLon};},//BD-09 to GCJ-02bd_decrypt : function (bdLat, bdLon) {var x = bdLon - 0.0065, y = bdLat - 0.006;var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi);var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi);var gcjLon = z * Math.cos(theta);var gcjLat = z * Math.sin(theta);return {'lat' : gcjLat, 'lon' : gcjLon};},//WGS-84 to Web mercator//mercatorLat -> y mercatorLon -> xmercator_encrypt : function(wgsLat, wgsLon) {var x = wgsLon * 20037508.34 / 180.;var y = Math.log(Math.tan((90. + wgsLat) * this.PI / 360.)) / (this.PI / 180.);y = y * 20037508.34 / 180.;return {'lat' : y, 'lon' : x};/*if ((Math.abs(wgsLon) > 180 || Math.abs(wgsLat) > 90))return null;var x = 6378137.0 * wgsLon * 0.017453292519943295;var a = wgsLat * 0.017453292519943295;var y = 3189068.5 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));return {'lat' : y, 'lon' : x};//*/},// Web mercator to WGS-84// mercatorLat -> y mercatorLon -> xmercator_decrypt : function(mercatorLat, mercatorLon) {var x = mercatorLon / 20037508.34 * 180.;var y = mercatorLat / 20037508.34 * 180.;y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.)) - this.PI / 2);return {'lat' : y, 'lon' : x};/*if (Math.abs(mercatorLon) < 180 && Math.abs(mercatorLat) < 90)return null;if ((Math.abs(mercatorLon) > 20037508.3427892) || (Math.abs(mercatorLat) > 20037508.3427892))return null;var a = mercatorLon / 6378137.0 * 57.295779513082323;var x = a - (Math.floor(((a + 180.0) / 360.0)) * 360.0);var y = (1.5707963267948966 - (2.0 * Math.atan(Math.exp((-1.0 * mercatorLat) / 6378137.0)))) * 57.295779513082323;return {'lat' : y, 'lon' : x};//*/},// two point's distancedistance : function (latA, lonA, latB, lonB) {var earthR = 6371000.;var x = Math.cos(latA * this.PI / 180.) * Math.cos(latB * this.PI / 180.) * Math.cos((lonA - lonB) * this.PI / 180);var y = Math.sin(latA * this.PI / 180.) * Math.sin(latB * this.PI / 180.);var s = x + y;if (s > 1) s = 1;if (s < -1) s = -1;var alpha = Math.acos(s);var distance = alpha * earthR;return distance;},outOfChina : function (lat, lon) {if (lon < 72.004 || lon > 137.8347)return true;if (lat < 0.8293 || lat > 55.8271)return true;return false;},transformLat : function (x, y) {var 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 * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0;ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0;return ret;},transformLon : function (x, y) {var 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 * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0;ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0;ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0;return ret;}
};

这篇关于WGS-84 ,GCJ-02与BD-09的坐标进行转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654096

相关文章

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指