给出对应当前日期和地理位置的太阳位置.
SunPosition[datespec]
给出指定日期的太阳位置.
SunPosition[locationspec]
给出指定地理位置的太阳位置.
SunPosition[locationspec,datespec]
给出指定日期和地理位置的太阳位置.
SunPosition[{{location1,date1},{location2,date2},…}]
给出在指定日期所有指定地理位置的太阳位置.
SunPosition[locationspec,datespec,func]
使用 func 决定对扩展的地理位置应该返回的内容.
SunPosition
给出对应当前日期和地理位置的太阳位置.
SunPosition[datespec]
给出指定日期的太阳位置.
SunPosition[locationspec]
给出指定地理位置的太阳位置.
SunPosition[locationspec,datespec]
给出指定日期和地理位置的太阳位置.
SunPosition[{{location1,date1},{location2,date2},…}]
给出在指定日期所有指定地理位置的太阳位置.
SunPosition[locationspec,datespec,func]
使用 func 决定对扩展的地理位置应该返回的内容.
更多信息和选项
- SunPosition 返回在地球上任何位置任何日期观察到的太阳在天体上的坐标.
- 结果的默认格式为 {azimuth,altitude}.
- 观测位置可以是太阳系中物体表面的任何一点,定义当地的地平线.
- 位置可以指定为 Entity 对象,假设它们表示具有地理坐标的对象,或者可以是纬度/经度对,假设以度数为单位.
- SunPosition[] 利用 $GeoLocation 和 $TimeZone 决定你所在的地理位置和时区.
- datespec 可以是 DateObject 表达式、TimeObject 表达式、日期字符串或 {y,m,d,h,m,s} 日期列表.
- datespec 假定在 $TimeZone 中,除非其为具有明确 TimeZone 选项值的 DateObject 或 TimeObject 表达式.
- locationspec 和 datespec 可以为单独的项或它们的列表.
- 如果 datespec 是一个日期的列表,那么结果将会包含 TimeSeries 对象.
- 针对与 DateRange 规范的兼容性,datespec 可以被指定为 {start,end,increment} .
- 当地理位置被指定时,SunPosition[…,func] 被用来指定输出格式.
- func 的可能设置包括:
-
Automatic 只对扩展的地理位置返回间隔 Interval 对所有指定地理位置返回间隔 Mean 对扩展的地理位置返回平均值 Min 对扩展的地理位置返回最小值 Max 对扩展的地理位置返回最大值 StandardDeviation 对扩展的地理位置返回标准差 - SunPosition[CelestialSystem->"Equatorial"] 给出太阳的赤经和赤纬.
- SunPosition 可以接受以下选项:
-
AltitudeMethod "ApparentAltitude" 是否在计算高度角时考虑大气折射的因素 CelestialSystem "Horizon" 是返回高度角/方位角,还是返回赤经/赤纬 - CelestialSystem 的可能设置包括:
-
"Horizon" 将结果作为方位角/高度 (az/alt) 值返回 "Equatorial" 以一对赤经/赤纬 (
/
) 值的形式返回结果 - AltitudeMethod 的可能设置包括:
-
"ApparentAltitude" 高度角计算考虑大气折射的因素 "TrueAltitude" 高度角计算假设没有大气折射
范例
打开所有单元 关闭所有单元基本范例 (5)
SunPosition[]SunPosition[DateObject[{2023, 3, 20, 11, 0}, TimeZone -> -6]]SunPosition[["Chicago"]]SunPosition[GeoPosition[{50.3, -80.1}], DateObject[{2023, 10, 1, 11, 0}, "Minute", "Gregorian", -6.]]SunPosition[["Saint Louis"], DateObject[{2023, 10, 1, 11, 0}, "Minute", "Gregorian", -6.]]范围 (10)
日期 (3)
日期可以被指定为 DateObject:
SunPosition[DateObject[{2013, 9, 23, 15, 0}, TimeZone -> -6]]SunPosition["September 23, 2010 3:00PM CST"]SunPosition[DateRange[DateObject[{2013, 1, 1, 9, 0}, "Minute", "Gregorian", -6.], DateObject[{2013, 12, 31, 9, 0}, "Minute", "Gregorian", -6.], 10]]位置 (7)
SunPosition[GeoPosition[{40.1, -88.2}]]SunPosition[["St. Louis"]]SunPosition[["France"]]SunPosition[["France"], Mean]SunPosition[Entity["SolarSystemFeature", "OlympusMonsMars"]]SunPosition[{["Chicago"], ["St. Louis"]}]SunPosition[{{Entity["City", {"Chicago", "Illinois", "UnitedStates"}], DateObject[{2025, 1, 1, 12}, TimeZone -> "America/Chicago"]}, {Entity["City", {"Moscow", "Moscow", "Russia"}], DateObject[{2023, 7, 28, 6}, TimeZone -> "Europe/Moscow"]}}]选项 (2)
CelestialSystem (1)
AltitudeMethod (1)
有模拟大气折射的 AltitudeMethod 默认设置:
SunPosition[["Champaign"], DateObject[{2022, 9, 4, 19, 5}, TimeZone -> -5]]SunPosition[["Champaign"], DateObject[{2022, 9, 4, 19, 5}, TimeZone -> -5], AltitudeMethod -> "TrueAltitude"]应用 (2)
通过找出太阳在正午的赤经与在正午的恒星时的差别,绘制均时差:
sunpos = SunPosition[GeoPosition[{0, 0}], DateRange[DateObject[{2022, 1, 1, 12, 0}, "Minute", "Gregorian", 0.], DateObject[{2022, 12, 31, 12, 0}, "Minute", "Gregorian", 0.], 10], CelestialSystem -> "Equatorial"];stime = SiderealTime[GeoPosition[{0, 0}], DateRange[DateObject[{2022, 1, 1, 12, 0}, "Minute", "Gregorian", 0.], DateObject[{2022, 12, 31, 12, 0}, "Minute", "Gregorian", 0.], 10]];equationoftime = TimeSeriesThread[With[{diff = First[#][[1]] - Last[#]},
UnitConvert[Mod[diff, Quantity[24, "HoursOfRightAscension"], Quantity[-12, "HoursOfRightAscension"]], "MinutesOfRightAscension"]]&, {sunpos, stime}];DateListPlot[equationoftime, FrameLabel -> Automatic]若你以恒速从日出到日落向着太阳方向步行,决定你最后的地理位置:
location = EntityValue[["White House"], "Position"];
speed = Quantity[4, "Miles" / "Hours"];
deltaT = Quantity[10, "Minutes"];
start = Sunrise[location, DateObject[{2022, 7, 4}, TimeZone -> -5]];
end = Sunset[location, DateObject[{2022, 7, 4}, TimeZone -> -5]];locs = Table[location = GeoDestination[location, {speed deltaT, SunPosition[location, DateObject[time]][[1]]}], {time, AbsoluteTime[start], AbsoluteTime[end], QuantityMagnitude[UnitConvert[Quantity[10, "Minutes"], "Seconds"]]}];GeoGraphics[{Line[locs]}]GeoDistance[locs[[-1]], locs[[1]]]属性和关系 (11)
默认情况下,地理位置由 $GeoLocation 指定并且日期由当前日期指定:
SunPosition[]SunPosition[$GeoLocation, DateObject[]]当指定一个日期范围时,结果以 TimeSeries 的形式呈现:
SunPosition[DateRange[DateObject[{2013, 1, 1, 9, 0}, TimeZone -> -6], DateObject[{2013, 12, 31, 9, 0}, TimeZone -> -6], 10]]对每一个日期规范,结果为多值,因此用 DateListPlot 绘制结果将得到两条曲线,一条对应方位角,另一条对应高度角:
DateListPlot[SunPosition[DateRange[DateObject[{2013, 1, 1, 8, 0}, TimeZone -> -6], DateObject[{2013, 1, 1, 16, 0}, TimeZone -> -6], {.5, "Hour"}]], Joined -> True]loc = GeoPosition[{40.11, -88.22}];
date = DateObject[{2023, 7, 16, 12, 36, 0}];SunPosition[loc, date]UnitConvert[%, MixedUnit["ArcDMS"]]这也可以用 AstroPosition 计算:
AstroPosition[Entity["Star", "Sun"], {"Horizon", loc, date}]sunrise = Sunrise[]SunPosition[sunrise]AstroPosition["Sun", {"Horizon", sunrise}]["Altitude"]消除大气折射效应,日出时太阳的真实位置在地平线以下更远的地方:
AstroPosition["Sun", {"Horizon", sunrise, "Refraction" -> None}]["Altitude"]Graphics[{Red, Point@Map[QuantityMagnitude, SunPosition[DateRange[DateObject[{2023, 1, 1, 9, 0}, "Minute", "Gregorian", -6.], DateObject[{2023, 12, 31, 9, 0}, "Minute", "Gregorian", -6.], 10]]["Values"], {2}]}, Frame -> True]绘制你所在位置的从日出到日落的太阳位置(对至点和昼夜平分点):
summersolstice = DateObject[{2013, 6, 21}, "Day", "Gregorian", -6.];
autumnalequinox = DateObject[{2013, 9, 22}, "Day", "Gregorian", -6.];
wintersolstice = DateObject[{2013, 12, 21}, "Day", "Gregorian", -6.];coordsToCartesian = Evaluate[CoordinateTransformData["Spherical" -> "Cartesian", "Mapping", {1, π / 2 - (#2 Degree), 2Pi - (#1 Degree)}]]&;getValues = Function[{series}, Map[QuantityMagnitude, series["Values"], {2}]];getSunriseToSunset = DateRange[Sunrise[#], Sunset[#], {30, "Minute"}]&;
Graphics3D[{
Orange, Table[Text[{"W", "S", "E", "N"}[[j]], 1.1{Cos[Pi / 2 j], Sin[Pi / 2 j], 0}], {j, 4}],
Thickness[.007], Transpose[{Darker /@ {Red, Green, Blue},
(Line@(coordsToCartesian@@@(getValues@SunPosition[getSunriseToSunset[#]])))& /@ {summersolstice, autumnalequinox, wintersolstice}}], White, Cylinder[{{0, 0, -.005}, {0, 0, 0}}], Opacity[.1], Sphere[]}, PlotRange -> {0, 1}, Boxed -> False]horizonCoordinatesToLightingAngle[{azimuth_, altitude_}] := {(2 π - QuantityMagnitude[UnitConvert[azimuth, "Radians"]] + π / 2), QuantityMagnitude[UnitConvert[altitude, "Radians"]]};
GeoGraphics[{GeoStyling["ReliefMap", LightingAngle -> horizonCoordinatesToLightingAngle[SunPosition[["Rome"], Sunrise[["Rome"], TimeZone -> LocalTimeZone[["Rome"]]]]]], Polygon[["Italy"]]}]SphereDistance[{ϕ1_, θ1_}, {ϕ2_, θ2_}] := InverseHaversine[Haversine[ϕ1 - ϕ2] + Cos[ϕ1] Cos[ϕ2] Haversine[θ1 - θ2]]sunposequatorial = SunPosition[DateRange[DateObject[{2014, 1, 1, 0, 0, 0}, "Instant", "Gregorian", -6.], DateObject[{2014, 2, 1, 0, 0, 0}, "Instant", "Gregorian", -6.], {1, "Day"}], CelestialSystem -> "Equatorial"];moonposequatorial = MoonPosition[DateRange[DateObject[{2014, 1, 1, 0, 0, 0}, "Instant", "Gregorian", -6.], DateObject[{2014, 2, 1, 0, 0, 0}, "Instant", "Gregorian", -6.], {1, "Day"}], CelestialSystem -> "Equatorial"];angdistequatorial = TimeSeriesThread[Quantity[SphereDistance[First[#], Last[#]] / Degree, "AngularDegrees"]&, {sunposequatorial, moonposequatorial}];DateListPlot[angdistequatorial]EquatorialtoCartesian[ ra_, dec_] := Module[ {x, y, z},
x = Cos[15 ra Degree] Sin[π / 2 - dec Degree];
y = Sin[15ra Degree] Sin[π / 2 - dec Degree];
z = Cos[π / 2 - dec Degree];
{x, y, z} ]Show[ParametricPlot3D[{Cos[t] Sin[p], Sin[t] Sin[p], Cos[p]}, {t, 0, 2 Pi}, {p, 0, Pi}, PlotStyle -> Opacity[.3]], Graphics3D[{Yellow, PointSize[.05], Point[EquatorialtoCartesian@@N@QuantityMagnitude@SunPosition[DateObject[{2017, 8, 20, 9, 0, 0}, "Instant", "Gregorian", -6.], CelestialSystem -> "Equatorial"]], Blue, Point[EquatorialtoCartesian@@N@QuantityMagnitude@MoonPosition[DateObject[{2017, 8, 20, 9, 0, 0}, "Instant", "Gregorian", -6.], CelestialSystem -> "Equatorial"]]}], SphericalRegion -> True]varylatitude = Transpose[{Table[lat, {lat, -90, 90}], SunPosition[Table[GeoPosition[{lat, -88.2}], {lat, -90, 90}], DateObject[{2014, 2, 26, 12, 0, 0}, "Instant", "Gregorian", -6.]]}];varylongitude = Transpose[{Table[long, {long, -180, 180, 2}], SunPosition[Table[GeoPosition[{40.1, long}], {long, -180, 180, 2}], DateObject[{2014, 2, 26, 12, 0, 0}, "Instant", "Gregorian", -6.]]}];Grid[{
{
ListPlot[{#[[1]], #[[2, 2]]}& /@ varylatitude, Frame -> True, FrameLabel -> {"latitude", "altitude"}, Joined -> True], ListPlot[{#[[1]], #[[2, 1]]}& /@ varylatitude, Frame -> True, FrameLabel -> {"latitude", "azimuth"}, Joined -> True]},
{
ListPlot[{#[[1]], #[[2, 2]]}& /@ varylongitude, Frame -> True, FrameLabel -> {"longitude", "altitude"}, Joined -> True], ListPlot[{#[[1]], #[[2, 1]]}& /@ varylongitude, Frame -> True, FrameLabel -> {"longitude", "azimuth"}, Joined -> True]}
}]可能存在的问题 (2)
如果用 SunPosition[locationspec,Interval],具体地理位置的结果被强制转成区间:
SunPosition[GeoPosition[{40.1, -88.2}], Interval]尝试使用 "Minute" 粒度或更大粒度绘制 SunPosition 的结果可能会导致伪像:
Plot[SunPosition[Entity["City", {"Champaign", "Illinois", "UnitedStates"}], DatePlus[DateObject[{2023, 4, 14, 10, 29}, "Minute", TimeZone -> -5], {x, "Hour"}]][[2]], {x, 0.1, 1}]此类问题的一种解决方法是强制输入日期,使其具有 "Instant" 粒度:
Plot[SunPosition[Entity["City", {"Champaign", "Illinois", "UnitedStates"}], DatePlus[DateObject[DateObject[{2023, 4, 14, 10, 29}, "Minute", TimeZone -> -5], "Instant"], {x, "Hour"}]][[2]], {x, 0.1, 1}]巧妙范例 (1)
loc = GeoPosition[{40.1, -88.2}];
date = DateObject[{2022, 7, 5, 16, 0, 0}, TimeZone -> -6];sidtime = SiderealTime[loc, date]sunRA = First[SunPosition[date, CelestialSystem -> "Equatorial"]];
moonRA = First[MoonPosition[date, CelestialSystem -> "Equatorial"]];
planetsRA = EntityValue[{Entity["Planet", "Mercury"], Entity["Planet", "Venus"], Entity["Planet", "Mars"], Entity["Planet", "Jupiter"], Entity["Planet", "Saturn"], Entity["Planet", "Uranus"], Entity["Planet", "Neptune"]}, EntityProperty["Planet", "RightAscension", {"Date" -> date}]];
ascensions = Join[{sunRA, moonRA}, planetsRA]symbols = {"☼", "☾", "☿", "♀", "♂", "♃", "♄", "♅", "♆"};
colors = {Yellow, White, Orange, Lighter[Blue], Red, Lighter[Purple], Orange, Cyan, Lighter[Blue]};
labels = MapThread[Text[Style[#1, #2, 17], {0, 3.4}.RotationMatrix[#3]]&, {symbols, colors, ascensions}];GeoGraphics[{
labels,
Thick, Black, Arrow[{{0, 0}, Here}],
GeoStyling[Opacity[.5]], NightHemisphere[date],
Thickness[.005], Opacity[.5], Line[Pi{{{-1, 0}, {1, 0}}, {{0, -1}, {0, 1}}}]
},
GeoRange -> "World", GeoProjection -> {"AzimuthalEquidistant", "Centering" -> {-90, Longitude[loc] - sidtime}}, GeoBackground -> GeoStyling["ReliefMap"],
Background -> Black, PlotRange -> 4,
PlotLabel -> sidtime, LabelStyle -> White
]文本
Wolfram Research (2014),SunPosition,Wolfram 语言函数,https://reference.wolfram.com/language/ref/SunPosition.html (更新于 2023 年).
CMS
Wolfram 语言. 2014. "SunPosition." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2023. https://reference.wolfram.com/language/ref/SunPosition.html.
APA
Wolfram 语言. (2014). SunPosition. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/SunPosition.html 年
BibTeX
@misc{reference.wolfram_2026_sunposition, author="Wolfram Research", title="{SunPosition}", year="2023", howpublished="\url{https://reference.wolfram.com/language/ref/SunPosition.html}", note=[Accessed: 03-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_sunposition, organization={Wolfram Research}, title={SunPosition}, year={2023}, url={https://reference.wolfram.com/language/ref/SunPosition.html}, note=[Accessed: 03-November-2026]}