GPS 纠偏的问题,一直没解决。。
网上很多解决将实际经纬度纠偏到GPS经纬度(下面是源码),可是现在我需要将带有偏差的GPS经纬度转化为实际的经纬度,求各位帮忙!!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
namespace Wars2Wgs
{
public partial class Form1 : Form
{
double[] TableX = new double[660 * 450];
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();
//textBox1.Text = s;
string[] lines = s.Split('\n');
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">GPS纬度 </param>
/// <param name="yWgs">GPS精度 </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();
}
}
}
7200000 1000000 7210372 999847 7220350 999834 7230340 999834 7240347 999848 7250321 999829 7260295 999811 7270306 999824 7280303 999825 7290287 999811 7300304 999828 7310321 999847 7320307 999833 7330305 999833 7340317 999848 7350294 999827 7360271 999810 7370282 999825 7380276 999824 7390256 999810 7400268 999828 7410282 999847 7420264 999833 7430259 999833 7440271 999847 7450250 999828 7460231 999810 7470248 999824