python:SunMoonTimeCalculator

# 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"]))

调用:

#日出日落 深圳
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.rhkb.cn/news/328253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MQTT_服务器的安装_1.3

此例子是以Windows系统安装开源版本的EMQX 下载 EMQX 下载并解压 解压如图 进入bin 文件夹在文件目录中输入cmd回车 启动服务器 然后在cmd中输入下面的代码&#xff08;会弹出一个访问网络的选项&#xff0c;确认可以访问网络&#xff09; emqx start 结果如图&#xff08;…

在Linux中安装Docker

如果之前安装过旧版本的 Docker&#xff0c;可以使用下面命令卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine…

YOLO损失函数——SIoU和Focal Lossr损失函数解析

1. 概述 YOLO&#xff08;You Only Look Once&#xff09; 系列模型以其实时目标检测能力而闻名&#xff0c;其有效性在很大程度上归功于其专门设计的损失函数。在本文中&#xff0c;这里将深入探讨YOLO演进中不可或缺的各种YOLO损失函数&#xff0c;并重点介绍它们在PyTorch中…

免费泛域名证书申请

通配符证书是一种 SSL/TLS 证书&#xff0c;可用于保护多个域&#xff08;主机&#xff09;&#xff0c;由域名字段中的通配符 (*) 指示。 如果您有很多需要保护的域或子域&#xff0c;这会很有帮助&#xff0c;因为它可以节省您的时间和金钱。 本文将讨论通配符证书、它们的工…

代码复现|Demucs Music Source Separation

一、背景介绍 Demucs是一个开源的音源分离项目。 Demucs在算法层面前后经历了三次大版本的进化&#xff0c;最原始的V1版本是&#xff1a;编解码LSTM。具体算法原理图如下所示。该版本在时域进行音源分离。关于阅读笔记请点击这篇文章。 V1版本原理图 V2版本是同时使用时域和频…

车牌检测识别功能实现(pyqt)

在本专题前面相关博客中已经讲述了 pyqt + yolo + lprnet 实现的车牌检测识别功能。带qt界面的。 本博文将结合前面训练好的模型来实现车牌的检测与识别。并用pyqt实现界面。最终通过检测车牌检测识别功能。 1)、通过pyqt5设计界面 ui文件如下: <?xml version="1…

Star CCM+创建报告与监测

前言 结合前文介绍&#xff0c;创建衍生零部件的目的是为了监测创建的点或者面的数据变化。如Star CCM衍生零部件的创建介绍&#xff0c;创建完所需的点或者面后&#xff0c;下一步就是对创建的点、面进行监测。 一 报告类型介绍 在Star中&#xff0c;通过创建报告来对监测的…

基于单片机的空气质量检测系统设计(51+4G版)-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的空气质量检测系统设计涉及以下主要功能&#xff0c;旨在监测甲烷和一氧化碳的浓度&#xff0c;并在浓度过高时采取相应措施&#xff0c;以确保室内空气质量的安全。该系统使用传感器对甲烷和一氧化碳的浓度进行检测。传感器将收集到…

【环境安装】nodejs 国内源下载与安装以及 npm 国内源配置

前言 Node.js 是一个基于 Chrome V8 引擎构建的 JavaScript 运行时环境&#xff0c;它能够使 JavaScript 在服务器端运行。它拥有强大的包管理器 npm&#xff0c;使开发者能够轻松管理和共享 JavaScript 代码包。 在中国&#xff0c;由于众所周知的原因&#xff0c;我们可能会…

vscode对一些软件的调试插件。

vscode对一些软件的调试插件。 1、ae &#xff0c;f1然后选择运行 after effect 脚本 2、maya,右键send code to maya 3、max&#xff0c;ctrle运行脚本到max 4、unity 从在Visual Studio代码使用.NET的核心&#xff1a; 1、安装.NET Core SDK&#xff0c;链接: https://dotn…

【UE5.1 角色练习】01-使用小白人蓝图控制商城角色移动

目录 效果 步骤 一、导入资源 二、控制角色移动 三、更换角色移动动作 效果 步骤 一、导入资源 新建一个工程&#xff0c;然后在虚幻商城中将角色动画的相关资源加入工程&#xff0c;这里使用的是“动画初学者内容包”和“MCO Mocap Basics” 将我们要控制的角色添加进…

SuperBox设计出图的效率提升!新增内门自动开孔和垫高支架图纸输出功能

越来越多的配电箱项目要求带内门&#xff0c;内门不仅可以有效减少外界灰尘、异物进入配电箱内部&#xff0c;保障配电箱正常运行&#xff0c;还能够隔离操作人员意外触摸导电部件&#xff0c;减少触电事故的发生。但是配电箱在配置内门后&#xff0c;会给设计带来更多的要求&a…

web入门练手案例(一)

下面是一些web入门案例和实现的代码&#xff0c;带有部分注释&#xff0c;倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 新闻页面 案例描述&#xff1a; 互联网的发展使信息的传递变得方便、快捷&#xff0c;浏览新闻称为用户获取信息的重要渠道。下面将实现一个简…

详细教程!VMware Workstation Pro16 安装 + 创建 win7 虚拟机!

嚯嚯嚯&#xff0c;很多宝子都想拥有自己不同的操作系统环境&#xff0c;用于学习或项目搭建。买服务器费钱&#xff0c;虚拟机则成为了一个很好的选择。本文详细介绍VMware Workstation Pro 16安装及win7虚拟机创建&#xff0c;保姆级教程奉上&#xff01; 一、准备工作 VMw…

掏心经验分享,软考中项0基础入门篇!

想备考下半年中项&#xff08;系统集成项目管理工程师&#xff09;的朋友&#xff0c;不知道如何了解软考中项&#xff0c;今天给大家整理一篇关于我自己在备考软考时的一些考量和踩过的一些坑。&#xff08;无广&#xff0c;放心看&#xff09; 很多小伙伴总是听大家说软考中…

Linux 服务器配置共享文件夹(NFS)

一、准备三台 linux 服务器 三台服务器: manger:172.16.11.178 ap1:172.16.11.179 ap2:172.16.11.180 /root/serverfiles/ 为共享目录 二、配置步骤 1、在服务端01的机器上安装nfs和rpcbind程序 yum -y install nfs* yum -y install rpcbind* 2、在安装完nfs以及rpcb…

Leecode热题100---11:盛最多水的容器

题目&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾…

使用单目相机前后帧特征点匹配进行3D深度估计的方法

在计算机视觉和机器人领域&#xff0c;三维空间感知是实现环境理解和交互的核心技术之一。特别是在资源受限的场合&#xff0c;使用针孔模型的单目相机进行深度估计成为了一种既经济又实用的解决方案。单目深度估计技术依赖于从连续视频帧中提取和匹配特征点&#xff0c;以估计…

RT-Thread中使用Mqtt

环境&#xff1a; 开发板&#xff1a;Panduola&#xff08;stm32L475&#xff09; KEIL5 开发环境 rtthread 4.0.3内核 使用ENV 配置Rtt MQTT 1.MQTT介绍 ​ 客户端 Client 使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以发布应用消息给其它相关的客户端。订…

RocketMQ:新增consumer消费组group从最新消息开始消费skip last offset message

场景 想创建一个新的consumer去消费一个已经再使用的topic时&#xff0c;默认情况下会从topic中的第一条消息开始消费&#xff0c;大多数情况是需要从最新的消息开始。然后再使用CONSUME_FROM_LAST_OFFSET设置时并不会对新的consumer生效&#xff0c;它只是在停用consumer重新启…