Карта мира, показывающая дневные и ночные регионы

Я пытаюсь добавить дневную / ночную линию на карту мира, используя ggplot для обозначения дневных и ночных регионов; что-то вроде этого:

daynightexample

План состоит в том, чтобы оживить мою карту за 24-часовой цикл следующим образом:

sinewavetest

Приведенная выше анимация достигается с помощью синусоиды, которая, как я знаю, абсолютно неточна. Я знаю что geosphere::gcIntermediate позволяет мне рисовать линии большого круга, вот так:

library(ggplot2)
library(ggthemes)
library(geosphere)

sunPath1 <- data.frame(gcIntermediate(c(-179, -30), c(0, 30), n=100))
sunPath2 <- data.frame(gcIntermediate(c(0, 30), c(179, -30), n=100))
sunPath <- rbind(sunPath1, sunPath2)

ggplot(sunPath) +
  borders("world", colour = "gray95", fill = "gray90") +
  geom_ribbon(aes(lon, ymax = lat), ymin=-180, fill="black", alpha=0.2) +
  theme_map()

greatcircletest

Хотя я не уверен, удастся ли нарисовать нужные линии в разных точках в течение года, например, в марте это выглядит так:

в небе


Мне не повезло найти решение, но я предполагаю, что не знаю ключевых слов для поиска, так как это далеко за пределами моей сферы знаний. Я думаю, что ответ может лежать где-то в уравнении восхода, но я не знаю, как применять их, чтобы найти решение, и при этом я не знаю, как изменять эти параметры в течение года. Этот веб-сайт (используемый для сюжета выше) также кажется полезным, но я еще не уверен, как!

1 ответ

Решение

Я решил эту проблему с помощью @jazzurro, указывая мне на Leaflet R пакет. Я перенес их плагин javascript L.Terminator.js на R, чтобы использовать их вне интерактивных карт листовок.

Функция доступна здесь.

Вот пример 24-часовой анимации:

library(dplyr)
library(ggplot2)
library(ggthemes)
library(gganimate)
library(animation)

terminatorLatLon <- lapply(seq(0, 23, 1), function(x) {

  t0 <- as.POSIXct(Sys.Date()) + (60*60*x)

  terminator(t0, -180, 190, 0.5) %>%
    mutate(frame = x)
}) %>%
  plyr::rbind.fill()

chart <- ggplot(terminatorLatLon, aes(frame = frame)) +
  borders("world", colour = "gray90", fill = "gray85") +
  geom_ribbon(aes(lat, ymax = lon), ymin = 90, alpha = 0.2) +
  coord_equal(xlim = c(-180, 190), ylim = c(-58, 85), expand = 0) +
  theme_map()

gganimate(chart, interval = 0.1, ani.width=1000, ani.height=600, filename = "terminator-animation.gif")

https://user-images.githubusercontent.com/17113779/35389041-096c2786-01ce-11e8-98b6-cfa915f8e989.gif

Другие вопросы по тегам