Skip Navigation Links
技术文档
·网站建设
·软件使用
·图形设计
·程序开发
·网络应用
·电脑技巧
 
公司介绍
·公司简介
·索仕SRCOS网络应用平台
·索仕网站管理系统
·影视广告制作
·联系我们
 
 

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

4/27/2010 6:51:54 PM

 

中国的地图和卫星图都存在一个偏移量,我们在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();
        }

 

希望能够帮到遇到相同困扰的朋友。 

本文附件:
Wars2Wgs.rar
作者:根号贰 来源:博客园
 
 
 
昆明索仕科技开发有限公司 版权所有 Copyright© 2002-2010 Kunming Source Technology Exploitive Co.,LTD. All Rights Reserved.
电话:0871-5627877 业务QQ:163871 联系我们
本站基于:索仕网站信息管理系统建设 版本 2.0.4325