Карта мира, показывающая дневные и ночные регионы
Я пытаюсь добавить дневную/ночную линию на карту мира, используя 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]()
Хотя я не уверен, что в течение года можно будет нарисовать нужные строки в разных точках, например. в марте это выглядит так:
![inthesky]()
Мне не повезло найти решение, но я предполагаю, что не знаю, какие ключевые слова нужно искать, так как это выходит за рамки моей сферы знаний. Я думаю, что ответ может лежать где-то в методе восхода солнца, но я не знаю, как их применять, чтобы найти решение, и я не знаю как изменить эти параметры в течение года. Этот сайт (используется для сюжета выше) также кажется полезным, но я пока не знаю, как это сделать.
Ответы
Ответ 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")
![terminator-animation]()