Учитывая широту и долготу, как я могу определить, есть ли дневной свет? - PullRequest
2 голосов
/ 12 сентября 2011

Я пишу программу на Python, которая должна определить, будет ли она после восхода солнца или нет, учитывая только текущее время UTC и целевую широту и долготу.Я вижу, что приложения делают такие вещи все время, но я понятия не имею, как это делается.Есть идеи?

Ответы [ 4 ]

4 голосов
/ 12 сентября 2011

Вот чья-то реализация вычисления восхода / захода солнца в Python: http://michelanders.blogspot.com/2010/12/calulating-sunrise-and-sunset-in-python.html

1 голос
/ 12 сентября 2011

Полная схема алгоритма: здесь

Не так много, чтобы добавить на самом деле. 10 пунктов в цитируемом документе разбивают его на простые для воспроизведения шаги, которые могут быть реализованы на любом языке на самом деле.

1 голос
/ 12 сентября 2011

Просто выполнив быстрый поиск в Google, я нашел this. Расчеты в калькуляторах восхода / захода солнца и солнечного положения NOAA основаны на уравнениях из астрономических алгоритмов Джина Миуса. Результаты восхода и захода солнца были проверены с точностью до одной минуты для местоположений между +/- 72 ° широты и в течение 10 минут за пределами этих широт.

Подробное объяснение деталей расчета можно найти на этой странице, а также здесь.

0 голосов
/ 11 февраля 2012

Вам нужно что-то, что просто работает ™? Используйте превосходный язык. И ты знаешь, что это всегда будет работать. Как можно доверять 122 линиям продвинутой астрофизики? Ты не можешь Но вы всегда можете доверять PHP.

>>> def is_day(lat, lon): # optinally adjust zenith (currently 96) at the end of the line
...   return subprocess.check_output(["php","-r","""date_default_timezone_set("GMT");\n$a=date_sunrise(time(),SUNFUNCS_RET_DOUBLE,{0},{1},{2},0);\n$b=date_sunset(time(),SUNFUNCS_RET_DOUBLE,{0},{1},{2},0);\n$t=date("H")+date("i")/60+date("s")/3600;\necho($a<$b?($t>$a&&$t<$b):($t>$a||$t<$b))?"day":"night";""".format(lat,lon,96)])=="day"
...   #                                                                                                                                                                                                                                                                                                                             ^^ optionally adjust zenith here
... 
>>> is_day(-33,151) # Sydney
True
>>> is_day(0,0) # Some hundred km off the coast of Africa
False
>>> __import__("datetime").datetime.utcnow()
datetime.datetime(2012, 2, 10, 22, 29, 30, 365019)
>>> 
...