逆向定位

本教程的目的是计算地球上一点的逆向定位,以便确定传感器像素及其关联的线条看到该点。

我们还将解释如何找到传感器看到地面点的日期,这是一种只关注日期的逆向定位。

地球上一点的逆向定位

Rugged的初始化与直接定位教程中的初始化类似,直到rugged初始化为止。

由纬度、经度和海拔定义的点

一旦Rugged初始化完成,可以计算由地理坐标定义的点的线号和像素号:

import org.orekit.bodies.GeodeticPoint;
import org.orekit.rugged.linesensor.SensorPixel;
GeodeticPoint gp = new GeodeticPoint(latitude, longitude, altitude);
SensorPixel sensorPixel = rugged.inverseLocation(sensorName, gp, minLine, maxLine);

其中minLine(maxLine)是搜索区间的最小线号(最大线号)。

逆向定位将给出传感器像素号和关联的线号,用于观察地面上的点。 如果点在指定的线号之间无法看到,则返回结果为null。在这种特殊情况下不会抛出异常

由纬度和经度定义的点(无海拔)

类似地,可以计算仅由纬度和经度定义的点的线号和像素号。海拔将自动使用DEM确定。

 SensorPixel sensorPixel = rugged.inverseLocation(sensorName, latitude, longitude, minLine, maxLine);

日期定位

一旦Rugged初始化完成,可以计算传感器看到地球上一点的日期。

由纬度、经度和海拔定义的点

对于由地理坐标定义的点:

 AbsoluteDate dateLine = rugged.dateLocation(sensorName, gp, minLine, maxLine);

由纬度和经度定义的点(无海拔)

类似地,对于仅由纬度和经度定义的点(使用DEM自动确定海拔):

 AbsoluteDate dateLine = rugged.dateLocation(sensorName, latitude, longitude, minLine, maxLine);

确定最小/最大行间隔

Rugged提供了一种只使用卫星的位置-速度来确定线的非常粗略的估计方法。它假设位置-速度足够规则且没有空洞。

 OneAxisEllipsoid oneAxisEllipsoid = ruggedBuilder.getEllipsoid();
 Frame pvFrame = ruggedBuilder.getInertialFrame();
 RoughVisibilityEstimator roughVisibilityEstimator= new RoughVisibilityEstimator(oneAxisEllipsoid, pvFrame, satellitePVList);

可以使用粗略可见性估计器计算近似线:

 AbsoluteDate roughLineDate = roughVisibilityEstimator.estimateVisibility(gp);
 double roughLine = lineSensor.getLine(roughLineDate);

结果永远不会为空,但如果地面点远离轨迹,可能与实际相差很远。使用这条粗略线,再加上一些余量(例如100),可以将最小/最大行作为反向定位的搜索边界,同时考虑传感器的最小和最大行:

 int minLineRough = (int) FastMath.max(FastMath.floor(roughLine - margin), sensorMinLine);
 int maxLineRough = (int) FastMath.min(FastMath.floor(roughLine + margin), sensorMaxLine);

然后可以计算反向定位:

 SensorPixel sensorPixel = rugged.inverseLocation(sensorName, gp, minLineRough, maxLineRough);

源代码

源代码可在InverseLocation.java(src/tutorials下的fr.cs.examples包)中找到

返回页首