python:SunMoonTimeCalculator

server/2024/10/19 9:34:29/
python"># encoding: utf-8
# 版权所有 2024 ©涂聚文有限公司
# 许可信息查看:
# 描述: https://github.com/Broham/suncalcPy
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2023.1 python 3.11
# Datetime  : 2024/5/14 21:59
# User      : geovindu
# Product   : PyCharm
# Project   : EssentialAlgorithms
# File      : sunCalc.py
# explain   : 学习import math
from datetime import datetime, timedelta
import time
import calendarclass SunMoonTimeCalculator(object):"""日出日落,月升月落计算类"""def __init__(self):""""""self.PI = 3.141592653589793  # math.pi"""派"""self.sin = math.sin"""sin 函数"""self.cos = math.cos"""函数"""self.tan = math.tan"""函数"""self.asin = math.asin"""函数"""self.atan = math.atan2"""函数"""self.acos = math.acos"""函数"""self.rad = self.PI / 180.0self.e = self.rad * 23.4397  # obliquity of the Earthself.dayMs = 1000 * 60 * 60 * 24self.J1970 = 2440588self.J2000 = 2451545self.J0 = 0.0009self.times = [[-0.833, 'sunrise', 'sunset'],[-0.3, 'sunriseEnd', 'sunsetStart'],[-6, 'dawn', 'dusk'],[-12, 'nauticalDawn', 'nauticalDusk'],[-18, 'nightEnd', 'night'],[6, 'goldenHourEnd', 'goldenHour']]def rightAscension(self,l, b):""":param l::param b::return:"""return self.atan(self.sin(l) * self.cos(self.e) - self.tan(b) * self.sin(self.e), self.cos(l))def declination(self,l, b):""":param l::param b::return:"""return self.asin(self.sin(b) * self.cos(self.e) + self.cos(b) * self.sin(self.e) * self.sin(l))def azimuth(self,H, phi, dec):""":param H::param phi::param dec::return:"""return self.atan(self.sin(H), self.cos(H) * self.sin(phi) - self.tan(dec) * self.cos(phi))def altitude(self,H, phi, dec):""":param H::param phi::param dec::return:"""return self.asin(self.sin(phi) * self.sin(dec) + self.cos(phi) * self.cos(dec) * self.cos(H))def siderealTime(self,d, lw):""":param d::param lw::return:"""return self.rad * (280.16 + 360.9856235 * d) - lwdef toJulian(self,date):""":param date::return:"""return (time.mktime(date.timetuple()) * 1000) / self.dayMs - 0.5 + self.J1970def fromJulian(self,j):""":param j::return:"""return datetime.fromtimestamp(((j + 0.5 - self.J1970) * self.dayMs) / 1000.0)def toDays(self,date):""":param date::return:"""return self.toJulian(date) - self.J2000def julianCycle(self,d, lw):""":param d::param lw::return:"""return round(d - self.J0 - lw / (2 * self.PI))def approxTransit(self,Ht, lw, n):""":param Ht::param lw::param n::return:"""return self.J0 + (Ht + lw) / (2 * self.PI) + ndef solarTransitJ(self,ds, M, L):""":param ds::param M::param L::return:"""return self.J2000 + ds + 0.0053 * self.sin(M) - 0.0069 * self.sin(2 * L)def hourAngle(self,h, phi, d):""":param h::param phi::param d::return:"""try:ret = self.acos((self.sin(h) - self.sin(phi) * self.sin(d)) / (self.cos(phi) * self.cos(d)))return retexcept ValueError as e:print(h, phi, d, "=>", e)def observerAngle(self,height):""":param height::return:"""return -2.076 * math.sqrt(height) / 60def solarMeanAnomaly(self,d):""":param d::return:"""return self.rad * (357.5291 + 0.98560028 * d)def eclipticLongitude(self,M):""":param M::return:"""C = self.rad * (1.9148 * self.sin(M) + 0.02 * self.sin(2 * M) + 0.0003 * self.sin(3 * M))  # equation of centerP = self.rad * 102.9372  # perihelion of the Earthreturn M + C + P + self.PIdef sunCoords(self,d):""":param d::return:"""M = self.solarMeanAnomaly(d)L = self.eclipticLongitude(M)return dict(dec=self.declination(L, 0),ra=self.rightAscension(L, 0))def getSetJ(self,h, lw, phi, dec, n, M, L):""":param h::param lw::param phi::param dec::param n::param M::param L::return:"""w = self.hourAngle(h, phi, dec)a = self.approxTransit(w, lw, n)return self.solarTransitJ(a, M, L)def moonCoords(self,d):"""geocentric ecliptic coordinates of the moon:param d::return:"""L = self.rad * (218.316 + 13.176396 * d)M = self.rad * (134.963 + 13.064993 * d)F = self.rad * (93.272 + 13.229350 * d)l = L + self.rad * 6.289 * self.sin(M)b = self.rad * 5.128 * self.sin(F)dt = 385001 - 20905 * self.cos(M)return dict(ra=self.rightAscension(l, b),dec=self.declination(l, b),dist=dt)def getMoonIllumination(self,date):"""Gets illumination properties of the moon for the given time.:param date::return:"""d = self.toDays(date)s = self.sunCoords(d)m = self.moonCoords(d)# distance from Earth to Sun in kmsdist = 149598000phi = self.acos(self.sin(s["dec"]) * self.sin(m["dec"]) + self.cos(s["dec"]) * self.cos(m["dec"]) * self.cos(s["ra"] - m["ra"]))inc = self.atan(sdist * self.sin(phi), m["dist"] - sdist * self.cos(phi))angle = self.atan(self.cos(s["dec"]) * self.sin(s["ra"] - m["ra"]),self.sin(s["dec"]) * self.cos(m["dec"]) - self.cos(s["dec"]) * self.sin(m["dec"]) * self.cos(s["ra"] - m["ra"]))return dict(fraction=(1 + self.cos(inc)) / 2,phase=0.5 + 0.5 * inc * (-1 if angle < 0 else 1) / self.PI,angle=angle)def getSunrise(self,date, lat, lng):""":param lat::param lng::return:"""ret = self.getTimes(date, lat, lng)return ret["sunrise"]def getTimes(self,date, lat, lng, height=0):"""Gets sun rise/set properties for the given time, location and height.:param date::param lat::param lng::param height::return:"""lw = self.rad * -lngphi = self.rad * latdh = self.observerAngle(height)d = self.toDays(date)n = self.julianCycle(d, lw)ds = self.approxTransit(0, lw, n)M = self.solarMeanAnomaly(ds)L = self.eclipticLongitude(M)dec = self.declination(L, 0)Jnoon = self.solarTransitJ(ds, M, L)result = dict(solarNoon=self.fromJulian(Jnoon).strftime('%Y-%m-%d %H:%M:%S'),nadir=self.fromJulian(Jnoon - 0.5).strftime('%Y-%m-%d %H:%M:%S'))for i in range(0, len(self.times)):time = self.times[i]h0 = (time[0] + dh) * self.radJset = self.getSetJ(h0, lw, phi, dec, n, M, L)Jrise = Jnoon - (Jset - Jnoon)result[time[1]] = self.fromJulian(Jrise).strftime('%Y-%m-%d %H:%M:%S')result[time[2]] = self.fromJulian(Jset).strftime('%Y-%m-%d %H:%M:%S')return resultdef hoursLater(self,date, h):""":param date::param h::return:"""return date + timedelta(hours=h)def getMoonTimes(self,date, lat, lng):""":param date::param lat::param lng::return:""""""Gets moon rise/set properties for the given time and location."""t = date.replace(hour=0, minute=0, second=0)hc = 0.133 * self.radh0 = self.getMoonPosition(t, lat, lng)["altitude"] - hcrise = 0sett = 0# go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set)for i in range(1, 25, 2):h1 = self.getMoonPosition(self.hoursLater(t, i), lat, lng)["altitude"] - hch2 = self.getMoonPosition(self.hoursLater(t, i + 1), lat, lng)["altitude"] - hca = (h0 + h2) / 2 - h1b = (h2 - h0) / 2xe = -b / (2 * a)ye = (a * xe + b) * xe + h1d = b * b - 4 * a * h1roots = 0if d >= 0:dx = math.sqrt(d) / (abs(a) * 2)x1 = xe - dxx2 = xe + dxif abs(x1) <= 1:roots += 1if abs(x2) <= 1:roots += 1if x1 < -1:x1 = x2if roots == 1:if h0 < 0:rise = i + x1else:sett = i + x1elif roots == 2:rise = i + (x2 if ye < 0 else x1)sett = i + (x1 if ye < 0 else x2)if (rise and sett):breakh0 = h2result = dict()if (rise):result["rise"] = self.hoursLater(t, rise)if (sett):result["set"] = self.hoursLater(t, sett)if (not rise and not sett):value = 'alwaysUp' if ye > 0 else 'alwaysDown'result[value] = Truereturn resultdef getMoonPosition(self,date, lat, lng):"""Gets positional attributes of the moon for the given time and location.:param date::param lat::param lng::return:"""lw = self.rad * -lngphi = self.rad * latd = self.toDays(date)c = self.moonCoords(d)H = self.siderealTime(d, lw) - c["ra"]h = self.altitude(H, phi, c["dec"])# altitude correction for refractionh = h + self.rad * 0.017 / self.tan(h + self.rad * 10.26 / (h + self.rad * 5.10))pa = self.atan(self.sin(H), self.tan(phi) * self.cos(c["dec"]) - self.sin(c["dec"]) * self.cos(H))return dict(azimuth=self.azimuth(H, phi, c["dec"]),altitude=h,distance=c["dist"],parallacticAngle=pa)def getPosition(self,date, lat, lng):"""Returns positional attributes of the sun for the given time and location.:param date::param lat::param lng::return:"""lw = self.rad * -lngphi = self.rad * latd = self.toDays(date)c = self.sunCoords(d)H = self.siderealTime(d, lw) - c["ra"]# print("d", d, "c",c,"H",H,"phi", phi)return dict(azimuth=self.azimuth(H, phi, c["dec"]),altitude=self.altitude(H, phi, c["dec"]))

调用:

python">#日出日落 深圳
sun=Common.sunCalc.SunMoonTimeCalculator()
lat= 22.5445741
lng= 114.0545429
print(sun.getTimes(datetime.now(),  lat, lng))
print(sun.getMoonIllumination(datetime.now()))
#月升月落
print(sun.getMoonTimes(datetime.now(), lat, lng))

输出:


http://www.ppmy.cn/server/42069.html

相关文章

系统加固-自用

一、windows 1、概述 (1)、权限最高&#xff1a;system(系统账户)&#xff0c;权限比administrator权限还高 (2)、常见操作系统安全漏洞类型 缓冲区溢出漏洞TCP/IP协议漏洞web应用安全漏洞开放端口的安全漏洞 2、系统安全加固方法 (1)、系统不显示上次登录的用户名 进入…

vs2019 c++里用 typeid() . name () 与 typeid() . raw_name () 测试数据类型的区别

&#xff08;1&#xff09; 都知道&#xff0c;在 vs2019 里用 typeid 打印的类型不大准&#xff0c;会主动去掉一些修饰符&#xff0c; const 和引用 修饰符会被去掉。但也可以给咱们验证学到的代码知识提供一些参考。那么今天发现其还有 raw_name 成员函数&#xff0c;这个函…

nss刷题(2)

1、[NSSCTF 2022 Spring Recruit]ezgame 打开题目是一个游戏界面 发现是有分数的&#xff0c;猜测分数达到某个之后可以获得flag&#xff0c;查看源码看一下 看到末尾显示分数超过65后显示flag 在js中找到了一个score,将他的值改为大于65的数后随意玩一次就可以得到flag同时&a…

三:哈希map day6 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

今日任务 ● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和 今日任务 242.有效的字母异位词 题目 大型概括&#xff1a;map 的使用 1.题目描述-->思路&#xff1a; 给出两个string s,t; …

React 之 记忆化函数cache(十四)

const result cache&#xff08;fn&#xff09;方法&#xff1a; fn&#xff1a;要对其结果进行缓存的函数。fn 可以接受任何参数并返回任何值。 返回值result : 返回一个与 fn 具有相同类型签名的已缓存版本。在此过程中&#xff0c;它不会调用 fn。 cache 用法 import {cac…

哪些设计模式,你使用过哪些设计模式

Java框架中运用了多种设计模式&#xff0c;以下是一些具体的例子以及它们在框架中的应用&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。例如&#xff0c;Java中的Runtime类使用了单例模式…

WEB前端复习——JS

JS是运行在客户端的脚本&#xff08;script&#xff09;语言 引入JS进html ①sript标签内编写 <script type"text/javascript">document.write("<h1>hi</h1>")window.alert("who") </script> ②外部JS script src【…

Java设计模式——装饰者模式

Java设计模式——装饰者模式 1.简介 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许用户通过在一个对象上动态地添加职责或行为来增强其功能。这种类型的设计模式属于对象结构型模式&#xff0c;在不需要改变一个对象的内部结构…