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

4
我正在计算当前太阳高度约为0.0的位置的经度。这是通过迭代一系列纬度计算日出时间(0.0, 纬度),然后通过将时间差(分数小时)乘以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时间)。该代码运行所需时间约为1秒。

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

代码

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

2
我认为你对问题的编辑可能改变了输出,但是...根据你描述的问题(太阳高度为0的点),本质上是关于在地球上追踪日夜交界线(光线转向黑暗的点)。如果地球的轴垂直于地球-太阳矢量或在春分时,这些都将在一个纬度上。例如,在冬至时想象一下日夜交界线会在哪里。 - Norman Gray
1
你能展示一下你的期望结果吗?你所给出的输出是从哪里来的? - Pierre GM
1
与什么相比,几分钟的差别? 此外,这两个函数是如何被调用的?它们似乎没有互相调用,所以我认为有一个主函数调用它们。 - user707650
我已经编辑了问题以进行澄清,并纠正了代码中的拼写错误。 - Izz ad-Din Ruhulessin
3个回答

1
我在NOAA's solar calculator上查看了您列表中极点的日出时间。输入纬度/经度和今天的日期,得到的日出时间与您发布的表格中的时间相同,但需要注意的是,该计算器仅提供最接近一分钟的日出时间。
尽管如此,如果您的问题是“我的代码有什么问题?”,那么答案很可能是“根本没有问题”。
但是,如果您的问题实际上是“我对位置和日期的日出时间变化的理解有什么误解?”,那么您的问题与SO的主题严重不符。

1

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

  1. 选择一个纬度和时间
  2. 选择两个经度a和b,使得太阳在其中一个上方(高度> 0,例如a),在另一个下方(高度<0,b)
  3. 进行二分搜索:选择介于a和b之间的经度c,并计算太阳在那里的高度。
  4. 如果该高度足够接近于零,请停止:c就是答案
  5. 如果高度小于0,则将b设置为c;否则将a设置为c。
  6. 回到第3步

对于每个想要的纬度都要这样做。

为了检查是否有效,请在春分点进行计算,你计算出的经度应该几乎相等(确保你理解原因)。再在任一冬至或夏至进行计算,经度应该变化很大,当你到达北纬或南纬约67度时,算法将失败(你能看出原因吗?)。


-1

太阳在天空中的位置是不均匀的。十二月份的当地视太阳时刻可能比平均本地正午早几分钟,而六月份的当地视太阳时刻可能会“迟到”几分钟。这种“摆动”是通过时间方程式来预测的,如果我理解正确,该方程式对赤道以外的地区影响更加明显。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接