- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我查看了站点中的帖子,但没有发现我的问题...正如标题所说,我正在尝试从 ecef 转换为 lla。
我正在使用此文档:Conversion article在直接公式中,而不是在迭代公式中和这个网站进行结果比较:ECEF2LLA
我是用java开发的,所以我的代码如下:
public static final double a = 6378137;
public static final double f = 1/298.257223563;
public static final double b = a*(1-f);
public static final double e = Math.sqrt((Math.pow(a, 2)-Math.pow(b, 2))/Math.pow(a, 2));
public static final double e2 = Math.sqrt((Math.pow(a, 2)-Math.pow(b, 2))/Math.pow(b, 2));
public static double[] ecef2lla(double x , double y , double z){
double[] lla = {0,0,0};
double lon,lat,height,N;
double p = Math.sqrt(Math.pow(x, 2)+Math.pow(y, 2));
double theta = Math.atan((z*a)/(p*b));
lon = Math.atan(y/x);
lon = lon*180/Math.PI;
lat = Math.atan(((z+Math.pow(e2, 2)*b*Math.pow(Math.sin(theta), 3))/((p-Math.pow(e,2)*a*Math.pow(Math.cos(theta), 3)))));
lat = (lat*180)/Math.PI;
N= a/(Math.sqrt(1-Math.pow(e*Math.sin(lat), 2)));
height = (p/Math.cos(theta)) - N;
lla[0] = lon;
lla[1] = lat;
lla[2] = height;
return lla;
}
我的高度数据有误。我已经尝试移动到弧度和度数等等。
提前致谢!
最佳答案
我找到这篇文章并准备在我的部分应用程序中使用“接受的答案”,但我决定先运行几个测试来验证算法。我使用了在线转换计算器 (http://www.sysense.com/products/ecef_lla_converter/index.html) 生成的示例数据。如下面的输出所示,我得到的结果不是很好。
-----Test 1---------
Inputs: -576793.17, -5376363.47, 3372298.51
Expected: 32.12345, -96.12345, 500.0
Actuals: 32.12306332822881, 83.87654999786477, 486.5472474489361
-----Test 2---------
Inputs: 2297292.91, 1016894.94, -5843939.62
Expected: -66.87654, 23.87654, 1000.0
Actuals: -66.876230479461, 23.87653991401422, 959.6879360172898
然后我使用以下帖子 ( https://gist.github.com/klucar/1536194 ) 中的代码重新运行相同的测试,并获得了更好的结果,如下面的输出所示。
-----Test 1---------
Inputs: -576793.17, -5376363.47, 3372298.51
Expected: 32.12345, -96.12345, 500.0
Actuals: 32.12345004807767, -96.12345000213524, 499.997958839871
-----Test 2---------
Inputs: 2297292.91, 1016894.94, -5843939.62
Expected: -66.87654, 23.87654, 1000.0
Actuals: -66.87654001741278, 23.87653991401422, 999.9983866894618
我没有花时间在“已接受的答案”中提供的解决方案中找到错误,但我建议的答案是:使用此代码...
/*
*
* ECEF - Earth Centered Earth Fixed
*
* LLA - Lat Lon Alt
*
* ported from matlab code at
* https://gist.github.com/1536054
* and
* https://gist.github.com/1536056
*/
// WGS84 ellipsoid constants
private final double a = 6378137; // radius
private final double e = 8.1819190842622e-2; // eccentricity
private final double asq = Math.pow(a,2);
private final double esq = Math.pow(e,2);
private double[] ecef2lla(double[] ecef){
double x = ecef[0];
double y = ecef[1];
double z = ecef[2];
double b = Math.sqrt( asq * (1-esq) );
double bsq = Math.pow(b,2);
double ep = Math.sqrt( (asq - bsq)/bsq);
double p = Math.sqrt( Math.pow(x,2) + Math.pow(y,2) );
double th = Math.atan2(a*z, b*p);
double lon = Math.atan2(y,x);
double lat = Math.atan2( (z + Math.pow(ep,2)*b*Math.pow(Math.sin(th),3) ), (p - esq*a*Math.pow(Math.cos(th),3)) );
double N = a/( Math.sqrt(1-esq*Math.pow(Math.sin(lat),2)) );
double alt = p / Math.cos(lat) - N;
// mod lat to 0-2pi
lon = lon % (2*Math.PI);
// correction for altitude near poles left out.
double[] ret = {lat, lon, alt};
return ret;
}
关于java - Java 中的 ECEF 到 lla (lat,lon,alt),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18253546/
假设我有(ECEF)某个物体在某个时间的纬度、经度和到地球的距离。我需要获取它的 J2000 坐标。我正在做的是 import skyfield.api planets = skyfield.api.
我在查找有关将 RAE 转换为 XYZ 的任何内容时遇到问题。 如果我在 WGS84 椭球体上,比如位置 -742507、-5462738、3196706,我检测到一个距离为 30 公里、方位角为 3
在android中是否可以读出ECEF中的GPS坐标和速度。 我想要一个速度矢量(x、y、z),就像在可用的标准 GPS 模块中一样? 干杯,西尔万 最佳答案 没有,Android APIs只提供WG
如何将 X、Y、Z 从本地引用 (ENU) 转换为世界引用 (ECEF) 并将其反转?? 输入: (lat,long) = center of the local reference system.
我想在带有 pyproj 的 python 中使用 WGS84 将 x/y/z-ECEF 位置转换为 lla (lat/lon/alt),但似乎转换失败了。 示例代码在这里: import pypro
我在卫星轨道的地心惯性坐标 (ECI) 中有位置 (x,y,z) 和速度 (Vx,Vy,Vz) 向量,并最终希望以大地坐标(纬度、经度、和海拔高度)。 根据这个other Stack Overflow
我想在 map 上绘制卫星跟踪。所以我将 SGP4 1.4 与 python 一起使用。输入 TLE 数据,但输出数据不是我想要的。所以我想把输出数据转换成ECEF数据,得到经纬度。 我知道 skyf
现在,我正在尝试将大量纬度经度高度格式的点的二进制文件转换为基于文本的 ECEF 笛卡尔格式(x、y、z)。现在的问题是这个过程非常非常非常慢。 我有超过 100 GB 的数据需要运行,并且可能会输入
我有一个 javascript 文件正在读取包含笛卡尔坐标的文本文件。我可以解析出 X、Y、Z 值;但是我需要将这些转换为十进制格式的纬度/经度。这些输出值将用于谷歌地图标记。 我一直在研究,肯定有很
我查看了站点中的帖子,但没有发现我的问题...正如标题所说,我正在尝试从 ecef 转换为 lla。 我正在使用此文档:Conversion article在直接公式中,而不是在迭代公式中和这个网站进
我编写了一个代码,使用 astropy 将坐标从地球固定系统转换为惯性坐标系: from astropy import coordinates as coord from astropy import
我正在尝试编写一个基本的 python 脚本,该脚本将从给定位置跟踪用 tle 定义的给定卫星。我不是一个 asto/orbital 的人,但我正在努力变得更聪明。 当我尝试将方位角、仰角、距离值转换
我是一名优秀的程序员,十分优秀!