中国的地图和卫星图都存在一个偏移量,我们在Google Map上看到的坐标与实际的GPS坐标其实是有着一定范围的偏移的,而在Google Earth上看到的坐标与GPS坐标是完全一致的,也就是说,同一张地图图片,切换到Google Map和Google Earth模式下的地图实际是上不匹配的,为什么会有这个偏移这里就不作叙述了,那么当我们拿到地图上的座标以后,要怎样转成GPS坐标呢?
在google中找到一段C的代码,主要是借助一组码表,加上一个计算公式而得到GPS坐标,我用C#翻译了一下,下面贴上代码:
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();
}
来源:http://www.cnblogs.com/ahhi/archive/2010/04/27/Wars2Wgs.html
分享到:
相关推荐
火星坐标转换,是一种能够把标准GPS坐标转换为火星坐标的算法
Android中,如何将火星坐标转换为标准的,已经讲标准的转换为火星坐标 Java语言编写,应用Android中GPS定位 略含说明文档.
GPS系统接收数据坐标转换 GPS接收的数据往往是三维坐标,而在科学研究中我们通常用二维坐标。因此必须 进行坐标转换,下面我们介绍一种坐标转换,即把WGS84坐标转换为高斯—克吕 格坐标系。数字地图投影的...
自己编写的火星坐标转84坐标工具,支持Excel批量转换。只需要选择好对应的列就可以自动转换。
支持火星坐标(奥维)与 wgs84坐标(Google Earth)坐标批量通过电子表格方式相互转换 使用方法: 双击exe执行程序,按提示选择是生成模板还是进行转换。已有模板表格情况下,模板填入相应信息保存并关闭电子表格,...
----------------------非战斗人员勿扰---------------------------- 获取GPS定位信息 火星坐标转换代码.zip
delphi写的关于gps-火星-百度等坐标相互转换的源码,fmx和vcl都可用 by 漠北
最近因为公司需求,在做GPS定位,并且将获得的坐标显示在高德地图上,但是实际效果跟我们期望的是有偏差的。...下面这篇文章就详细介绍了Android中GPS坐标转换为高德地图坐标的方法,需要的朋友可以参考下。
//火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 function gps84ToGcj02(lat, lon: double): TLaLoDegPoint; //WGS84 to 火星坐标系 (GCJ-02) //World Geodetic System ==>...
GPS、火星坐标、百度坐标相互转换,GPS具体计算等GPS相关的帮助类
* GCJ02坐标系:即火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。 * 谷歌中国地图和搜搜中国地图采用的是GCJ02地理坐标系; BD09坐标系:即百度坐标系,GCJ02坐标...
GCJ02=>BD09 火星坐标系=>百度坐标系 BD09=>GCJ02 百度坐标系=>火星坐标系 WGS84=>GCJ02 地球坐标系=>火星坐标系 GCJ02=>WGS84 火星坐标系=>地球坐标系(粗略) GCJ02=>WGS84 火星坐标系=>地球坐标系(精确) BD09=>...
坐标转换,火星坐标,gps坐标,百度坐标
2、GCJ-02,又称为“火星坐标”,国家测绘局在02年发布的坐标体系,在国内,至少得使用此坐标体系,比如:google、高德、腾讯地图等; 3、其他特殊坐标体系,一般都是由火星坐标通过偏移算法计算得出的,比如百度...
eviltransform.swift - 解决国内GPS地图坐标偏移问题,它将政府加密过的GCJ-02坐标,转成世界通用的WGS-84坐标
纯本地运算的一个坐标转换工具,地球坐标(WGS-84),火星坐标(jcg-02),百度坐标之间可以相互转换
自己写了一个MATLAB的demo,关于地图之间的gps坐标转换,以及计算gps坐标之间的距离(单位:m)。
* * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param * 百度转火星 * * bd_lat * @param bd_lon * @return */ public static GPS bd09_To_Gcj02...