【问题标题】:Calculate longitude based on latitude and sunrise time?根据纬度和日出时间计算经度?
【发布时间】:2012-08-16 18:48:54
【问题描述】:

我正在计算当前太阳高度当前约为 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 为单位)。代码在 ~second 下运行。

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

代码

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

【问题讨论】:

  • 我认为您对问题的编辑可能已经改变了输出,但是......您所描述的问题(太阳位于高度 0 的点)本质上是关于追踪地球上的终结者(光变暗的点)。只有当地轴垂直于地球-太阳矢量或在春分点时,这一切都在一个纬度上。例如,可视化终结者在至日的位置。
  • 你能展示你所期望的吗?你给出的输出来自哪里?
  • 与什么相比有几分钟的差异?另外,这两个函数是如何调用的?他们似乎没有互相调用,所以我假设某处有一个 main 函数调用它们。
  • 我已经编辑了问题以澄清,并更正了代码中的错字。

标签: python math astronomy xephem


【解决方案1】:

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

不过,如果您的问题是我的代码有什么问题?答案很可能是什么都没有

但是,如果您的问题真的是 关于日出时间位置和日期的变化,我有什么不明白的? 那么您的问题对于 SO 来说是严重的题外话。

【讨论】:

    【解决方案2】:

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

    1. 选择纬度和时间
    2. 选择两个经度,a 和 b,使得太阳在地平线之上(高度 > 0,例如 a),而在地平线下方(高度
    3. 进行二分搜索:在 a 和 b 之间选择经度 c,然后计算那里的太阳高度。
    4. 如果该高度足够接近零,则停止:c 是答案
    5. 如果海拔小于0,设置b=c;否则设置 a=c。
    6. 转到3

    为您想要的每个纬度执行此操作。

    要检查一切是否正常,请在春分点进行计算,并且您计算的经度应该几乎完全相等(确保您了解原因)。在任一至点再做一次,经度应该相差很大,当你到达大约 67 度的北或南时,算法将失败(你知道为什么吗?)。

    【讨论】:

      【解决方案3】:

      太阳在天空中的位置是不均匀的。 12 月的当地明显正午可能比当地平均中午早几分钟,而 6 月的当地明显正午可能会“晚”几分钟。这种“摆动”是通过时间等式预测的,如果我理解正确的话,它会在远离赤道的地方产生更明显的影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多