我正在尝试编写代码来确定当前日期和位置的日出和日落。我使用LocateMe作为后者,我将其称为do shell script "~...LocateMe"
,然后使用-f
函数获取纬度,经度和海拔高度。由于海拔高度以米为单位,我将其乘以3.28084以获得英尺。
代码的其余部分只使用sunrise equation来计算该时间和位置的日出。我有Satimage.osax来处理trig函数,但由于它以弧度计算,而上述方程由于某种原因使用了degree,我小心地将度数乘以π/ 180并将逆三角公式乘以180 /π
代码输出朱利安日期,应该如此。但它今天输出日出,例如,7月18.914151470176876 2017年 - 就在今晚午夜之前。在坐标误算的几分钟是一回事,但它不能 远离。那么我哪里出错了?
set n to ((current date) - (date "Saturday, January 1, 2000 at 12:00:00 PM")) / days
set n to n div 1
set longitude to do shell script "~/Library/Application\\ Support/LocateMe/LocateMe -f \"{LON}\""
set latitude to do shell script "~/Library/Application\\ Support/LocateMe/LocateMe -f \"{LAT}\""
set altitude to do shell script "~/Library/Application\\ Support/LocateMe/LocateMe -f \"{ALT}\""
set altitude to altitude * 3.28084
set Jstar to (n - (longitude / 360))
set M to ((357.5291 + (0.98560028 * Jstar)) mod 360)
set x to 1.9148 * (sin (M * pi / 180))
set y to 0.02 * (sin (2 * M * pi / 180))
set z to 3.0E-4 * (sin (3 * M * pi / 180))
set C to (x + y + z)
set lambda to ((M + C + 180 * 102.9372) mod 360)
set q to 2.4515455E+6
set r to (0.0053 * (sin (M*pi/180)))
set s to (-0.0069 * (sin (2 * lambda*pi/180)))
set Jtransit to (q + Jstar + r + s)
set d to ((asin (sin (lambda * pi / 180) * (sin (23.44 * pi / 180)))) * 180 / pi)
set numerator to (sin ((-0.83 - (1.15 * (sqrt (altitude))) / 60) * pi / 180) - (sin (latitude * pi / 180) * (sin (d * pi / 180))))
set denominator to (cos (latitude * pi / 180) * (cos (d * pi / 180)))
set HRA to ((acos (numerator / denominator)) * 180 / pi)
set sunrise to (Jtransit - (HRA / 360))
set sunset to (Jtransit + (HRA / 360))
在注意到我在π/ 180's中不那么小心的位置后,该公式现在始终以比应有的大约19小时为单位记录日出和日落。所以,例如,今天早晨的日出是6:30 AM or so。该公式今晚在凌晨1点45分输出。我confirmed所有计算都是正确的;问题是它输出了错误的朱利安日。
编辑:我意识到等式中的n
是今天的日子。我的公式最初包括当天的剩余部分。我添加第2行来说明这一点;它可能有点奇怪,但那是我能想到的最好的。
那就是说,这个公式现在给了日出时间晚上7:30 - 仍然离开,但比以前更近了。