Position of the sun given time of day, latitude and longitude

前端 未结 6 1139
误落风尘
误落风尘 2020-11-28 02:24

This question has been asked before a little over three years ago. There was an answer given, however I\'ve found a glitch in the solution.

Code below is in R. I\'ve

6条回答
  •  独厮守ぢ
    2020-11-28 02:38

    Using "NOAA Solar Calculations" from one of the links above I have changed a bit the final part of the function by using a slighly different algorithm that, I hope, have translated without errors. I have commented out the now-useless code and added the new algorithm just after the latitude to radians conversion:

    # -----------------------------------------------
    # New code
    # Solar zenith angle
    zenithAngle <- acos(sin(lat) * sin(dec) + cos(lat) * cos(dec) * cos(ha))
    # Solar azimuth
    az <- acos(((sin(lat) * cos(zenithAngle)) - sin(dec)) / (cos(lat) * sin(zenithAngle)))
    rm(zenithAngle)
    # -----------------------------------------------
    
    # Azimuth and elevation
    el <- asin(sin(dec) * sin(lat) + cos(dec) * cos(lat) * cos(ha))
    #az <- asin(-cos(dec) * sin(ha) / cos(el))
    #elc <- asin(sin(dec) / sin(lat))
    #az[el >= elc] <- pi - az[el >= elc]
    #az[el <= elc & ha > 0] <- az[el <= elc & ha > 0] + twopi
    
    el <- el / deg2rad
    az <- az / deg2rad
    lat <- lat / deg2rad
    
    # -----------------------------------------------
    # New code
    if (ha > 0) az <- az + 180 else az <- 540 - az
    az <- az %% 360
    # -----------------------------------------------
    
    return(list(elevation=el, azimuth=az))
    

    To verify azimuth trend in the four cases you mentioned let's plot it against time of day:

    hour <- seq(from = 0, to = 23, by = 0.5)
    azimuth <- data.frame(hour = hour)
    az41S <- apply(azimuth, 1, function(x) sunPosition(2012,12,22,x,0,0,-41,0)$azimuth)
    az03S <- apply(azimuth, 1, function(x) sunPosition(2012,12,22,x,0,0,-03,0)$azimuth)
    az03N <- apply(azimuth, 1, function(x) sunPosition(2012,12,22,x,0,0,03,0)$azimuth)
    az41N <- apply(azimuth, 1, function(x) sunPosition(2012,12,22,x,0,0,41,0)$azimuth)
    azimuth <- cbind(azimuth, az41S, az03S, az41N, az03N)
    rm(az41S, az03S, az41N, az03N)
    library(ggplot2)
    azimuth.plot <- melt(data = azimuth, id.vars = "hour")
    ggplot(aes(x = hour, y = value, color = variable), data = azimuth.plot) + 
        geom_line(size = 2) + 
        geom_vline(xintercept = 12) + 
        facet_wrap(~ variable)
    

    Image attached:

    enter image description here

提交回复
热议问题