cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5913
  • QQ14265545
  • 铜币29655枚
  • 威望213点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:2628回复:2

[转帖]经纬度坐标与高斯坐标的转换代码

楼主#
更多 发布于:2007-12-06 13:08
<P>/* 功能说明: 将绝对高斯坐标(y,x)转换成绝对的地理坐标(wd,jd)。        */<BR>// double y;     输入参数: 高斯坐标的横坐标,以米为单位<BR>// double x;  输入参数: 高斯坐标的纵坐标,以米为单位<BR>// short  DH;     输入参数: 带号,表示上述高斯坐标是哪个带的<BR>// double *L;     输出参数: 指向经度坐标的指针,其中经度坐标以秒为单位<BR>// double *B;     输出参数: 指向纬度坐标的指针,其中纬度坐标以秒为单位<BR>void GaussToGeo(double y, double x, short DH, double *L, double *B, double LP)<BR>{<BR> double l0;    //  经差<BR> double tf;    //  tf = tg(Bf0),注意要将Bf转换成以弧度为单位<BR> double nf ;    //  n = y * sqrt( 1 + etf ** 2) / c, 其中etf = e'**2 * cos(Bf0) ** 2<BR> double t_l0;   //  l0,经差,以度为单位<BR> double t_B0;   //  B0,纬度,以度为单位<BR> double Bf0;    //  Bf0<BR> double etf;    //  etf,其中etf = e'**2 * cos(Bf0) ** 2<BR> double X_3 ;</P>
<P> double PI=3.14159265358979;<BR> double b_e2=0.0067385254147;<BR> double b_c=6399698.90178271;</P>
<P> X_3 = x / 1000000.00  - 3 ;      // 以兆米(1000000)为单位<BR> // 对于克拉索夫斯基椭球,计算Bf0<BR> Bf0 = 27.11115372595 + 9.02468257083 * X_3 - 0.00579740442 * pow(X_3,2) <BR>               - 0.00043532572 * pow(X_3,3) + 0.00004857285 * pow(X_3,4) <BR>               + 0.00000215727 * pow(X_3,5) - 0.00000019399 * pow(X_3,6) ;<BR> tf = tan(Bf0*PI/180);       //  tf = tg(Bf),注意这里将Bf转换成以弧度为单位<BR> etf = b_e2 * pow(cos(Bf0*PI/180),2);   //  etf = e'**2 * cos(Bf) ** 2<BR> nf = y * sqrt( 1 + etf ) / b_c;     //  n = y * sqrt( 1 + etf ** 2) / c<BR>             // 计算纬度,注意这里计算出来的结果是以度为单位的<BR> t_B0 = Bf0 - (1.0+etf) * tf / PI * (90.0 * pow(nf,2)<BR>       - 7.5 * (5.0 + 3 * pow(tf,2) + etf - 9 * etf * pow(tf,2)) * pow(nf,4)<BR>       + 0.25 * (61 + 90 * pow(tf,2) + 45 * pow(tf,4)) * pow(nf,6))     ;<BR>             // 计算经差,注意这里计算出来的结果是以度为单位的<BR> t_l0 = (180 * nf - 30 * ( 1 + 2 * pow(tf,2) + etf ) * pow(nf,3)           <BR>         + 1.5 * (5 + 28 * pow(tf,2) + 24 * pow(tf,4)) * pow(nf,5))         <BR>         / ( PI * cos(Bf0*PI/180) ) ;<BR> l0 = (t_l0 * 3600.0);       //  将经差转成秒</P>
<P> if (LP == -1000)<BR> {<BR>    *L = (double)((DH * 6 - 3) * 3600.0 + l0);  // 根据带号计算出以秒为单位的绝对经度,返回指针<BR> }<BR> else<BR> {<BR>    *L = LP * 3600.0 + l0;  // 根据带号计算出以秒为单位的绝对经度,返回指针<BR> }<BR> //----------------------------------</P>
<P> *B = (double)(t_B0 * 3600.0) ;     //  将纬差转成秒,并返回指针<BR>}</P>
<P>/* 功能说明: (1)将地理坐标(wd,jd)转换成绝对的高斯坐标(y,x)<BR>    (2)本函数支持基于六度带(或三度带)、克拉索夫斯基椭球进行转换                             */<BR>/* 适用范围: 本函数适用于将地球东半球中北半球(即东经0度到东经180度,北纬0度至90度)范围<BR>    内所有地理坐标到高斯坐标的转换            */<BR>/* 使用说明: 调用本函数后返回的结果应在满足精度的条件下进行四舍五入      */<BR>// double jd;         输入参数: 地理坐标的经度,以秒为单位<BR>// double wd;         输入参数: 地理坐标的纬度,以秒为单位<BR>// short  DH;      输入参数: 三度带或六度带的带号<BR>/*  六度带(三度带)的带号是这样得到的:从东经0度到东经180度自西向东按每6度(3度)顺序编号<BR> (编号从1开始),这个顺序编号就称为六度带(三度带)的带号。因此,六度带的带号的范围是1-30,<BR> 三度带的带号的范围是1-60。<BR>  如果一个点在图号为TH的图幅中,那麽该点所处的六度带的带号就可以这样得到:将该图号的<BR> 第3、4位组成的字符串先转换成数字,再减去30。例如某点在图幅06490701中,该点所在的带号就<BR> 是49-30,即19。<BR>  如果调用本函数去进行一般的从地理坐标到基于六度带高斯坐标的变换(非邻带转换),则参<BR> 数DH的选取按前一段的方法去确定。                <BR>  如果调用本函数去进行基于六度带邻带转换,则参数DH的选取先按上述方法去确定,然后看是<BR> 往前一个带还是后一个带进行邻带转换再确定是加1还是减1。         */<BR>void GeoToGauss(double jd, double wd, short DH, short DH_width, double *y, double *x, double LP)<BR>{<BR> double t;     //  t=tgB<BR> double L;     //  中央经线的经度<BR> double l0;    //  经差<BR> double jd_hd,wd_hd;  //  将jd、wd转换成以弧度为单位<BR> double et2;    //  et2 = (e' ** 2) * (cosB ** 2)<BR> double N;     //  N = C / sqrt(1 + et2)<BR> double X;     //  克拉索夫斯基椭球中子午弧长<BR> double m;     //  m = cosB * PI/180 * l0<BR> double tsin,tcos;   //  sinB,cosB</P>
<P> double PI=3.14159265358979;<BR> double b_e2=0.0067385254147;<BR> double b_c=6399698.90178271;</P>
<P> jd_hd = jd / 3600.0 * PI / 180.0 ;    // 将以秒为单位的经度转换成弧度<BR> wd_hd = wd / 3600.0 * PI / 180.0 ;    // 将以秒为单位的纬度转换成弧度<BR> <BR> // 如果不设中央经线(缺省参数: -1000),则计算中央经线,<BR> // 否则,使用传入的中央经线,不再使用带号和带宽参数<BR> //L = (DH - 0.5) * DH_width ;      // 计算中央经线的经度<BR> if (LP == -1000)<BR> {<BR>   L = (DH - 0.5) * DH_width ;      // 计算中央经线的经度<BR> }<BR> else<BR> {<BR>   L = LP ;<BR> }</P>
<P> l0 = jd / 3600.0 - L  ;       // 计算经差<BR> tsin = sin(wd_hd);        // 计算sinB<BR> tcos = cos(wd_hd);        // 计算cosB<BR>             // 计算克拉索夫斯基椭球中子午弧长X<BR> X = 111134.8611 / 3600.0 * wd - (32005.7799 * tsin + 133.9238 * pow(tsin,3) <BR>      + 0.6976 * pow(tsin,5) + 0.0039 * pow(tsin,7) ) * tcos;<BR> et2 = b_e2 * pow(tcos,2) ;      //  et2 = (e' ** 2) * (cosB ** 2)<BR> N  = b_c / sqrt( 1 + et2 ) ;      //  N = C / sqrt(1 + et2)<BR> t  = tan(wd_hd);         //  t=tgB<BR> m  = PI/180 * l0 * tcos;       //  m = cosB * PI/180 * l0<BR> *x = X + N * t * ( 0.5 * pow(m,2)                                          <BR>          + (5.0 - pow(t,2) + 9.0 * et2 + 4 * pow(et2,2)) * pow(m,4)/24.0     <BR>          + (61.0 - 58.0 * pow(t,2) + pow(t,4)) * pow(m,6) / 720.0 ) ;<BR> *y = N * ( m + ( 1.0 - pow(t,2) + et2 ) * pow(m,3) / 6.0                   <BR>                + ( 5.0 - 18.0 * pow(t,2) + pow(t,4) + 14.0 * et2             <BR>                   - 58.0 * et2 * pow(t,2) ) * pow(m,5) / 120.0 );</P>
<P>}</P>
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
qinqing123
路人甲
路人甲
  • 注册日期2007-10-31
  • 发帖数3
  • QQ
  • 铜币111枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-12-13 09:19
你还有投影转换的源代码吗。我现在正需要这些东西啊,希望你多上传点啊谢谢啊
举报 回复(0) 喜欢(0)     评分
a59732303
路人甲
路人甲
  • 注册日期2009-03-11
  • 发帖数7
  • QQ
  • 铜币124枚
  • 威望0点
  • 贡献值0点
  • 银元0个
2楼#
发布于:2009-03-15 18:20
<STRONG>经纬度坐标与高斯坐标转换是应用在什么地方的?可以用在MAPINFO中的坐标转换吗?</STRONG>
举报 回复(0) 喜欢(0)     评分
游客

返回顶部