火星坐标转换为GPS坐标 && C#下的GPS座标纠偏方法(也叫火星座标)


中国的地图和卫星图都存在一个偏移量,我们在Google Map上看到的坐标与实际的GPS坐标其实是有着一定范围的偏移的,而在Google Earth上看到的坐标与GPS坐标是完全一致的,也就是说,同一张地图图片,切换到Google Map和Google Earth模式下的地图实际是上不匹配的,为什么会有这个偏移这里就不作叙述了,那么当我们拿到地图上的座标以后,要怎样转成GPS坐标呢?

     在google中找到一段C的代码,主要是借助一组码表,加上一个计算公式而得到GPS坐标,我用C#翻译了一下,下面贴上代码:

 

 

C#代码    收藏代码
  1.         double[] TableY = new double[660 * 450];  
  2.         bool InitTable = false;  
  3.   
  4.         public Form1()  
  5.         {  
  6.             InitializeComponent();  
  7.   
  8.             LoadText();  
  9.         }  
  10.   
  11.         private int GetID(int I, int J)  
  12.         {  
  13.             return I + 660 * J;  
  14.         }  
  15.   
  16.         private void LoadText()  
  17.         {  
  18.             using (StreamReader sr = new StreamReader("Mars2Wgs.txt"))  
  19.             {  
  20.                 string s = sr.ReadToEnd();  
  21.   
  22.                 Match MP = Regex.Match(s, "(\\d+)");  
  23.   
  24.                 int i = 0;  
  25.                 while (MP.Success)  
  26.                 {  
  27.                     //MessageBox.Show(MP.Value);  
  28.                     if (i % 2 == 0)  
  29.                     {  
  30.                         TableX[i / 2] = Convert.ToDouble(MP.Value) / 100000.0;  
  31.                     }  
  32.                     else  
  33.                     {  
  34.                         TableY[(i - 1) / 2] = Convert.ToDouble(MP.Value) / 100000.0;  
  35.                     }  
  36.                     i++;  
  37.                     MP = MP.NextMatch();  
  38.                 }  
  39.                 InitTable = true;  
  40.                 //MessageBox.Show((i / 2).ToString());  
  41.             }  
  42.         }  
  43.   
  44.         /// <summary>  
  45.         /// x是117左右,y是31左右  
  46.         /// </summary>  
  47.         /// <param name="xMars"></param>  
  48.         /// <param name="yMars"></param>  
  49.         /// <param name="xWgs"></param>  
  50.         /// <param name="yWgs"></param>  
  51.         private void Parse(double xMars, double yMars, ref double xWgs, ref double yWgs)  
  52.         {  
  53.             int i, j, k;  
  54.             double x1, y1, x2, y2, x3, y3, x4, y4, xtry, ytry, dx, dy;  
  55.             double t, u;  
  56.   
  57.             if (!InitTable)  
  58.                 return;  
  59.   
  60.             xtry = xMars;  
  61.             ytry = yMars;  
  62.   
  63.             for (k = 0; k < 10; ++k)  
  64.             {  
  65.                 // 只对中国国境内数据转换  
  66.                 if (xtry < 72 || xtry > 137.9 || ytry < 10 || ytry > 54.9)  
  67.                 {  
  68.                     return;  
  69.                 }  
  70.   
  71.                 i = (int)((xtry - 72.0) * 10.0);  
  72.                 j = (int)((ytry - 10.0) * 10.0);  
  73.   
  74.                 x1 = TableX[GetID(i, j)];  
  75.                 y1 = TableY[GetID(i, j)];  
  76.                 x2 = TableX[GetID(i + 1, j)];  
  77.                 y2 = TableY[GetID(i + 1, j)];  
  78.                 x3 = TableX[GetID(i + 1, j + 1)];  
  79.                 y3 = TableY[GetID(i + 1, j + 1)];  
  80.                 x4 = TableX[GetID(i, j + 1)];  
  81.                 y4 = TableY[GetID(i, j + 1)];  
  82.   
  83.                 t = (xtry - 72.0 - 0.1 * i) * 10.0;  
  84.                 u = (ytry - 10.0 - 0.1 * j) * 10.0;  
  85.   
  86.                 dx = (1.0 - t) * (1.0 - u) * x1 + t * (1.0 - u) * x2 + t * u * x3 + (1.0 - t) * u * x4 - xtry;  
  87.                 dy = (1.0 - t) * (1.0 - u) * y1 + t * (1.0 - u) * y2 + t * u * y3 + (1.0 - t) * u * y4 - ytry;  
  88.   
  89.                 xtry = (xtry + xMars - dx) / 2.0;  
  90.                 ytry = (ytry + yMars - dy) / 2.0;  
  91.             }  
  92.   
  93.             xWgs = xtry;  
  94.             yWgs = ytry;  
  95.   
  96.         }  
  97.   
  98.         private void button1_Click(object sender, EventArgs e)  
  99.         {  
  100.             double x = Convert.ToDouble(txbX.Text);  
  101.             double y = Convert.ToDouble(txbY.Text);  
  102.   
  103.             double xWgs = x;  
  104.             double yWgs = y;  
  105.   
  106.             Parse(x, y, ref xWgs, ref yWgs);  
  107.   
  108.             ltrResult.Text = "X:" + xWgs.ToString() + ",Y:" + yWgs.ToString();  
  109.         }  
  110.   
  111. 来源:http://www.cnblogs.com/ahhi/archive/2010/04/27/Wars2Wgs.html  
 
 

C#下的GPS座标纠偏方法(也叫火星座标)

 

中国的地图和卫星图都存在一个偏移量,我们在Google Map上看到的坐标与实际的GPS坐标其实是有着一定范围的偏移的,而在Google Earth上看到的坐标与GPS坐标是完全一致的,也就是说,同一张地图图片,切换到Google Map和Google Earth模式下的地图实际是上不匹配的,为什么会有这个偏移这里就不作叙述了,那么当我们拿到地图上的座标以后,要怎样转成GPS坐标呢?

我在google中找到一段C的代码,主要是借助一组码表,加上一个计算公式而得到GPS坐标,我用C#翻译了一下,下面贴上代码:

 

项目文件下载:Wars2Wgs.rar 

复制代码
         double [] TableY  =   new   double [ 660   *   450 ];
        
bool  InitTable  =   false ;

        
public  Form1()
        {
            InitializeComponent();

            LoadText();
        }

        
private   int  GetID( int  I,  int  J)
        {
            
return  I  +   660   *  J;
        }

        
private   void  LoadText()
        {
            
using  (StreamReader sr  =   new  StreamReader( " Mars2Wgs.txt " ))
            {
                
string  s  =  sr.ReadToEnd();

                Match MP 
=  Regex.Match(s,  " (\\d+) " );

                
int  i  =   0 ;
                
while  (MP.Success)
                {
                    
// MessageBox.Show(MP.Value);
                     if  (i  %   2   ==   0 )
                    {
                        TableX[i 
/   2 =  Convert.ToDouble(MP.Value)  /   100000.0 ;
                    }
                    
else
                    {
                        TableY[(i 
-   1 /   2 =  Convert.ToDouble(MP.Value)  /   100000.0 ;
                    }
                    i
++ ;
                    MP 
=  MP.NextMatch();
                }
                InitTable 
=   true ;
                
// MessageBox.Show((i / 2).ToString());
            }
        }

        
///   <summary>
        
///  x是117左右,y是31左右
        
///   </summary>
        
///   <param name="xMars"></param>
        
///   <param name="yMars"></param>
        
///   <param name="xWgs"></param>
        
///   <param name="yWgs"></param>
         private   void  Parse( double  xMars,  double  yMars,  ref   double  xWgs,  ref   double  yWgs)
        {
            
int  i, j, k;
            
double  x1, y1, x2, y2, x3, y3, x4, y4, xtry, ytry, dx, dy;
            
double  t, u;

            
if  ( ! InitTable)
                
return ;

            xtry 
=  xMars;
            ytry 
=  yMars;

            
for  (k  =   0 ; k  <   10 ++ k)
            {
                
//  只对中国国境内数据转换
                 if  (xtry  <   72   ||  xtry  >   137.9   ||  ytry  <   10   ||  ytry  >   54.9 )
                {
                    
return ;
                }

                i 
=  ( int )((xtry  -   72.0 *   10.0 );
                j 
=  ( int )((ytry  -   10.0 *   10.0 );

                x1 
=  TableX[GetID(i, j)];
                y1 
=  TableY[GetID(i, j)];
                x2 
=  TableX[GetID(i  +   1 , j)];
                y2 
=  TableY[GetID(i  +   1 , j)];
                x3 
=  TableX[GetID(i  +   1 , j  +   1 )];
                y3 
=  TableY[GetID(i  +   1 , j  +   1 )];
                x4 
=  TableX[GetID(i, j  +   1 )];
                y4 
=  TableY[GetID(i, j  +   1 )];

                t 
=  (xtry  -   72.0   -   0.1   *  i)  *   10.0 ;
                u 
=  (ytry  -   10.0   -   0.1   *  j)  *   10.0 ;

                dx 
=  ( 1.0   -  t)  *  ( 1.0   -  u)  *  x1  +  t  *  ( 1.0   -  u)  *  x2  +  t  *  u  *  x3  +  ( 1.0   -  t)  *  u  *  x4  -  xtry;
                dy 
=  ( 1.0   -  t)  *  ( 1.0   -  u)  *  y1  +  t  *  ( 1.0   -  u)  *  y2  +  t  *  u  *  y3  +  ( 1.0   -  t)  *  u  *  y4  -  ytry;

                xtry 
=  (xtry  +  xMars  -  dx)  /   2.0 ;
                ytry 
=  (ytry  +  yMars  -  dy)  /   2.0 ;
            }

            xWgs 
=  xtry;
            yWgs 
=  ytry;

        }

        
private   void  button1_Click( object  sender, EventArgs e)
        {
            
double  x  =  Convert.ToDouble(txbX.Text);
            
double  y  =  Convert.ToDouble(txbY.Text);

            
double  xWgs  =  x;
            
double  yWgs  =  y;

            Parse(x, y, 
ref  xWgs,  ref  yWgs);

            ltrResult.Text 
=   " X: "   +  xWgs.ToString()  +   " ,Y: "   +  yWgs.ToString();
        }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM