我在将RAE转换为XYZ时遇到问题。
如果我在WGS84球体上,在位置-742507,-5462738,3196706处,我检测到30km范围内的物体,方位角为310,仰角为18度,如何将其转换为ECEF XYZ坐标?
感谢。
答案 0 :(得分:5)
似乎没有直接的过程来执行此操作。我找到的最好的方法是从RAE坐标转换为SEZ坐标,然后从SEZ坐标转换为ECR坐标。这是我修改为C ++的一些C#代码来实现这个目的:
void main() {
// NOTE: distances are in meters, while angles are in degrees
double siteECR[] = { -763997.48, -5458565.87, 3196706.0 };
double objRAE[] = { 30000.0, 310.0, 18.0 };
double objECR[] = { 0.0, 0.0, 0.0 };
// Should return ~[-764142.7629, -5458517.683, 3217218.18] in objECR
RAEtoECR(siteECR, objRAE, objECR);
}
/************************************************************************************************************************/
/* Converts a Range, Azimuth, Elevation location to a Latitude, Longitude, Altitude location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* rae - array holding the Range, Azimuth, and Elevation, in degrees, of the object viewed from the site location */
/* objECR - destination array to hold the ECR X, Y, Z location in meters */
/************************************************************************************************************************/
void RAEtoECR(double siteECR[], double rae[], double objECR[]) {
double tempSEZ[] = { 0.0, 0.0, 0.0 };
double siteLLA[] = { 0.0, 0.0, 0.0 };
ECRtoLLA(siteECR, siteLLA);
RAEtoSEZ(siteLLA, objRAE, tempSEZ);
SEZtoECR(siteLLA, tempSEZ, objECR);
}
/************************************************************************************************************************/
/* Converts a Range, Azimuth, Elevation location to a South, East, Zenith location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* rae - array holding the Range, Azimuth, and Elevation, in degrees, of the object viewed from the site location */
/* sez - destination array to hold the South, East, and Zenith coordinates of the object being viewed in meters */
/************************************************************************************************************************/
void RAEtoSEZ(double siteLLA[], double rae[], double sez[]) {
double range, azimuth, elevation;
range = rae[0];
azimuth = rae[1];
elevation = rae[2];
// Compute needed math
double slat = sin(Deg2Rad(siteLLA[0]));
double slon = sin(Deg2Rad(siteLLA[1]));
double clat = cos(Deg2Rad(siteLLA[0]));
double clon = cos(Deg2Rad(siteLLA[1]));
// Convert to radians
azimuth = DEG2RAD(azimuth);
elevation = DEG2RAD(elevation);
// Convert
sez[0] = -range * cos(elevation) * cos(azimuth);
sez[1] = range * cos(elevation) * sin(azimuth);
sez[2] = range * sin(elevation);
}
/************************************************************************************************************************/
/* Converts a South, East, Zenith location to an ECR X, Y, Z location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* sez - array holding the South, East, and Zenith coordinates of the object being viewed in meters */
/* ecr - destination array to hold the ECR X, Y, Z location in meters */
/************************************************************************************************************************/
void SEZtoECR(double siteLLA[], double sez[], double ecr[]) {
// Convert siteLLA to XYZ
double[] siteXYZ = { 0.0, 0.0, 0.0 };
LLAtoECR(siteLLA, siteXYZ);
double south, east, zenith;
south = sez[0];
east = sez[1];
zenith = sez[2];
// Compute needed math
double slat = sin(Deg2Rad(siteLLA[0]));
double slon = sin(Deg2Rad(siteLLA[1]));
double clat = cos(Deg2Rad(siteLLA[0]));
double clon = cos(Deg2Rad(siteLLA[1]));
// Convert
ecr[0] = ( slat * clon * south) + (-slon * east) + (clat * clon * zenith) + siteXYZ[0];
ecr[1] = ( slat * slon * south) + ( clon * east) + (clat * slon * zenith) + siteXYZ[1];
ecr[2] = (-clat * south) + ( slat * zenith) + siteXYZ[2];
}
答案 1 :(得分:0)
您可以使用matlab函数sph2cart.m
或
http://computitos.files.wordpress.com/2008/03/cartesian_spherical_transformation.pdf
确保项目中的0degree与math 0degree相同。
答案 2 :(得分:0)
伐木工人的答案非常棒。这里是javascript以防万一有人需要它:
main();
function main() {
// NOTE: distances are in meters, while angles are in degrees
var siteECR = {
X: -763997.48,
Y: -5458565.87,
Z: 3196706.0
};
var siteLLA = {
Latitude: 30.28011211999193,
Longitude: -97.96753350982041,
Altitude: -1033.8619585652073
};
var objRAE = {
Range: 30000.0,
Azimuth: 310.0,
Elevation: 18.0
}
var objECR = { X: 0, Y: 0, Z: 0 }
// Should return ~[-764142.7629, -5458517.683, 3217218.18] in objECR
RAEtoECR(siteECR, siteLLA, objRAE, objECR);
console.log(objECR);
}
/************************************************************************************************************************/
/* Converts a Range, Azimuth, Elevation location to a Latitude, Longitude, Altitude location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* rae - array holding the Range, Azimuth, and Elevation, in degrees, of the object viewed from the site location */
/* objECR - destination array to hold the ECR X, Y, Z location in meters */
/************************************************************************************************************************/
function RAEtoECR(siteECR, siteLLA, rae, objECR) {
var tempSEZ = { South: 0, East: 0, Zenith: 0 };
//ECRtoLLA(siteECR, siteLLA);
RAEtoSEZ(siteLLA, rae, tempSEZ);
SEZtoECR(siteECR, siteLLA, tempSEZ, objECR);
}
function toRadians(angle) {
return angle * (Math.PI / 180);
}
/************************************************************************************************************************/
/* Converts a Range, Azimuth, Elevation location to a South, East, Zenith location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* rae - array holding the Range, Azimuth, and Elevation, in degrees, of the object viewed from the site location */
/* sez - destination array to hold the South, East, and Zenith coordinates of the object being viewed in meters */
/************************************************************************************************************************/
function RAEtoSEZ(siteLLA, rae, sez) {
var range = rae.Range;
var azimuth = rae.Azimuth;
var elevation = rae.Elevation;
// Compute needed math
var slat = Math.sin(toRadians(siteLLA.Latitude));
var slon = Math.sin(toRadians(siteLLA.Longitude));
var clat = Math.cos(toRadians(siteLLA.Latitude));
var clon = Math.cos(toRadians(siteLLA.Longitude));
// Convert to radians
azimuth = toRadians(azimuth);
elevation = toRadians(elevation);
// Convert
sez.South = -range * Math.cos(elevation) * Math.cos(azimuth);
sez.East = range * Math.cos(elevation) * Math.sin(azimuth);
sez.Zenith = range * Math.sin(elevation);
}
/************************************************************************************************************************/
/* Converts a South, East, Zenith location to an ECR X, Y, Z location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* sez - array holding the South, East, and Zenith coordinates of the object being viewed in meters */
/* ecr - destination array to hold the ECR X, Y, Z location in meters */
/************************************************************************************************************************/
function SEZtoECR(siteXYZ, siteLLA, sez, ecr) {
var south = sez.South;
var east = sez.East;
var zenith = sez.Zenith;
// Compute needed math
var slat = Math.sin(toRadians(siteLLA.Latitude));
var slon = Math.sin(toRadians(siteLLA.Longitude));
var clat = Math.cos(toRadians(siteLLA.Latitude));
var clon = Math.cos(toRadians(siteLLA.Longitude));
// Convert
ecr.X = ( slat * clon * south) + (-slon * east) + (clat * clon * zenith) + siteXYZ.X;
ecr.Y = ( slat * slon * south) + ( clon * east) + (clat * slon * zenith) + siteXYZ.Y;
ecr.Z = (-clat * south) + ( slat * zenith) + siteXYZ.Z;
}