地球坐标,火星坐标,百度坐标转换C++

来源:互联网 发布:ubuntu 12.04 双系统 编辑:程序博客网 时间:2024/05/16 07:30

标准地球坐标即GPS设备获得的坐标,该坐标需要经过国家测绘局进行加密后形成火星坐标(WGS-84 ),我们用的google坐标和高德地图坐标也就是火星坐标

         百度地图,在火星坐标的基础上再进行一次加密,形成了百度地图上的坐标,因此,直接将标准地球坐标显示在百度地图上是会有几百米的偏差的。按照此原理,标准GPS坐标经过两步的转换可得到百度坐标。因为在处理百度地图时,例如查询其POI都需要百度地图上的坐标,而不是标准坐标,那么这样的转换就是必要的了。下面是两步转换的C++ 程序,供开发的人做一个参考。

[cpp] view plaincopy
  1. //============================================================================  
  2. // Name        : Convert_cpp.cpp  
  3. // Author      : roger  
  4. // Version     :  
  5. // Copyright   : Your copyright notice  
  6. // Description : Hello World in C++, Ansi-style  
  7. //============================================================================  
  8.   
  9. #include <iostream>  
  10. #include <math.h>  
  11. #include <stdlib.h>  
  12. #include <iomanip>  
  13. using namespace std;  
  14.   
  15. const double pi = 3.14159265358979324;  
  16.     const double a = 6378245.0;  
  17.     const double ee = 0.00669342162296594323;  
  18.     const  double x_pi = 3.14159265358979324 * 3000.0 / 180.0;  
  19.   
  20.     bool outOfChina(double lat, double lon)  
  21.     {  
  22.         if (lon < 72.004 || lon > 137.8347)  
  23.             return true;  
  24.         if (lat < 0.8293 || lat > 55.8271)  
  25.             return true;  
  26.         return false;  
  27.     }  
  28.   
  29.      double transformLat(double x, double y)  
  30.     {  
  31.         double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(abs(x));  
  32.         ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;  
  33.         ret += (20.0 * sin(y * pi) + 40.0 * sin(y / 3.0 * pi)) * 2.0 / 3.0;  
  34.         ret += (160.0 * sin(y / 12.0 * pi) + 320 * sin(y * pi / 30.0)) * 2.0 / 3.0;  
  35.         return ret;  
  36.     }  
  37.   
  38.      double transformLon(double x, double y)  
  39.     {  
  40.         double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(abs(x));  
  41.         ret += (20.0 * sin(6.0 * x * pi) + 20.0 * sin(2.0 * x * pi)) * 2.0 / 3.0;  
  42.         ret += (20.0 * sin(x * pi) + 40.0 * sin(x / 3.0 * pi)) * 2.0 / 3.0;  
  43.         ret += (150.0 * sin(x / 12.0 * pi) + 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0;  
  44.         return ret;  
  45.     }  
  46.   
  47.     /** 
  48.      * 地球坐标转换为火星坐标 
  49.      * World Geodetic System ==> Mars Geodetic System 
  50.      * 
  51.      * @param wgLat  地球坐标 
  52.      * @param wgLon 
  53.      * 
  54.      * mglat,mglon 火星坐标 
  55.      */  
  56.      void transform2Mars(double wgLat, double wgLon,double &mgLat,double &mgLon)  
  57.     {  
  58.         if (outOfChina(wgLat, wgLon))  
  59.         {  
  60.             mgLat  = wgLat;  
  61.             mgLon = wgLon;  
  62.             return ;  
  63.         }  
  64.         double dLat = transformLat(wgLon - 105.0, wgLat - 35.0);  
  65.         double dLon = transformLon(wgLon - 105.0, wgLat - 35.0);  
  66.         double radLat = wgLat / 180.0 * pi;  
  67.         double magic = sin(radLat);  
  68.         magic = 1 - ee * magic * magic;  
  69.         double sqrtMagic = sqrt(magic);  
  70.         dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);  
  71.         dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * pi);  
  72.         mgLat = wgLat + dLat;  
  73.         mgLon = wgLon + dLon;  
  74.   
  75.     }  
  76.   
  77.     /** 
  78.      * 火星坐标转换为百度坐标 
  79.      * @param gg_lat 
  80.      * @param gg_lon 
  81.      */  
  82.      void bd_encrypt(double gg_lat, double gg_lon,double &bd_lat,double & bd_lon)  
  83.     {  
  84.         double x = gg_lon, y = gg_lat;  
  85.         double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);  
  86.         double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);  
  87.         bd_lon = z * cos(theta) + 0.0065;  
  88.         bd_lat = z * sin(theta) + 0.006;  
  89.   
  90.     }  
  91.   
  92.     /** 
  93.      * 百度转火星 
  94.      * @param bd_lat 
  95.      * @param bd_lon 
  96.      */  
  97.      void bd_decrypt(double bd_lat, double bd_lon,double &gg_lat,double &gg_lon)  
  98.     {  
  99.         double x = bd_lon - 0.0065, y = bd_lat - 0.006;  
  100.         double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);  
  101.         double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);  
  102.         gg_lon = z * cos(theta);  
  103.         gg_lat = z * sin(theta);  
  104.   
  105.     }  
  106.   
  107.   
  108.   
  109. int main() {  
  110.     double lat = 30.227607;  
  111.     double lon = 120.036565;  
  112.   
  113.     //真实的经纬度转化为百度地图上的经纬度,便于计算百度POI  
  114.     double marsLat = 0;  
  115.     double marsLon = 0;  
  116.     double resultLat = 0;  
  117.     double resultLon = 0;  
  118.     transform2Mars(lat,lon,marsLat,marsLon);  
  119.     bd_encrypt(marsLat,marsLon,resultLat,resultLon);  
  120.   
  121.     //30.2193456 120.0348264  
  122.     cout<<setprecision(10)<<resultLat<<" "<<setprecision(10)<<resultLon<<endl;  
  123.   
  124. }  
         在自己的项目中,将标准GPS转换为百度坐标后,再获取百度地图的POI,获得的POI位置和真实的位置基本一致,可以使用。下面还有一些网上转载的资料,比较丰富,值得一看。

-----------------------------------------------------------------------------------------------------

  1. GCJ-02坐标系统(火星坐标)简介:http://blog.csdn.net/giswens/article/details/8775121(存档:http://mapbd.com/cms/2012/07/25/)
  2. GCJ-02到真实坐标反向变换的理论基础:http://blog.csdn.net/giswens/article/details/8775213
  3. WGS84坐标与Web墨卡托坐标互转:http://blog.csdn.net/giswens/article/details/9634261
  4. 地球坐标系 (WGS-84) 到火星坐标系 (GCJ-02) 的转换算法:
    • C#代码:https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936(注解:http://blog.csdn.net/giswens/article/details/8775283)
    • Java代码:http://emq.googlecode.com/svn/emq/src/Algorithm/Coords/Converter.java
    • iOS代码:http://blog.csdn.net/giswens/article/details/8775183(存档:http://www.keakon.net/2011/07/02/WGS84坐标转火星坐标(iOS篇))
  5. 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法:http://blog.csdn.net/coolypf/article/details/8569813(解释:国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。)
  6. 一种根据纠偏数据对火星坐标进行完美拟合的方法:http://blog.sina.com.cn/s/blog_538036cf0100pxbl.html
  7. 国内各地图API坐标系统比较:http://rovertang.com/archives/547
  8. 关于百度地图坐标转换接口的研究:http://rovertang.com/archives/24699


查询过资料可得,通过程序进行 标准坐标转火星坐标(google、高德),火星坐标转百度坐标,百度坐标转火星坐标,百度坐标转标准坐标都是可行的,火星直接转标准坐标转不了。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 诈骗电话骗了钱怎么办 被网友骗了一千块钱怎么办 被网友骗了1000块怎么办 微信红包被骗100怎么办 3m投资钱要不回来怎么办 手机照片超过3m怎么办 小说大于3m看不了怎么办 携程订单删除了怎么办 绿叶会员密码忘了怎么办 账号对名错了怎么办 lv双肩包肩带短了怎么办 微信充q币被骗了怎么办 qq隐私密码忘了怎么办 qq锁屏密码忘了怎么办 qq手势密码忘记了怎么办 qq红包的密码忘了怎么办 qq密码被改了怎么办啊 手机qq密码忘了怎么办 腾讯安全中心冻结解冻进不去怎么办 qq钱包充值限额怎么办 qq没绑卡支付密码忘了怎么办 手机qq停止运行该怎么办 手机不支持qq软件运行怎么办 王者传奇冲元宝不到账怎么办 支付宝充值地下城点卷冲错了怎么办 dnf点券冲错了怎么办 百家号改了手机绑定找不到了怎么办 银行卡换了网银怎么办 qq没有银行卡转不出钱怎么办 qq钱包限制一万怎么办 qq余额超过20万怎么办 扣扣忘记了密码怎么办 qq钱包发不出来怎么办 qq支付密码忘了怎么办? 扣扣上转账错了怎么办 qq绑卡存在异常怎么办 微信没绑银行卡忘记支付密码怎么办 微信的自动扣费怎么办 不小心把钱充到微信财付通该怎么办 财付通用什么充值卡充值话费怎么办 苹果手机灯坏了怎么办