Радианы для вращения Земли, чтобы согласовать широту/долготу ECI с широтой/долготой ECEF

Я пытаюсь смоделировать положение спутников GPS на земном шаре для набора эфемерид. У меня есть проверенный набор координат ECI ( http://en.wikipedia.org/wiki/Earth-centered_inertial ) XYZ и проверенный набор координат ECEF ( http://en.wikipedia.org/wiki/ECEF ) XYZ.

For example ( m ):
ECEF X 4076514.50
ECEF Y 14673598.00
ECEF Z -21793674.00

ECI X 8004604.50
ECI Y 12956032.00
ECI Z -21793674.00

Иногда знаки координат X и Y ECI противоположны знакам координат X и Y ECEF.

Когда я наношу эти места на глобус и, очевидно, они не совпадают, если вы не повернете землю на некоторое количество радианов. Я вижу, что если вы вращаете землю, координаты ECI следуют по наземной траектории, которая согласуется с наземной траекторией ECEF, но с моим текущим кодом они смещаются на разные величины, в зависимости от времени суток, в которое я их наношу.

Вот мой код:

// The radians earth rotates in 1 second
double earthRotation = 0.000072921151467;

// Do something different depending on the switch position
if ( self.shouldAnimate == true ) {

    // The seconds since we started rotating
    double newRotationMultiplier = [self.eciDate timeIntervalSinceDate:self.lastEciDate];

    // Seconds           // Rad/Sec        // Multiplier
    self.timeSinceOpenGlStarted = newRotationMultiplier * earthRotation;
    matrixToRotate = GLKMatrix4Rotate(matrixToRotate, self.timeSinceOpenGlStarted, 0.0, 0.0, 1.0);

    // Latch it so that when we stop rotating, it doesn't revert
    self.effect.transform.modelviewMatrix = matrixToRotate;

}

Как определить радианы для вращения Земли, чтобы показать положения ECI в течение времени, чтобы они были одним и тем же местоположением на повернутом земном шаре (с точки зрения широты и долготы)? То есть, как мне рассчитать для любого времени UTC в день, насколько повернуть землю вокруг оси Z ("Вверх"), чтобы координаты ECI совпадали с координатами ECEF, и спутники оказались в одном и том же положении. над моим трехмерным глобусом?

ОБНОВЛЯТЬ:

Я заставил его работать - благодаря ответу ниже! Вот код:

    // Get the NSDate components
    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    [currentCalendar setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    NSDateComponents *components = [currentCalendar components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:self.eciDate];
    [components setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    NSInteger hour = [components hour];
    NSInteger minute = [components minute];
    NSInteger second = [components second];

    // Get UTC in terms of decimal hours
    float utc = hour + (float)minute/60.0f + (float)second/3600.0f; // UTC is expressed in hours as a decimal number

    //NSLog(@"UTC: %f H %f M %f S %f",utc,(float)hour,(float)minute/60.0f ,(float)second/3600.0f);

    // Get the seconds since the last vernal equinox
    double secondsSinceVernalEquinox = [self.eciDate timeIntervalSinceDate:appDelegate.lastVernalEquinox];

    // Do the math
    // http://physics.stackexchange.com/questions/98466/radians-to-rotate-earth-to-match-eci-lat-lon-with-ecef-lat-lon
    double d = secondsSinceVernalEquinox  / ( 60.0 * 60.0 * 24.0 ); // Give decimal days
    double p = 365.242187; // Length of tropical year
    double result = ( M_PI * 2 / 24 ) * ( utc - 12.0 ) + ( 2 * M_PI * d  / p );

    //NSLog(@"Radians = %f",result);

    // Seconds           // Rad/Sec        // Multiplier
    self.timeSinceOpenGlStarted = result;
    matrixToRotate = GLKMatrix4Rotate(matrixToRotate, self.timeSinceOpenGlStarted, 0.0, 0.0, 1.0);

    // Latch it so that when we stop rotating, it doesn't revert
    self.effect.transform.modelviewMatrix = matrixToRotate;
Мой первый ответ был не совсем точным (я думаю, что это около 1,8 градуса), потому что г следует измерять от перигелия, а не от точки весеннего равноденствия, плюс дополнительная постоянная. Однако я нашел более точную и простую формулу; см. мой обновленный ответ.

Ответы (1)

Отказ от ответственности: я обновил свой предыдущий ответ, так как нашел более точную формулу.

Угол поворота θ угол между точкой весны и меридианом в Гринвиче. Это также соответствует звездному времени по Гринвичу , преобразованному в радианы.

введите описание изображения здесь

Для данного времени UTC и данной даты соответствующее гринвичское (среднее) звездное время (в часах и десятичных частях часа) может быть рассчитано как

СГМТ "=" 18.697 374 558 + 24.065 709 824 419 г ,
где г - интервал в днях UT1, включая любую часть дня, начиная с 1 января 2000 г. в 12 часов UT ( источник: Военно-морская обсерватория США ). Конечно, это должно быть уменьшено до диапазона от 0 до 24 часов. Тогда угол поворота просто
θ "=" 2 π 24 СГМТ .