65.9K
CodeProject 正在变化。 阅读更多。
Home

太阳计算器 - 计算日出、日落和最大太阳辐射

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (33投票s)

2010年5月4日

CPOL

2分钟阅读

viewsIcon

149429

downloadIcon

4427

一个用于计算日出、日落和最大太阳辐射的 C# 程序集

LetsGrow_Weather_WordPress_PlugIn.png

引言

我一直在寻找一个 .NET 库来计算太阳升起和落下的时间。有一些库可用,包括 Code Project 上的,但它们存在一些问题。尝试了一些后,我决定自己创建一个。我需要日出、日落和最大太阳辐射来用于我博客上的 WordPress 插件。该插件显示了荷兰的地图以及当前的天气状况。这篇文章的顶部显示了该插件的屏幕截图。该地图显示了实时温度,包括一个图标。该图标是将测量的太阳辐射与最大太阳辐射进行转换的结果。

背景

可以使用一些已知的算法来计算日出、日落和最大太阳辐射。对于那些对这些算法感兴趣的人,请查看维基百科上的以下页面:太阳的赤纬日出日落。如果您只想计算日出、日落和最大太阳辐射,请查看下面关于如何使用代码的信息。

Using the Code

代码被打包在 Visual Studio 2008 解决方案中。它包含两个程序集:AstronomyAstronomyTest。 程序集 Astronomy 包含执行实际计算的 SunCalculator 类。 程序集 AstronomyTest 包含几个单元测试,用于针对外部来源验证计算。

SunCalculator 是一个不依赖于外部类的单类。 虽然这在某种程度上违背了单一职责原则,但它使这个类的重用更容易。 SunCalculator 类需要您所在位置的经度、纬度和时区。 您还应该指示是否使用夏令时。 可以像这样创建 SolarCalculator 的实例

const Double Longitute = 5.127869;
const Double Latitude = 52.108192;
const int LongituteTimeZone = 15;
const bool UseSummerTime = true;
     
SunCalculator sunCalculator = new SunCalculator(Longitute, Latitude, 
              LongituteTimeZone, UseSummerTime);

您必须提供要计算日出和日落时间的地点经度和纬度。 这些是构造函数的前两个参数。 对于使用夏令时的地点,您应该将 UseSummerTime 设置为实际的夏令时状态。 对于不使用夏令时的地点,将其设置为 false

下面可以看到日出、日落和最大太阳辐射的实际计算

DateTime sunRise = sunCalculator.CalculateSunRise(new DateTime(2010, 4, 1));
DateTime sunSet = sunCalculator.CalculateSunSet(new DateTime(2010, 4, 1));
Double maximumSolarRadiation = 
  sunCalculator.CalculateMaximumSolarRadiation(new DateTime(2010, 1, 26, 16, 30, 0));

CalculateSunRiseCalculateSunSet 返回的 DateTime 包括日出和日落时间。 有关更多信息,请查看程序集 AstronomyTest 中的单元测试。

关注点

该代码首先计算太阳的赤纬、太阳位置的余弦、太阳位置的正弦以及太阳时和实际时间之间的差异。 所有这些参数都用于计算日出和日落时间。

如果您想实时查看该插件,请访问我的博客 www.semanticarchitecture.net。 在地图上检索和显示的数据来自 LetsGrow.com,我所在的公司。

历史

  • v1.0 02/04/2010:初始版本和第一个版本
  • v1.1 28/05/2010:为洛杉矶添加了一个测试用例,以及一个演示源代码中库的控制台应用程序
  • v1.2 08/11/2011:修复了失败的测试
© . All rights reserved.