太阳位置的 R 函数给出了意想不到的结果

2024-01-06

我想计算给定时间、纬度和经度的太阳的位置。我在这里找到了这个很棒的问题和答案:一天中给定时间、纬度和经度的太阳位置 https://stackoverflow.com/questions/8708048/position-of-the-sun-given-time-of-day-latitude-and-longitude/8823846#8823846。但是,当我评估该函数时,我得到了错误的结果。鉴于答案的质量,我几乎可以肯定我这边有问题,但我提出这个问题作为尝试解决问题的记录。

为了方便起见,下面重印了该函数的代码:

astronomersAlmanacTime <- function(x)
{
  # Astronomer's almanach time is the number of 
  # days since (noon, 1 January 2000)
  origin <- as.POSIXct("2000-01-01 12:00:00")
  as.numeric(difftime(x, origin, units = "days"))
}

hourOfDay <- function(x)
{
  x <- as.POSIXlt(x)
  with(x, hour + min / 60 + sec / 3600)
}

degreesToRadians <- function(degrees)
{
  degrees * pi / 180
}

radiansToDegrees <- function(radians)
{
  radians * 180 / pi
}

meanLongitudeDegrees <- function(time)
{
  (280.460 + 0.9856474 * time) %% 360
}

meanAnomalyRadians <- function(time)
{
  degreesToRadians((357.528 + 0.9856003 * time) %% 360)
}

eclipticLongitudeRadians <- function(mnlong, mnanom)
{
  degreesToRadians(
      (mnlong + 1.915 * sin(mnanom) + 0.020 * sin(2 * mnanom)) %% 360
  )
}

eclipticObliquityRadians <- function(time)
{
  degreesToRadians(23.439 - 0.0000004 * time)
}

rightAscensionRadians <- function(oblqec, eclong)
{
  num <- cos(oblqec) * sin(eclong)
  den <- cos(eclong)
  ra <- atan(num / den)
  ra[den < 0] <- ra[den < 0] + pi
  ra[den >= 0 & num < 0] <- ra[den >= 0 & num < 0] + 2 * pi 
  ra
}

rightDeclinationRadians <- function(oblqec, eclong)
{
  asin(sin(oblqec) * sin(eclong))
}

greenwichMeanSiderealTimeHours <- function(time, hour)
{
  (6.697375 + 0.0657098242 * time + hour) %% 24
}

localMeanSiderealTimeRadians <- function(gmst, long)
{
  degreesToRadians(15 * ((gmst + long / 15) %% 24))
}

hourAngleRadians <- function(lmst, ra)
{
  ((lmst - ra + pi) %% (2 * pi)) - pi
}

elevationRadians <- function(lat, dec, ha)
{
  asin(sin(dec) * sin(lat) + cos(dec) * cos(lat) * cos(ha))
}

solarAzimuthRadiansJosh <- function(lat, dec, ha, el)
{
  az <- asin(-cos(dec) * sin(ha) / cos(el))
  cosAzPos <- (0 <= sin(dec) - sin(el) * sin(lat))
  sinAzNeg <- (sin(az) < 0)
  az[cosAzPos & sinAzNeg] <- az[cosAzPos & sinAzNeg] + 2 * pi
  az[!cosAzPos] <- pi - az[!cosAzPos]
  az
}

solarAzimuthRadiansCharlie <- function(lat, dec, ha)
{
  zenithAngle <- acos(sin(lat) * sin(dec) + cos(lat) * cos(dec) * cos(ha))
  az <- acos((sin(lat) * cos(zenithAngle) - sin(dec)) / (cos(lat) * sin(zenithAngle)))
  ifelse(ha > 0, az + pi, 3 * pi - az) %% (2 * pi)
}

sunPosition <- function(when = Sys.time(), format, lat = 46.5, long = 6.5) 
{    
  if(is.character(when)) when <- strptime(when, format)
  time <- astronomersAlmanacTime(when)
  hour <- hourOfDay(when)

  # Ecliptic coordinates  
  mnlong <- meanLongitudeDegrees(time)   
  mnanom <- meanAnomalyRadians(time)  
  eclong <- eclipticLongitudeRadians(mnlong, mnanom)     
  oblqec <- eclipticObliquityRadians(time)

  # Celestial coordinates
  ra <- rightAscensionRadians(oblqec, eclong)
  dec <- rightDeclinationRadians(oblqec, eclong)

  # Local coordinates
  gmst <- greenwichMeanSiderealTimeHours(time, hour)  
  lmst <- localMeanSiderealTimeRadians(gmst, long)

  # Hour angle
  ha <- hourAngleRadians(lmst, ra)

  # Latitude to radians
  lat <- degreesToRadians(lat)

  # Azimuth and elevation
  el <- elevationRadians(lat, dec, ha)
  azJ <- solarAzimuthRadiansJosh(lat, dec, ha, el)
  azC <- solarAzimuthRadiansCharlie(lat, dec, ha)

  data.frame(
      elevation = radiansToDegrees(el), 
      azimuthJ  = radiansToDegrees(azJ),
      azimuthC  = radiansToDegrees(azC)
  )
}

如果我运行:

sunPosition(when = Sys.time(),lat = 43, long = -89)

结果是:

  elevation azimuthJ azimuthC
1 -24.56604 55.26111 55.26111

Sys.time() 给出:

> Sys.time()
[1] "2016-09-08 09:09:05 CDT"

现在是上午九点,太阳已经升起。使用http://www.esrl.noaa.gov/gmd/grad/solcalc/ http://www.esrl.noaa.gov/gmd/grad/solcalc/我得到的方位角为 124,仰角为 38,我认为这是正确的。

我认为这可能是代码的问题,但我也从上面的答案中测试了 Josh 的原始 sunPosition 函数并得到了相同的结果。我的下一个想法是我的时间或时区有问题。


按照上述问题测试冬至,仍然给出了他们发现的相同结果并且看起来正确:

testPts <- data.frame(lat = c(-41,-3,3, 41), 
                      long = c(0, 0, 0, 0))

time <- as.POSIXct("2012-12-22 12:00:00")

sunPosition(when = time, lat = testPts$lat, long = testPts$long)

elevation azimuthJ azimuthC
1  72.43112 359.0787 359.0787
2  69.56493 180.7965 180.7965
3  63.56539 180.6247 180.6247
4  25.56642 180.3083 180.3083

当我进行相同的测试,但更改经度(-89)时,我在中午得到负海拔。

testPts <- data.frame(lat = c(-41,-3,3, 41), 
                      long = c(-89, -89, -89, -89))

time <- as.POSIXct("2012-12-22 12:00:00 CDT")

sunPosition(when = time, lat = testPts$lat, long = testPts$long)

      elevation azimuthJ azimuthC
1  16.060136563 107.3420 107.3420
2   2.387033692 113.3522 113.3522
3   0.001378426 113.4671 113.4671
4 -14.190786786 108.8866 108.8866

链接帖子中找到的核心代码没有任何问题if输入when以 UTC 给出。令人困惑的是OP输入了错误Time Zone在网站中Sys.time() of 2016-09-08 09:09:05 CDT:

Using http://www.esrl.noaa.gov/gmd/grad/solcalc/ http://www.esrl.noaa.gov/gmd/grad/solcalc/我得到的方位角为 124,仰角为 38,我认为这是正确的。

正确的Time Zone进入 NOAA 网站的输入是-5 for CDT (看这个网站 https://www.timeanddate.com/time/zones/cdt), 这使:

Calling sunPosition将时间调整为 UTC 会得到类似的结果:

sunPosition(when = "2016-09-08 14:09:05", format="%Y-%m-%d %H:%M:%S",lat = 43, long = -89)
##  elevation azimuthJ azimuthC
##1  28.08683 110.4915 110.4915

现在,代码不会执行到 UTC 的转换。一种方法是将第一行替换为sunPosition:

if(is.character(when)) when <- strptime(when, format)

with

if(is.character(when)) 
  when <- strptime(when, format, tz="UTC")
else
  when <- as.POSIXlt(when, tz="UTC")

我们现在可以打电话sunPosition with:

sunPosition(when = "2016-09-08 09:09:05-0500", format="%Y-%m-%d %H:%M:%S%z",lat = 43, long = -89)
##  elevation azimuthJ azimuthC
##1  28.08683 110.4915 110.4915

得到相同的结果。请注意,我们NEED TO指定字符串文字中与 UTC 的偏移量format (%z) 打电话时sunPosition这边走。

随着这个改变sunPosition可以调用Sys.time()(我在东海岸):

Sys.time()
##[1] "2016-09-08 12:42:08 EDT"
sunPosition(Sys.time(),lat = 43, long = -89)
##  elevation azimuthJ azimuthC
##1  49.24068 152.1195 152.1195

与 NOAA 网站相符

for Time Zone = -4 for EDT.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

太阳位置的 R 函数给出了意想不到的结果 的相关文章

  • 将日期时间字符串转换为 Date 类

    我有一个带有日期时间字符列的数据框 当我使用as Date 除了少数实例之外 我的大多数字符串都被正确解析 下面的示例有望向您展示发生了什么 my attempt to parse the string to Date uses the s
  • 将不同的 grViz 组合成一个图

    我想结合不同的DiagrammeR绘制成一个图形 生成的图如下例所示 library DiagrammeR pDia lt grViz digraph boxes and circles a graph statement graph ov
  • 在函数中使用 quit/q 会导致 RStudio 出现致命错误

    更多的是好奇 但当你使用时q or quit在 R studio 内的函数内部 它会导致致命错误 如下所示 但 rgui 中的相同函数会导致 R 像往常一样停止 并且仅使用q 在 RStudio 中按预期关闭 R 为什么q在函数中导致 RS
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • 为每个因素级别添加日期时间序列

    我有一个带有因子列的数据框 s lt data frame id 901 910 s id lt as factor s id 我有一个日期时间序列 library lubridate start lt now as difftime 2
  • Python 中使用 geoJSON 绘制多边形中的点

    我有一个包含大量多边形 特别是人口普查区 的 geoJSON 数据库 并且有很多长的纬度点 我希望存在一个有效的 Python 代码来识别给定坐标位于哪个人口普查区 但是到目前为止我的谷歌搜索还没有透露任何信息 Thanks 我发现了一个有
  • 改进R中从google获取股票新闻数据的功能

    我已经编写了一个函数来从 Google 获取和解析给定股票代码的新闻数据 但我确信有一些方法可以改进它 对于初学者来说 我的函数返回一个 GMT 时区的对象 而不是用户当前的时区 如果传递的数字大于 299 它就会失败 可能是因为 goog
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • 如何在基数 R 中进行分组

    我想使用以下 SQL 查询来表达base R 没有任何特定的包 select month day count as count avg dep delay as avg delay from flights group by month d
  • 如何在R中匹配具有相同主键的两个表中的数据

    我有两个表 其中包含有关人员的数据 df1 lt data frame id c 113 202 377 288 359 name c Alex Silvia Peter Jack Jonny 这为我提供了 id name 1 113 Al
  • 如何读取 R 中的每个 .csv 文件并将其导出到单个大文件中

    你好 我有以下格式的数据 101 20130826T155649 3 1 round 0 10552 180 yellow 12002 1 round 1 19502 150 yellow 22452 1 round 2 28957 130
  • 根据 row_number() 过滤 data.frame

    更新 自从提出这个问题以来 dplyr 已经更新 现在按照 OP 的要求执行 我正在尝试获取第二行到第七行data frame using dplyr 我正在这样做 require dplyr df lt data frame id 1 1
  • 函数“[<-”将_替换_一个元素,但不会追加_元素_

    我在使用时注意到以下几点 lt 我成功于替换元素但不位于追加向量的一个元素 例子 VarX lt integer VarX 1 lt 11 lt VarX 2 22 VarX 1 11 Expected the value of VarX
  • 按组计算连续行中的值之间的差异

    这是我的一个df 数据框 group value 1 10 1 20 1 25 2 5 2 10 2 15 我需要按组计算连续行中的值之间的差异 所以 我需要一个结果 group value diff 1 10 NA because the
  • R data.table fwrite 到 fread 空间分隔符并清空

    我在使用 fread 以 作为分隔符和散布的空白值时遇到问题 例如 这个 dt lt data table 1 5 1 5 1 5 make a simple table dt 3 V2 NA add a blank in the midd
  • R data.table 1.9.2 关于 setkey 的问题

    这似乎是 1 8 10 后引入的一个错误 与包含列表的 DT 的 setkey 相关 运行下面两个代码来查看问题 library data table dtl lt list dtl 1 lt data table scenario 1 p
  • 使用 ggplot 构面时增加闪亮的绘图大小

    有没有办法增加绘图窗口的大小shiny取决于在一个中使用的面的数量ggplot图 也许使用垂直滚动 例如 使用下面的示例 当输入为 A 有三个方面 情节看起来不错 当选项 B 选择绘图数量会增加 但绘图窗口保持相同大小 导致绘图太小 是否有
  • 排序因素与水平

    有人能解释一下 R 中 ordered 参数的用途吗 R says ordered逻辑标志来确定级别是否应被视为有序 按给定的顺序 所以如果我有一个名为名称的因素并设置ordered TRUE names lt factor c fred
  • 如何自动启动我的 ec2 实例、运行命令然后将其关闭?

    我想每周对 redshift postgres 数据库中的数据运行一次机器学习模型 我使用以下命令将 R 脚本设置为休息 apiplumbr然后我将其设置为一项任务来管理pm2 我有它 所以任务会在ec2实例启动然后继续运行 要让 R 脚本
  • 无法部署 ShinyApp:readTableHeader 在“raw”上发现不完整的最后一行(使用默认值:en_US)

    我已经拼命尝试部署我的闪亮应用程序大约一周了 但不幸的是我无法停止收到以下消息 Warning message Error detecting locale Error in read table file file header head

随机推荐

  • 如何将 SB3 文件转换为 EXE

    我正在 Scratch 3 上创建一个游戏 但是 当我完成它时 我想将其转换为 exe 文件 我该怎么做呢 我长期以来对游戏开发很感兴趣 甚至以前尝试过Unity 但我只是一个初学者 这对我来说太难了 所以我转向了 Scratch 对的 这
  • 添加到 UISearchDisplayController 时 UISearchBar 被剪裁在状态栏下方

    我希望我的搜索栏将其背景绘制在状态栏下方向上延伸 如下所示 这是上图对应的代码 void viewDidLoad super viewDidLoad self searchBar UISearchBar alloc init self se
  • Meteor 模板助手条件一致返回 false

    我对 Meteor 很陌生 但到目前为止我真的很喜欢在这个平台上编码 我遇到了一些障碍 似乎找不到正确的方法 我想创建一个辅助函数来检查纬度和经度 并根据某个预定义的范围进行检查 如果它落在这些范围之间 则返回 true 我已经包含了我当前
  • close() 没有正确关闭套接字

    我有一台多线程服务器 线程池 它使用 20 个线程处理大量请求 一个节点高达 500 秒 有一个侦听器线程接受传入连接并将它们排队以供处理程序线程处理 一旦响应准备好 线程就会向客户端写入并关闭套接字 一切似乎都很好 直到最近 一个测试客户
  • 如何将两个过程组合在一起来填充一个表,而不是两个过程中的每一个过程填充它自己的表?

    我使用 Sequel Pro 创建了两个表 每个表都在 MySQL 中填充了不同的过程 虽然每个表在运行相应的过程后都包含正确的信息 但我认为如果我更多地合并一些表 我的数据将不再那么分散 因此 我想做的是将两个表中的数据合并为一个 下面是
  • SQLite CURRENT_TIMESTAMP 总是 1970-01-01

    我有以下定义一个表 CREATE TABLE players playerid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL name VARCHAR 20 NOT NULL UNIQUE added
  • 从chrome发送udp数据包

    网上查资料 如何将udp发送到udp node js服务器 https stackoverflow com questions 7451522 how to send udp to udp node js server JavaScript
  • 如何在 Edmx Designer 中对多对多关系启用级联删除

    我使用 VS2012 和实体设计器来生成数据库和模型 我有一个非常基本的场景 即 Table1 到 Table1 和 2JoinTable 到 Table2 比如学生 班级 学生班级 您可以在多个班级中拥有多个学生 我想要级联删除 因此 如
  • wix - 安装前删除旧程序文件夹

    我需要安装程序在安装程序开始复制新文件之前删除旧的安装目录 如果存在 该文件夹包含程序使用过程中生成的一些文件和子文件夹 它们不包含在安装程序中 因此 我创建了自定义操作来执行此操作 所以 一些代码 首先 自定义操作代码 没什么特别的 Cu
  • Java 运行时环境检测到致命错误:SIGSEGV (0xb) at pc=0x00002b2f7e9b2744, pid=28778, tid=1138739520

    我在执行程序时收到以下错误 而这种情况并不总是发生 代码中包含一些复杂的计算 数据量很大 有人可以帮助识别错误吗 A fatal error has been detected by the Java Runtime Environment
  • fmod 不正确吗? [复制]

    这个问题在这里已经有答案了 给定以下双打 是否fmod返回正确的值 double x 090 double y 003 double r fmod x y r 0 0029999999999999949 为什么r不 0 因为 像大多数十进制
  • 如何在 django 管理站点上授予用户权限

    我正在尝试授予用户对管理站点的有限访问权限 我以超级用户身份登录 并授予用户员工身份和模型权限 可以添加 可以更改 和 可以删除 问题是用户可以登录该网站 但看到以下消息 如果我给他超级用户身份 他可以编辑任何内容 但我想给他有限的访问权限
  • 如何安全地使用 UniqueEntity(在具有多个同时用户的网站上)

    聪明的人可以分享他们用来避免 Doctrine Symfony 中这种基本且常见的并发问题的设计模式吗 设想 每个用户必须有一个唯一的用户名 失败解决方案 Add a 独特的实体 https symfony com doc 3 1 refe
  • 在 Java 中以编程方式设置 Linux 环境变量

    我可以通过以下方式运行 Linux 命令RunTime班级 有没有办法以编程方式从 Java 设置 Linux 全局环境 我想通过 Java 模拟以下 Linux 命令语句 root machine tmp export TEST v2 我
  • linux + 验证文件是文本还是二进制

    如何在不打开文件的情况下验证文件是二进制文件还是文本文件 恐怕是薛定谔的猫 在不打开文件的情况下无法确定文件的内容 文件系统不存储与内容相关的元数据 如果不打开文件不是硬性要求 那么有许多解决方案可供您使用 Edit 许多评论和答案都建议f
  • Vue 关闭组件返回避免直接改变 prop

    我有一个想要在不同页面上使用的组件 嗯 在第一次切换之前它运行良好 它显示得像以前一样 但是当我单击 关闭 按钮时 它会关闭 但控制台输出 Vue warn 避免直接改变 prop 因为该值将是 每当父组件重新渲染时都会被覆盖 相反 使用
  • 用于分析进程中加载​​的本机 DLL 和程序集的内存占用的工具?

    根据任务管理器 我有一个进程持有 130MB 内存 根据任务管理器 只有 11MB 的活动 NET 对象dotTrace http www jetbrains com profiler 所以我想知道另外 120MB 发生了什么 我需要一个工
  • 在 R 中合并 2 个具有相同但不同 case 列的数据框

    我有两个数据框 但问题是合并 by 列在不同情况下具有值 sn1capx1e0001 与 SN1CAPX1E0001 authors lt data frame surname I c Tukey Venables Tierney Ripl
  • 理解大 O 表示法 - 破解编码面试示例 9

    我被这两个代码困住了 Code 1 int f int n if n lt 1 return 1 return f n 1 f n 1 Code 2 平衡二叉搜索树 int sum Node node if node null return
  • 太阳位置的 R 函数给出了意想不到的结果

    我想计算给定时间 纬度和经度的太阳的位置 我在这里找到了这个很棒的问题和答案 一天中给定时间 纬度和经度的太阳位置 https stackoverflow com questions 8708048 position of the sun