根据纬度和日出时间计算经度?

时间:2012-08-21 12:14:06

标签: python math astronomy xephem

我正在计算当前太阳高度当前为~0.0的位置的经度。这是通过迭代一系列纬度,计算(0.0, latitude)的日出时间然后通过将时间差(小时数)乘以15(太阳“移动”的度数来计算经度来完成的。地球表面。)

当从计算的坐标元组计算日出时间时,最低纬度显示具有最高纬度的几分钟的时间差。如何解释这种差异?

在:

points=walk_the_earth()

输出:

[-66.53673944994807, -65.0] 2012-08-21 12:07:04.748893
[-67.13184367865324, -64.5] 2012-08-21 12:07:05.666852
[-67.70314011722803, -64.0] 2012-08-21 12:07:06.541521
...
[-119.24775995314121, 64.0] 2012-08-21 12:08:45.536679
[-119.93103107437491, 64.5] 2012-08-21 12:08:47.770382
[-120.64480075612664, 65.0] 2012-08-21 12:08:50.152224

(时间以UTC表示)。代码在〜秒内运行。

造成这种差异的原因是什么?

代码

import math
import xephem

def longitude_from_latitude(lat):
    """
    Calculate the longitude at which Sun altitude is ~0.0.

    Args:
        lat: A float indicating the latitude to calculate longitude
            for.

    Returns:
        float
    """
    now = xephem.julianday.now()
    meridian = xephem.Observer(now.midnight.dublin, 0.0, lat)
    sun = xephem.Sun.fromobserver(meridian)
    transit = sun.transit(-1)
    # Calculate time difference between sun position and local time.
    delta_t = ((now - transit['rs_risetm']) * 24.0) * 15.0
    return delta_t


def walk_the_earth(resolution=0.5, minlat=-65.0, maxlat=65.0):
    """
    Calculate the coordinate at which Sun altitude is ~0.0 for
    a given range of latitudes.

    Args:
        resolution: A float indicating the number of points to
            return for the specified range of latitudes. 1.0 means
            that 1 longitude will be calculated for each real
            latitude, 0.5 means 2, etc.
        minlat: A float indicating the lowest latitude to start
            calculating.
        maxlat: A float indicating the highest latitude to 
            calculate up to.

    Returns:   
        list of longitude, latitude, xephem.Sun tuples.
    """
    now = xephem.julianday.now()
    lat = minlat
    points = []
    while True:
        if lat > maxlat:
            break
        lng = longitude_from_latitude(lat)
        # Create an Observer for longitude and latitude
        obs = xephem.Observer(now.dublin, lng, lat)
        sun = xephem.Sun.fromobserver(obs)
        points.append([lng, lat, sun])
        # sun.transit() calculates the rising, transit and setting times
        # of the sun at Observers location. The -1 argument specifies
        # that we consider sunrise to occur when the upper limb touches
        # the horizon (0 indicates center, 1 indicates lower limb).
        print points[-1], sun.transit(-1)['rs_risetm'].datetime()
        lat += resolution
    return points

3 个答案:

答案 0 :(得分:1)

我检查了NOAA's solar calculator列表中极端N和S点的日出时间。在纬度/经度和今天的日期喂食时,日出时间与您发布的表格相同,条件是计算器仅将日出时间提供给最近的分钟。

尽管如此,如果您的问题与我的代码有什么问题一致?答案很可能是什么都没有

但是,如果你的问题确实是我对日出时间与职位和日期的变化有什么不了解?那么你的问题对于SO来说是非常偏离主题的。

答案 1 :(得分:1)

我认为更直接的方法对您有用,这可以避免每小时15度的校正。毕竟,你有一个星历,所以你可以利用它。

  1. 选择一个纬度和时间
  2. 选择两个经度a和b,使得太阳高于地平线一个(海拔高度> 0,比如说a),低于它的另一个(海拔高度<0,b)
  3. 进行二分搜索:在a和b之间选择一个经度c,并计算那里太阳的高度。
  4. 如果该高度足够接近零,请停止:c是答案
  5. 如果海拔高度小于0,则设置b = c;否则设置a = c。
  6. 转到3
  7. 为每个纬度做到这一点。

    要检查事情是否有效,请在昼夜平分点进行计算,并且您计算的经度应该几乎完全相等(确保您理解为什么)。在任何一个星期再做一遍,经度应该变化很大,当你到达北纬67度左右时算法会失败(你能明白为什么吗?)。

答案 2 :(得分:-1)

太阳在天空中的位置并不均匀。 12月份的当地明显中午可能比当地正常中午前几分钟,而6月份的当地明显中午可能会在几分钟后到来。&#34;这&#34;摆动&#34;通过时间方程预测,如果我理解正确的话,它会从赤道进一步产生更明显的影响。