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();
}
我在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();
}
相关文章推荐
- GPS定位,经纬度附近地点查询–C#实现方法
- 火星坐标、偏移、加偏和纠偏、无偏的理解--gps纠偏专业技术
- GPS定位,经纬度附近地点查询–C#实现方法
- GPS定位,经纬度附近地点查询–C#实现方法
- GPS定位,经纬度附近地点查询–C#实现方法
- (转载)一种根据纠偏数据对火星坐标进行完美拟合的方法
- C#如何解析wsdl文件列出方法名和参数
- C# 调用PowerShell方法
- C#每隔n个字符插入一个字符的通用方法
- 【转载】C#验证控件的使用方法(RegularExpressionValidator)的使用
- C#生成随机数的三种方法
- C#实现获取一年中是第几个星期的方法
- C#.net 后台cs 调用前台javascript 的方法
- 给C#程序加壳(C# 调用嵌入资源的EXE文件方法)
- C#连接SQLite数据库方法总结
- c# 中使用crystal report,输出PDF文件的方法
- Javascript 调用C# 代码并传递参数的两种方法
- C# 数据库操作类(存储过程)及调用方法
- c# 匿名方法传参数 和有返回值
- c#.net常用的小函数和方法集