2010-08-31 94 views

回答

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]; 
} 
0

lumberjack的回答很棒。這裏是在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; 
}