经纬度坐标与高斯坐标的转换代码(转)

原文:http://www.cnblogs.com/SuperMagic/archive/2007/12/04/982817.html

/* 功能说明: 将绝对高斯坐标(y,x)转换成绝对的地理坐标(wd,jd)。        */
// double y;     输入参数: 高斯坐标的横坐标,以米为单位 
// double x;  输入参数: 高斯坐标的纵坐标,以米为单位
// short  DH;     输入参数: 带号,表示上述高斯坐标是哪个带的
// double *L;     输出参数: 指向经度坐标的指针,其中经度坐标以秒为单位
// double *B;     输出参数: 指向纬度坐标的指针,其中纬度坐标以秒为单位
void GaussToGeo(double y, double x, short DH, double *L, double *B, double LP)
{
 double l0;    //  经差
 double tf;    //  tf = tg(Bf0),注意要将Bf转换成以弧度为单位
 double nf ;    //  n = y * sqrt( 1 + etf ** 2) / c, 其中etf = e‘**2 * cos(Bf0) ** 2
 double t_l0;   //  l0,经差,以度为单位
 double t_B0;   //  B0,纬度,以度为单位
 double Bf0;    //  Bf0
 double etf;    //  etf,其中etf = e‘**2 * cos(Bf0) ** 2
 double X_3 ;

double PI=3.14159265358979;
 double b_e2=0.0067385254147;
 double b_c=6399698.90178271;

X_3 = x / 1000000.00  - 3 ;      // 以兆米(1000000)为单位
 // 对于克拉索夫斯基椭球,计算Bf0
 Bf0 = 27.11115372595 + 9.02468257083 * X_3 - 0.00579740442 * pow(X_3,2)  
               - 0.00043532572 * pow(X_3,3) + 0.00004857285 * pow(X_3,4)  
               + 0.00000215727 * pow(X_3,5) - 0.00000019399 * pow(X_3,6) ; 
 tf = tan(Bf0*PI/180);       //  tf = tg(Bf),注意这里将Bf转换成以弧度为单位
 etf = b_e2 * pow(cos(Bf0*PI/180),2);   //  etf = e‘**2 * cos(Bf) ** 2
 nf = y * sqrt( 1 + etf ) / b_c;     //  n = y * sqrt( 1 + etf ** 2) / c
             // 计算纬度,注意这里计算出来的结果是以度为单位的
 t_B0 = Bf0 - (1.0+etf) * tf / PI * (90.0 * pow(nf,2)
       - 7.5 * (5.0 + 3 * pow(tf,2) + etf - 9 * etf * pow(tf,2)) * pow(nf,4) 
       + 0.25 * (61 + 90 * pow(tf,2) + 45 * pow(tf,4)) * pow(nf,6))     ;
             // 计算经差,注意这里计算出来的结果是以度为单位的
 t_l0 = (180 * nf - 30 * ( 1 + 2 * pow(tf,2) + etf ) * pow(nf,3)            
         + 1.5 * (5 + 28 * pow(tf,2) + 24 * pow(tf,4)) * pow(nf,5))          
         / ( PI * cos(Bf0*PI/180) ) ;
 l0 = (t_l0 * 3600.0);       //  将经差转成秒

if (LP == -1000)
 {
    *L = (double)((DH * 6 - 3) * 3600.0 + l0);  // 根据带号计算出以秒为单位的绝对经度,返回指针
 }
 else
 {
    *L = LP * 3600.0 + l0;  // 根据带号计算出以秒为单位的绝对经度,返回指针
 }
 //----------------------------------

*B = (double)(t_B0 * 3600.0) ;     //  将纬差转成秒,并返回指针
}

/* 功能说明: (1)将地理坐标(wd,jd)转换成绝对的高斯坐标(y,x)
    (2)本函数支持基于六度带(或三度带)、克拉索夫斯基椭球进行转换                             */
/* 适用范围: 本函数适用于将地球东半球中北半球(即东经0度到东经180度,北纬0度至90度)范围
    内所有地理坐标到高斯坐标的转换            */
/* 使用说明: 调用本函数后返回的结果应在满足精度的条件下进行四舍五入      */
// double jd;         输入参数: 地理坐标的经度,以秒为单位
// double wd;         输入参数: 地理坐标的纬度,以秒为单位
// short  DH;      输入参数: 三度带或六度带的带号
/*  六度带(三度带)的带号是这样得到的:从东经0度到东经180度自西向东按每6度(3度)顺序编号
 (编号从1开始),这个顺序编号就称为六度带(三度带)的带号。因此,六度带的带号的范围是1-30,
 三度带的带号的范围是1-60。
  如果一个点在图号为TH的图幅中,那麽该点所处的六度带的带号就可以这样得到:将该图号的
 第3、4位组成的字符串先转换成数字,再减去30。例如某点在图幅06490701中,该点所在的带号就
 是49-30,即19。
  如果调用本函数去进行一般的从地理坐标到基于六度带高斯坐标的变换(非邻带转换),则参
 数DH的选取按前一段的方法去确定。                
  如果调用本函数去进行基于六度带邻带转换,则参数DH的选取先按上述方法去确定,然后看是
 往前一个带还是后一个带进行邻带转换再确定是加1还是减1。         */
void GeoToGauss(double jd, double wd, short DH, short DH_width, double *y, double *x, double LP)
{
 double t;     //  t=tgB
 double L;     //  中央经线的经度
 double l0;    //  经差
 double jd_hd,wd_hd;  //  将jd、wd转换成以弧度为单位
 double et2;    //  et2 = (e‘ ** 2) * (cosB ** 2)
 double N;     //  N = C / sqrt(1 + et2)
 double X;     //  克拉索夫斯基椭球中子午弧长
 double m;     //  m = cosB * PI/180 * l0 
 double tsin,tcos;   //  sinB,cosB

double PI=3.14159265358979;
 double b_e2=0.0067385254147;
 double b_c=6399698.90178271;

jd_hd = jd / 3600.0 * PI / 180.0 ;    // 将以秒为单位的经度转换成弧度
 wd_hd = wd / 3600.0 * PI / 180.0 ;    // 将以秒为单位的纬度转换成弧度
  
 // 如果不设中央经线(缺省参数: -1000),则计算中央经线,
 // 否则,使用传入的中央经线,不再使用带号和带宽参数
 //L = (DH - 0.5) * DH_width ;      // 计算中央经线的经度
 if (LP == -1000)
 {
   L = (DH - 0.5) * DH_width ;      // 计算中央经线的经度
 }
 else
 {
   L = LP ;
 }

l0 = jd / 3600.0 - L  ;       // 计算经差
 tsin = sin(wd_hd);        // 计算sinB
 tcos = cos(wd_hd);        // 计算cosB
             // 计算克拉索夫斯基椭球中子午弧长X
 X = 111134.8611 / 3600.0 * wd - (32005.7799 * tsin + 133.9238 * pow(tsin,3)  
      + 0.6976 * pow(tsin,5) + 0.0039 * pow(tsin,7) ) * tcos; 
 et2 = b_e2 * pow(tcos,2) ;      //  et2 = (e‘ ** 2) * (cosB ** 2)
 N  = b_c / sqrt( 1 + et2 ) ;      //  N = C / sqrt(1 + et2)
 t  = tan(wd_hd);         //  t=tgB
 m  = PI/180 * l0 * tcos;       //  m = cosB * PI/180 * l0 
 *x = X + N * t * ( 0.5 * pow(m,2)                                           
          + (5.0 - pow(t,2) + 9.0 * et2 + 4 * pow(et2,2)) * pow(m,4)/24.0      
          + (61.0 - 58.0 * pow(t,2) + pow(t,4)) * pow(m,6) / 720.0 ) ;
 *y = N * ( m + ( 1.0 - pow(t,2) + et2 ) * pow(m,3) / 6.0                    
                + ( 5.0 - 18.0 * pow(t,2) + pow(t,4) + 14.0 * et2              
                   - 58.0 * et2 * pow(t,2) ) * pow(m,5) / 120.0 );

}

时间: 2024-10-07 12:09:21

经纬度坐标与高斯坐标的转换代码(转)的相关文章

百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)

/** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ //定义一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; var PI = 3.1415926535897932384626; var a = 6378245.0; var ee = 0.00669342162296594323; /** * 百度坐标系 (

高斯坐标正反算程序运算步骤

第一步.选择原始坐标系为测点经纬度第二步.选择新坐标系为 高斯坐标第三歩.录入原始坐标数据第四歩.录入输出路径并OK核心代码:

[转]百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

注:项目中面对不同的坐标体系,在地图上显示会有不小的偏差,下面是JavaScript的转换方法. //定义一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; var PI = 3.1415926535897932384626; var a = 6378245.0; var ee = 0.00669342162296594323; /** * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 * 即 百度 转 谷歌.高德 *

Win窗口坐标二维坐标与OpenGl的世界坐标系的转换

Win窗口坐标二维坐标与OpenGl的世界坐标系的转换 1. 首先明白Win环境的窗口二维坐标系表示 即,Win的屏幕坐标的坐标系表示如下:左上为坐标系原点,正右为X轴正方向, 正下方为Y轴正方向.    2. 在了解一下Opengl的视口坐标系 Opengl设置视口操作如下: glViewport(0,0,m_wide,m_heigth); 3. 关于opengl的世界坐标系,用户坐标系,模型坐标系可以查看博客 http://www.cnblogs.com/icmzn/p/5003600.ht

火星坐标、百度坐标、WGS84坐标转换代码(JS版)

/** * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ //定义一些常量 var x_PI = 3.14159265358979324 * 3000.0 / 180.0; var PI = 3.1415926535897932384626; var a = 6378245.0; var ee = 0.00669342162296594323; /** * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 * 即 百度 转

高斯坐标

522994.430 3388020.940 17.870 3673522994.400 3388020.990 17.870 3786522994.370 3388021.040 17.870 3424522994.340 3388021.080 17.870 3532522994.310 3388021.130 17.870 4103522994.280 3388021.190 17.870 5619522994.250 3388021.230 17.870 4871522994.350 3

WGS84、Web墨卡托、火星坐标、百度坐标互转

转自:1.http://blog.csdn.net/wildboy2001/article/details/12031351 2.http://kongxz.com/2013/10/wgs-cgj/ 3.http://www.oschina.net/code/snippet_260395_39205 GCJ-02坐标系统(火星坐标)简介:http://blog.csdn.net/giswens/article/details/8775121(存档:http://mapbd.com/cms/201

GPS坐标换算为百度坐标

最近在做一个关于手机定位的小应用,需求是这样的,用户通过手机(Wp8)进行二维码扫描操作并且记录用户的当前位置,在PC上可以查看用户所在地图的位置,做法就是在用户扫描条码时,通过手机GPS获取当前在地图上的位置(采用百度静态地图,根据坐标直接生成图片)并将图片保存到数据库,PC端直接从数据库中读取并展示图片.问题是:生成的图片所呈现的位置与实际位置偏差太大.于是我开始踏上了寻找解决办法的道路. 首先我检测我的硬件设备是否定位准确,我用WP8手机内置的地图进行了当前位置定位,结果没有问题,说明我的

地图坐标转换 -- 火星坐标与GPS坐标

第一次处理地理位置的数据的人,没什么经验,往往掉入很多坑浪费不少时间.我也是刚刚从坑里爬出来.这篇博文主要是把入门GPS轨迹分析的经验总结一下,以方便大家少走些弯路. (1)可视化 GPS 路径 刚拿到一堆GPS轨迹数据,想看看它长什么样?于是先想办法把它们可视化出来.有很多地图的API可以用,如果不是想搞演示,只是为了快速随便看一眼的话,推荐用百度的在线示例API  http://developer.baidu.com/map/jsdemo.htm#c1_3  里面有比较详细的例子,很丰富的操