用于计算太阳和月亮位置的 Swift 包
SunCalc 是一个 Swift 包,用于计算给定位置和时间的太阳位置、日光阶段(日出、日落、黄昏等的时间)、月亮位置和月相。
大多数计算基于 Astronomy Answers 网站上关于太阳位置和行星位置的优秀文章中给出的公式。 您可以在 维基百科上的暮光文章中阅读有关 SunCalc 计算的不同暮光阶段的信息。
// get today's sunlight times for London
let date = Date()
let sunCalc = SunCalc.getTimes(date: date, latitude: 51.5, longitude: -0.1)
if let sunrise = sunCalc.sunrise {
debugPrint("sunrise: \(sunrise.formatted())")
}
if let sunset = sunCalc.sunset {
debugPrint("sunset: \(sunset.formatted())")
}
let sunPos = SunCalc.getSunPosition(timeAndDate: date, latitude: 51.5, longitude: -0.1)
let sunriseAzimuth = sunPos.azimuth * 180 / Constants.PI()
debugPrint("sunriseAzimuth: \(sunriseAzimuth)")
SunCalc.getTimes(/*Date*/ date, /*Number*/ latitude, /*Number*/ longitude, /*Number (default=0)*/ height)
返回一个具有以下属性的对象(每个属性都是一个 Date
对象)
属性 | 描述 |
---|---|
sunrise |
日出(太阳的上边缘出现在地平线上) |
sunriseEnd |
日出结束(太阳的下边缘接触地平线) |
goldenHourEnd |
早晨黄金时段(柔和的光线,摄影的最佳时间)结束 |
solarNoon |
太阳正午(太阳处于最高位置) |
goldenHour |
傍晚黄金时段开始 |
sunsetStart |
日落开始(太阳的下边缘接触地平线) |
sunset |
日落(太阳消失在地平线下,傍晚民用暮光开始) |
dusk |
黄昏(傍晚航海暮光开始) |
nauticalDusk |
航海黄昏(傍晚天文暮光开始) |
night |
夜晚开始(足够黑暗,可以进行天文观测) |
nadir |
天底(夜晚最黑暗的时刻,太阳处于最低位置) |
nightEnd |
夜晚结束(早晨天文暮光开始) |
nauticalDawn |
航海黎明(早晨航海暮光开始) |
dawn |
黎明(早晨航海暮光结束,早晨民用暮光开始) |
SunCalc.addTime(/*Number*/ angleInDegrees, /*String*/ morningName, /*String*/ eveningName)
当太阳达到给定角度时,向 SunCalc.getTimes
返回的结果添加自定义时间。
SunCalc.times
属性包含所有当前定义的时间。
SunCalc.getPosition(/*Date*/ timeAndDate, /*Number*/ latitude, /*Number*/ longitude)
返回一个具有以下属性的对象
altitude
: 太阳在地平线以上的仰角,以弧度表示,例如在地平线上为 0
,在天顶(正上方)为 PI/2
azimuth
: 太阳方位角,以弧度表示(沿地平线的方向,从南向西测量),例如 0
是南方,Math.PI * 3/4
是西北方SunCalc.getMoonPosition(/*Date*/ timeAndDate, /*Number*/ latitude, /*Number*/ longitude)
返回一个具有以下属性的对象
altitude
: 月亮在地平线以上的仰角,以弧度表示azimuth
: 月亮方位角,以弧度表示distance
: 到月亮的距离,以千米为单位parallacticAngle
: 月亮的视差角,以弧度表示SunCalc.getMoonIllumination(/*Date*/ timeAndDate)
返回一个具有以下属性的对象
fraction
: 月亮的照明部分;从 0.0
(新月)到 1.0
(满月)不等phase
: 月相;从 0.0
到 1.0
不等,如下所述angle
: 从圆盘的北点向东测量的月球照明边缘的中点角度,以弧度表示;如果角度为负,则月亮是盈凸月,如果角度为正,则月亮是亏凸月月相值应这样解释
相位 | 名称 |
---|---|
0 | 新月 |
眉月 | |
0.25 | 上弦月 |
盈凸月 | |
0.5 | 满月 |
亏凸月 | |
0.75 | 下弦月 |
残月 |
通过从 angle
中减去 parallacticAngle
,可以获得月亮亮边缘的天顶角(逆时针方向)。天顶角可用于从观察者的角度绘制月亮形状(例如,月亮仰卧)。
SunCalc.getMoonTimes(/*Date*/ date, /*Number*/ latitude, /*Number*/ longitude[, inUTC])
返回一个具有以下属性的对象
rise
: 月出时间,以 Date
形式表示set
: 月落时间,以 Date
形式表示alwaysUp
: 如果月亮永不升起/落下,并且白天总是在地平线上方,则为 true
alwaysDown
: 如果月亮总是在地平线下,则为 true
默认情况下,它将在本地用户的白天(从 0 到 24 小时)搜索月出和月落。 如果将 inUTC
设置为 true,它将改为从 0 到 24 UTC 小时搜索指定的日期。
本项目基于 Shaun Meredith 编写的源代码 https://github.com/shanus/suncalc-swift,该代码基于 Vladimir Agafonkin ("mourner") 的原始 Javascript suncalc,可在 https://github.com/mourner/suncalc 获得