http://my.oschina.net/fankun2013/blog/338100

地图供应商比较多,产生了许多地图坐标。地图坐标正确转换是个问题。在之前开发地图应用的时候发现从WGS84坐标系(GPS)转换成某个地图坐标系都比较困难。然后只能使用地图供应商提供的webservice接口转换。百度也提供了免费的webservice接口(限制并发量)。对于少数点的转换性能还可以,但是对于非常多点的转换压力比较大(使用多线程并行计算).个人感觉比较繁琐,而且很难保证转换的稳定性。

时间飞逝,百度地图更新了新版本,给我们带来了福音,map API中自带了相关坐标的转换,这就省事多了。但是其它的地图貌似没有提供转换API.怎么办呢?真是高手在民间呀,哪个牛人透露转换的算法呢?估计是和百度相关的牛人吧。下面是对算法的收集和整理。提供java版本。js版本参考:http://www.oschina.net/code/snippet_260395_39205

这下使用地图转换就比较准确了。

java版本:

/*** 坐标转换程序* *  WGS84坐标系:即地球坐标系,国际上通用的坐标系。EarthGCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。MarsBD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。  Bd09搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。*     * 百度地图API        百度坐标腾讯搜搜地图API    火星坐标搜狐搜狗地图API    搜狗坐标*阿里云地图API       火星坐标图吧MapBar地图API    图吧坐标高德MapABC地图API    火星坐标灵图51ditu地图API    火星坐标* * @author fankun**/
public class CoordinateConvert {private static  double PI         = Math.PI;  private static  double AXIS             = 6378245.0;  //
        private static  double OFFSET             = 0.00669342162296594323;  //(a^2 - b^2) / a^2private static  double X_PI        = PI * 3000.0 / 180.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 gcj2WGS(latlon[0],latlon[1]);}// WGS84=》BD09   地球坐标系=>百度坐标系public static double[] wgs2BD09(double wgLat, double wgLon) {  double[] latlon = wgs2GCJ(wgLat,wgLon);return gcj2BD09(latlon[0],latlon[1]);}  // WGS84=》GCJ02   地球坐标系=>火星坐标系public static double[] wgs2GCJ(double wgLat, double wgLon) {  double[] latlon  = new double[2];if (outOfChina(wgLat, wgLon)){ latlon[0] = wgLat;  latlon[1] = wgLon;  return latlon;  }  double[] deltaD =  delta(wgLat,wgLon);latlon[0] = wgLat + deltaD[0];latlon[1] = wgLon + 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 gcjLon){double initDelta = 0.01;double threshold = 0.000000001;double dLat = initDelta, dLon = initDelta;double mLat = gcjLat - dLat, mLon = gcjLon - dLon;double pLat = gcjLat + dLat, pLon = gcjLon + dLon;double wgsLat, wgsLon, i = 0;while (true) {wgsLat = (mLat + pLat) / 2;wgsLon = (mLon + pLon) / 2;double[] tmp = wgs2GCJ(wgsLat, wgsLon);dLat = tmp[0] - gcjLat;dLon = tmp[1] - 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;}double[] latlon = new double[2];latlon[0] = wgsLat;latlon[1] = wgsLon;return latlon;}//两点距离public static double distance(double latA, double logA, double latB,double  logB){int earthR = 6371000;double x = Math.cos(latA*Math.PI/180) * Math.cos(latB*Math.PI/180) * Math.cos((logA-logB)*Math.PI/180);double y = Math.sin(latA*Math.PI/180) * Math.sin(latB*Math.PI/180);double s = x + y;if (s > 1)s = 1;if (s < -1)s = -1;double alpha = Math.acos(s);double distance = alpha * earthR;return distance;}public static double[] delta(double wgLat, double wgLon){double[] latlng  = new double[2];double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);  double dLon = transformLon(wgLon - 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);  dLon = (dLon * 180.0) / (AXIS / sqrtMagic * Math.cos(radLat) * PI);  latlng[0] =dLat;latlng[1] =dLon;return latlng;}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;  }  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;  }
}

转载于:https://www.cnblogs.com/gispathfinder/p/5778774.html

GPS各种地图坐标系转换(转载)相关推荐

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

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

  2. GPS定位:坐标系转换导致定位不准确的问题处理

    调试4G基站定位和GPS定位时,发现设备定位总是出现两公里左右的偏差,这里使用的是4G模块的基站定位.按照4G基站的通信距离和基站密度情况,不应该出现这么大的偏差.         所以这里需要考虑到 ...

  3. 如何批量轻松实现地图坐标系转换

    很多小伙伴在开发GIS平台的过程中,需要用到地图坐标系转换,比如说地心坐标系.BD09坐标系,需要在统一转换成WGS84坐标系在地图上标出来,做导航用. 但是地图坐标系批量转换的代码学习起来需要一定的 ...

  4. 地图坐标系转换(4326与3857转换)

    坐标系介绍 概念转载来源:https://baijiahao.baidu.com/s?id=1670725365482599052&wfr=spider&for=pc EPSG: 43 ...

  5. FreeJTS部标视频平台:车载坐标系与地图坐标系转换

    背景 最近在开发部标平台中进行轨迹回放的定位接口中,返发现回的是WSG-84坐标系下的经纬度信息,但项目前端使用的是高德地图,发现位置有偏移.经了解,需要进行车载坐标系和地图坐标系进行转换. 常见坐标 ...

  6. iOS Swift 应用内跳转第三方地图导航路线 及地图坐标系转换

    支持百度 谷歌 高德 苹果 腾讯地图 一键打开及  地图之间的坐标系的转换 本项目 Demo 下载地址  https://github.com/sinorychan/JumpToThirdMap 注意 ...

  7. Mysql 高德转天地图经纬度sql ,高德地图GCJ-02火星坐标系与GPS的WGS-84坐标系转换

    -- mysql高德转天地图 SELECT -- 经度 xlongitude * 2 -(xlongitude +(((300.0 + (xlongitude - 105.0) + 2.0 * (yl ...

  8. python地图坐标系转换(bd09,gcj02,wgs84三种投影坐标系相互转化)

    1.介绍 1.1 GIS之坐标系 坐标系是GIS的重中之重,一般来说,工作底图平面坐标系应采用国家大地坐标系CGCS2000(或相当于精度WGS84坐标系),投影方式采用高斯-克吕格投影,高程基准采用 ...

  9. 百度高德地图 坐标系转换

    可以访问http://www.gpsspg.com/maps.htm 来参考坐标变化 API可以使用:http://api.zdoz.net/interfaces.aspx 百度地图与高德地图也提供了 ...

最新文章

  1. 从Android界面开发谈起(转)
  2. winpython使用教程-如何使用Python自动控制windows桌面
  3. 备份 CSDN 博客(上)
  4. oc5480十六进制_oc 数据类型 | 学步园
  5. 【转】做好性能测试的6个关注点
  6. 三菱fx2n做从站的modbus通讯_三菱FX2N与昆仑通态(MCGS)无线编程口通讯例程
  7. linux 新老软件切换,Linux下非常重要的软件切换命令
  8. tp交换机管理页面_TP-LINK交换机设置细节
  9. Android 万能刷新控件
  10. python计算ROC曲线和面积AUC
  11. gatk过滤_快速入门GATK | Public Library of Bioinformatics
  12. DevOps流程demo(实操记录)
  13. 聊一聊C语言位域/位段
  14. 比bitblt和stretchblt效率更高的函数
  15. THREE.ShaderMaterial
  16. k8s dashboard安装
  17. Unity3D——添加剑痕效果(PocketRPG Trail插件)
  18. java微信二维码第三方后台登陆实现 ( 一 )
  19. 使用PdfBox实现pdf转图片,解决中文方块乱码等问题
  20. 百度富文本编辑器UEditor配置及功能实现详解

热门文章

  1. 《Algorithms》Comparable 实现插入排序
  2. 计算文件的hash值方法 | 使用powershell 以及 使用python
  3. html 修改坐标时间,牛顿:时间是人类的错觉,爱因斯坦:时间只是能更改的坐标...
  4. c语言http协议头字符串,c语言http请求解析表单内容
  5. mysql查询中使用别名_如何在MySQL选择查询中使用别名?
  6. oracle 执行sql路径,如何指定 SQL 执行路径
  7. pycharm检测不到python编译器_1.2 搭建python+pycharm编程开发环境
  8. Python邮件操作实例:发个邮件用Python实现远程自动关机
  9. torch.nn.Embedding()的固定化
  10. 洛谷 P1036 [NOIP2002 普及组] 选数(DFS)