经纬度转换为xy的问题,很急,谢谢!!!

灰太狼已不再单身 2011-09-13 11:26:22
INDEX TRACK NUMBER UTC DATE UTC TIME LOCAL DATE LOCAL TIME LATITUDE N/S LONGITUDE E/W ALTITUDE SPEED
1 1 2011-9-8 11:01:45 2011-9-8 19:01:45 30.69754 N 104.067535 E 493.08667 7.308
2 1 2011-9-8 11:01:46 2011-9-8 19:01:46 30.697487 N 104.06749 E 515.001465 7.524
3 1 2011-9-8 11:01:47 2011-9-8 19:01:47 30.697481 N 104.067482 E 503.61792 6.804
4 1 2011-9-8 11:01:48 2011-9-8 19:01:48 30.697474 N 104.067482 E 498.477295 4.032
5 1 2011-9-8 11:01:49 2011-9-8 19:01:49 30.697477 N 104.067482 E 499.39917 1.044
6 1 2011-9-8 11:01:50 2011-9-8 19:01:50 30.697477 N 104.067474 E 500.196045 1.908

数据里面有经度,纬度。就是 latitude 是纬度,longitude是经度。把 经纬度,转换为 xy值 。
我在网上,找了一个方法,为什么转换之后的值非常大。上百万,千万的值。大家看看我找的方法对不对?或者,你们有其他方法,麻烦给我贴出来一下,,谢谢 。。!!!


/// <summary>
/// 经纬度转换为xy坐标
/// </summary>
/// <param name="latitude">纬度</param>
/// <param name="longitude">经度</param>
/// <returns>xy数组</returns>
public static double[] GetGPSToXY(double latitude, double longitude)
{
double[] xy = {0,0 };
//-------------------输入要转换的(度.分)---------------------//
//经度(度.分)
double L = longitude;
//纬度(度.分)
double B = latitude;
//-----------------------------------------------------------//

//椭球参数
double a = 6378245.0;
double f = 1 / 298.3;

//第一偏心率
double ee = Math.Sqrt(0.00669342162297);
double E0 = 0.00673852541468;
double P0 = 0.017453292519943;

//中央子午线
double L0 = 117.07;

//转换为度
//L: ddd.ddddd
L = L / 100;
//B: dd.ddddd
B = B / 100;

//转换为弧度
double b = B * P0;
double l = (L - 117.07) * P0;

double A = 1 + 3 * (Math.Pow(ee, 2)) / 4 + 45 * (Math.Pow(ee, 4)) / 64 + 175 * (Math.Pow(ee, 6)) / 256 + 11025 * (Math.Pow(ee, 8)) / 16384 + 43659 * (Math.Pow(ee, 10)) / 65536;
double BB = 3 * (Math.Pow(ee, 2)) / 4 + 15 * (Math.Pow(ee, 4)) / 16 + 525 * (Math.Pow(ee, 6)) / 512 + 2206 * (Math.Pow(ee, 8)) / 2048 + 72765 * (Math.Pow(ee, 10)) / 65536;
double C = 15 * (Math.Pow(ee, 4)) / 64 + 105 * (Math.Pow(ee, 6)) / 256 + 2205 * (Math.Pow(ee, 8)) / 4096 + 10395 * (Math.Pow(ee, 10)) / 16384;
double D = 35 * (Math.Pow(ee, 6)) / 512 + 315 * (Math.Pow(ee, 8)) / 2048 + 31185 * (Math.Pow(ee, 10)) / 131072;
double E = 315 * (Math.Pow(ee, 8)) / 16384 + 3465 * (Math.Pow(ee, 10)) / 65536;
double F = 693 * (Math.Pow(ee, 10)) / 131072;

//大地坐标为(B,L)的点到赤道的子午线弧长
double X0 = a * (1 - (Math.Pow(ee, 2))) * (A * b - BB * (Math.Sin(4 * b)) / 4 - D * (Math.Sin(6 * b)) / 6 + E * (Math.Sin(8 * b)) / 8 - F * (Math.Sin(10 * b)) / 10);

//高斯投影正算参数
double g = (Math.Sqrt(E0)) * Math.Cos(b);
double t = Math.Tan(b);
double m0 = l * Math.Cos(b);
double N = a / (Math.Sqrt(1 - (Math.Pow(ee, 2)) * (Math.Pow((Math.Sin(b)), 2))));

double X = X0 + N * t * m0 / 2 + N * t * (5 - (Math.Pow(t, 2)) + 9 * (Math.Pow(g, 2)) + 4 * (Math.Pow(g, 4))) * (Math.Pow(m0, 4)) / 24 + N * t * (61 - 58 * (Math.Pow(t, 2)) + (Math.Pow(t, 4)) + 270 * (Math.Pow(g, 2)) - 330 * (Math.Pow(g, 2)) * (Math.Pow(t, 2))) * (Math.Pow(m0, 6)) / 720;
double Y = 500000 + N * m0 + N * (1 - (Math.Pow(t, 2)) + (Math.Pow(g, 2))) * (Math.Pow(m0, 3)) / 6 + N * (5 - 18 * (Math.Pow(t, 2)) + (Math.Pow(t, 4)) + 14 * (Math.Pow(g, 2)) - 58 * (Math.Pow(g, 2)) * (Math.Pow(t, 2))) * (Math.Pow(m0, 5)) / 120;

xy[0] = X;
xy[1] = Y;

return xy;
}
...全文
3825 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
IT民工Farmer 2013-12-02
  • 打赏
  • 举报
回复
经度和纬度都是这个吗? 110(1度的距离) = 4万千米(地球大圆周长) / 360度
threenewbee 2013-05-30
  • 打赏
  • 举报
回复
引用 11 楼 atlantis141 的回复:
[quote=引用 2 楼 caozhy 的回复:] 要在一个欧氏平面上描述一个球面坐标,需要投影。 不同的投影算法决定了求得的坐标是不同的。 你的代码使用的是高斯投影,也就是等角横切椭圆柱投影,你应该先找一本测绘学的书看看。 当然,如果你要描述一个城市范围内的区域,也不需要那么复杂的算法,简单的圆柱投影即可。 也就是每相差1纬度,就当作y相差110千米,每相差1经度(假设在北京),相差85千米。 我们可以设置某一点为基点,那么对应的坐标只有2行就写出来了。
public static Tupe<double, double> GetGPSToXY(double latitude, double longitude)
{
    Tupe<double, double> r = new Tupe<double, double>();
    r.Item1 = (latitude - 40) * 110; //设 x 原点在 40 度。
    r.Item2 = (longitude - 116) * 85; //设 y 原点在 116 度。
    return r;
}
版主能指导一下 110 和 85 这两个值是怎么算出来的吗??[/quote] 110(1度的距离) = 4万千米(地球大圆周长) / 360度
atlantis141 2013-05-30
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
要在一个欧氏平面上描述一个球面坐标,需要投影。 不同的投影算法决定了求得的坐标是不同的。 你的代码使用的是高斯投影,也就是等角横切椭圆柱投影,你应该先找一本测绘学的书看看。 当然,如果你要描述一个城市范围内的区域,也不需要那么复杂的算法,简单的圆柱投影即可。 也就是每相差1纬度,就当作y相差110千米,每相差1经度(假设在北京),相差85千米。 我们可以设置某一点为基点,那么对应的坐标只有2行就写出来了。
public static Tupe<double, double> GetGPSToXY(double latitude, double longitude)
{
    Tupe<double, double> r = new Tupe<double, double>();
    r.Item1 = (latitude - 40) * 110; //设 x 原点在 40 度。
    r.Item2 = (longitude - 116) * 85; //设 y 原点在 116 度。
    return r;
}
版主能指导一下 110 和 85 这两个值是怎么算出来的吗??
  • 打赏
  • 举报
回复
慌什么!!!

还有个问题。。 移动 K线图 ,有木有具体的方法?!
IS-NULL 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 a376168065 的回复:]

这个问题 得从地球形成的时候说起 话说........
//此处省略100W字
然后......
//此处省略100W字
就形成了地球.
[/Quote]
[/Quote]


还不结贴,你个2B
a376168065 2011-09-13
  • 打赏
  • 举报
回复
这个问题 得从地球形成的时候说起 话说........
//此处省略100W字
然后......
//此处省略100W字
就形成了地球.
[/Quote]
by_封爱 2011-09-13
  • 打赏
  • 举报
回复
这个问题 得从地球形成的时候说起 话说........
//此处省略100W字
然后......
//此处省略100W字
就形成了地球.
IS-NULL 2011-09-13
  • 打赏
  • 举报
回复
我来混分的、嘎嘎
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 caozhy 的回复:]

看lz的数据,lz在成都一带,给你个适合成都的代码:

C# code
public static Tupe <double, double> GetGPSToXY(double latitude, double longitude)
{
Tupe <double, double> r = new Tupe <double, double>();
r.It……
[/Quote]

ok,了解了。 。非常感谢
threenewbee 2011-09-13
  • 打赏
  • 举报
回复
看lz的数据,lz在成都一带,给你个适合成都的代码:

public static Tupe<double, double> GetGPSToXY(double latitude, double longitude)
{
Tupe<double, double> r = new Tupe<double, double>();
r.Item1 = (latitude - 30) * 110; //设 x 原点在 30 度。
r.Item2 = (longitude - 104) * 96; //设 y 原点在 104 度。
return r;
}
threenewbee 2011-09-13
  • 打赏
  • 举报
回复
要在一个欧氏平面上描述一个球面坐标,需要投影。

不同的投影算法决定了求得的坐标是不同的。

你的代码使用的是高斯投影,也就是等角横切椭圆柱投影,你应该先找一本测绘学的书看看。

当然,如果你要描述一个城市范围内的区域,也不需要那么复杂的算法,简单的圆柱投影即可。

也就是每相差1纬度,就当作y相差110千米,每相差1经度(假设在北京),相差85千米。

我们可以设置某一点为基点,那么对应的坐标只有2行就写出来了。

public static Tupe<double, double> GetGPSToXY(double latitude, double longitude)
{
Tupe<double, double> r = new Tupe<double, double>();
r.Item1 = (latitude - 40) * 110; //设 x 原点在 40 度。
r.Item2 = (longitude - 116) * 85; //设 y 原点在 116 度。
return r;
}
  • 打赏
  • 举报
回复
我要的是把经纬度转换为xy平面坐标值,然后,描点,就像 chart控件那样的图示,然后,看轨迹图
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 diaodiaop 的回复:]

这个问题 得从地球形成的时候说起 话说........
//此处省略100W字
然后......
//此处省略100W字
就形成了地球.
[/Quote]

你们也太TM搞了。 。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧