您的位置:首页 > 编程语言 > C#

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

2011-12-12 16:02 204 查看
中国的地图和卫星图都存在一个偏移量,我们在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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: