【PyQT】大地线长度计算工具实现

本设计实现了一个大地线长度计算工具,用户可以输入两个点的经纬度坐标,然后点击计算按钮,程序会根据输入的经纬度坐标计算出这两个点之间的大地线长度,并将结果显示在界面上。如下图所示。

在这里插入图片描述
附录完整代码如下:

# 导入所需的库
import sys
import math
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHeaderView, QPushButton, QTableWidget, QTableWidgetItem# 定义一个名为GeodeticLine的类,初始化方法接受一个参数e2(椭球体第二偏心率平方)
class GeodeticLine:def __init__(self, e2):self.e2 = e2# 定义名为bessel_inverse的方法,接受输入数据input_data和一个整型变量geodesy。def bessel_inverse(self, input_data, geodesy):# 创建一个名为output的空字典,用于存储计算结果。output = {}# 调用calculate_geodetic_parameters方法计算输入点的辅助参数sin_u和cos_u。sin_u1, cos_u1 = self.calculate_geodetic_parameters(input_data['B1'])sin_u2, cos_u2 = self.calculate_geodetic_parameters(input_data['B2'])# 计算两点经度差L,并将lamda初始值设为L,初始化delta0为0。L = input_data['L2'] - input_data['L1']lamda = Ldelta0 = 0# 在一个无限循环中(后面会有跳出条件),计算p和q的值,然后计算A12(A至B的方位角)while True:p = cos_u2 * math.sin(lamda)q = cos_u1 * sin_u2 - sin_u1 * cos_u2 * math.cos(lamda)A12 = math.atan2(p, q)# 根据p和q的符号调整A12的值。if p > 0 and q > 0:A12 = abs(A12)elif p > 0 and q < 0:A12 = math.pi - abs(A12)elif p < 0 and q < 0:A12 = abs(A12) + math.pielse:A12 = 2 * math.pi - abs(A12)# 计算sin_sigma,cos_sigma和sigma。sin_sigma = p * math.sin(A12) + q * math.cos(A12)cos_sigma = sin_u1 * sin_u2 + cos_u1 * cos_u2 * math.cos(lamda)sigma = math.atan2(sin_sigma, cos_sigma)# 计算sin_A0和cos_sq_A0。sin_A0 = cos_u1 * math.sin(A12)cos_sq_A0 = 1 - sin_A0 ** 2# 计算x、alpha和beta。x = 2 * sin_u1 * sin_u2 - cos_sq_A0 * cos_sigmaalpha = (33523299 - (28189 - 70 * cos_sq_A0) * cos_sq_A0) * 1e-10beta = (28189 - 94 * cos_sq_A0) * 1e-10# 计算delta并更新lamda的值。delta = (alpha * sigma - beta * x * sin_sigma) * sin_A0lamda = L + delta# 判断delta与delta0之间的差值是否小于1e - 12,如果是,则跳出循环;否则,更新delta0的值。if abs(delta - delta0) < 1e-12:breakdelta0 = delta# 对A21(从点B到点A的方位角)进行计算和调整。A21 = A12 + math.piif A21 < 0:A21 += 2 * math.piif A21 > 2 * math.pi:A21 -= 2 * math.piif A12 < math.pi and A21 < math.pi:A21 += math.piif A12 > math.pi and A21 > math.pi:A21 -= math.pi# 根据geodesy的值计算A、B和C。if geodesy == 1:A = 6356863.020 + (10708.949 - 13.474 * cos_sq_A0) * cos_sq_A0B = 10708.938 - 17.956 * cos_sq_A0C = 4.487elif geodesy == 2:A = 6356755.288 + (10710.341 - 13.534 * cos_sq_A0) * cos_sq_A0B = 10710.342 - 18.046 * cos_sq_A0C = 4.512elif geodesy == 3:A = 6356755.288 + (10710.341 - 13.534 * cos_sq_A0) * cos_sq_A0B = 10710.342 - 18.046 * cos_sq_A0C = 4.512# 计算y和S(两点间的大地线长度)。y = (cos_sq_A0 ** 2 - 2 * x * x) * cos_sigmaS = A * sigma + (B * x + C * y) * sin_sigma# 将计算结果存入output字典并返回。output['S'] = Soutput['A12'] = A12output['A21'] = A21return output# 定义一个名为calculate_geodetic_parameters的辅助方法,接受一个参数B(纬度值),计算并返回sin_u和cos_u。def calculate_geodetic_parameters(self, B):W = math.sqrt(1 - self.e2 * math.pow(math.sin(B), 2))sin_u = math.sin(B) * math.sqrt(1 - self.e2) / Wcos_u = math.cos(B) / Wreturn sin_u, cos_uclass MainWindow(QWidget):def __init__(self):super().__init__()self.initUI()def initUI(self):self.setWindowTitle('大地线长度计算')self.setGeometry(300, 300, 600, 300)layout = QVBoxLayout()self.table = QTableWidget(2, 2)self.table.setHorizontalHeaderLabels(['L(dd.mmss)', 'B(dd.mmss)'])self.table.setVerticalHeaderLabels(['点P1', '点P2'])header = self.table.horizontalHeader()header.setSectionResizeMode(QHeaderView.Stretch)layout.addWidget(self.table)self.calc_button = QPushButton('计算')self.calc_button.clicked.connect(self.calculate_distance)layout.addWidget(self.calc_button)self.result_table = QTableWidget(1, 1)self.result_table.setHorizontalHeaderLabels(['大地线长度S (m)'])self.result_table.horizontalHeader().setStretchLastSection(True)layout.addWidget(self.result_table)self.setLayout(layout)def calculate_distance(self):try:lat1 = float(self.table.item(0, 0).text())lon1 = float(self.table.item(0, 1).text())lat2 = float(self.table.item(1, 0).text())lon2 = float(self.table.item(1, 1).text())input_data = {'e2': 0.00669437999013,'L1': math.radians(lon1),'B1': math.radians(lat1),'L2': math.radians(lon2),'B2': math.radians(lat2)}geodetic_line = GeodeticLine(input_data['e2'])output = geodetic_line.bessel_inverse(input_data, 1)self.result_table.setItem(0, 0, QTableWidgetItem(f"{output['S']:.2f}"))except Exception as e:print(f'Error: {e}')if __name__ == '__main__':app = QApplication(sys.argv)mainWindow = MainWindow()mainWindow.show()sys.exit(app.exec_())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746025.shtml

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

相关文章

L1-5 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子&#xff0c;有的是黑色的&#xff0c;有的是黄色的。每个人可以看到别人头上的帽子&#xff0c;但是看不到自己的。游戏开始后&#xff0c;每个人可以猜自己头上的帽子是什么颜色&#xff0c;或者可以弃权不猜。如果没有…

【C语言_C语言语句_复习篇】

目录 一、C语言的语句有哪些 1.1 空语句 1.2 表达式语句 1.3 函数调用语句 1.4 复合语句 1.5 控制语句 二、分支语句&#xff08;两种&#xff09; 1.1 if语句 1.1.1 普通分支语句(if、if_else) 1.1.2 嵌套if语句 1.1.3 else嵌套if两种写法的比较 1.1.4 else悬空问题 1.1.…

MapReduce解析:从定义到核心思想,编程规范与序列化解读

目录 一、 MapReduce1.1 MapReduce定义1.2 MapReduce优缺点1.2.1 优点1.2.2 缺点 1.3 MapReduce核心思想1.4 MapReduce进程1.5 常用数据序列化类型1.6 MapReduce编程规范1.6.1Mapper阶段1.6.2 Reduce阶段1.6.3 Driver阶段 1.7 WordCount案例实操1.7.1 本地测试1.7.2 提交到集群…

TEC温度器温度控制器

一 主要特点 1 两路独立的串口&#xff0c;可同时手动和串口指令设定 PID 和温度&#xff1b; 2 一拖二结构&#xff0c;一个调试器控制两个控温模块单元&#xff1b; 3 精准控制温度&#xff0c;用户可自行修正&#xff1b;PT100/PT1000/NTC3435 温度电阻偏差&#xff1b; …

1.1 课程架构介绍:STM32H5信息安全特性概览

1.1 课程架构介绍&#xff1a;STM32H5信息安全特性概览 1. 概述 开发者在打造嵌入式系统时&#xff0c;安全和性能是产品开发设计的考量重点。为实现这一目标&#xff0c;ST推出了STM32H5系列&#xff0c;该系列作为微控制器新标杆面向工业应用市场&#xff0c;将为用户带来更…

windows中如何将已安装的node.js版本进行更换

第一步&#xff1a;先清除已经安装好的node.js版本 1.按健winR弹出窗口&#xff0c;键盘输入cmd,然后敲回车&#xff08;或者鼠标直接点击电脑桌面最左下角的win窗口图标弹出&#xff0c;输入cmd再点击回车键&#xff09; 然后进入命令控制行窗口&#xff0c;并输入where node…

【Axure教程】能增删改的树形表格

多层级表格又成为树形表格&#xff0c;是在后台常用的一种表格形式&#xff0c;当表格数据存在多层级关系是&#xff0c;可以通过多层级表格&#xff0c;从而更加清晰的呈现数据内容&#xff0c;帮助人们更好地理解和分析数据之间的关系&#xff0c;从而更加有效地传递信息。 …

【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM 新生代、老年代、永久代的区别

大家好&#xff0c;我是锋哥。今天分享关于JVM新生代、老年代、永久代的区别的JVM面试题&#xff0c;希望对大家有帮助&#xff1b; JVM 新生代、老年代、永久代的区别? 在 Java 中&#xff0c;堆被划分成两个不同的区域&#xff1a;新生代 ( Young ) 、老年代 ( Old ) 。而新…

【微服务】nacos注册中心

Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的注册中心。 1.1.认识和安装Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在…

C++ 改造红黑树,封装map和set

C 改造红黑树,封装map和set 一.前言:已经实现好了的红黑树二.简化STL库里面对于map和set的封装1.STL库中红黑树的简化代码2.STL库中set的简化代码3.STL库中map的简化代码4.封装map和set的第一步5.红黑树第一个模板参数的价值6.红黑树节点的定义 三.仿函数1.解除仿函数的误解2.仿…

Android App冷启动耗时优化

Android应用启动过程 Android应用启动过程&#xff0c;主要包含app::onCreate及执行前的Application阶段及Activity::onCreate执行之后的Activity阶段&#xff0c;以及两个阶段之间的间隙handleMessage阶段和最终页面渲染上屏完成前数据加载阶段四个区间组成。 具体来看&#x…

IDEA中配置Tomcat

在IDEA中配置Tomcat 第一步&#xff1a;选择这个方框 第二步&#xff1a;选择号&#xff0c;找到Tomcat Server&#xff08;Local&#xff09; 第三步&#xff1a;将红方框内填完整 第四步&#xff1a;创建artifaces&#xff0c;选择Deployment–>Artia…选择 *.war expl…

嵌入式驱动学习第三周——字符设备驱动关键结构体

前言 linux内核将字符设备抽象成一个具体的数据结构&#xff0c;可以理解为字符设备对象&#xff0c;这篇博客就来讲解一下字符设备驱动的关键结构体。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以…

ArcGis Pro Python工具箱教程 02 工具箱工具集添加

ArcGis Pro Python工具箱教程 02 工具箱工具集添加 经过上一章的教程&#xff0c;pyt工具箱已将可以建立一个模板了&#xff0c;但是所建立的工具都是在一个列表&#xff0c;要进行查找会非常麻烦&#xff0c;所以要采用工具集的分类 官方文档中已经给出了添加工具集的方法&a…

以题为例浅谈SSRF

什么是ssrf SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相连…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

【linux线程(二)】线程互斥与线程同步

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 多线程互…

基于大模型和向量数据库的 RAG 示例

1 RAG 介绍 RAG是一种先进的自然语言处理方法&#xff0c;它结合了信息检索和文本生成技术&#xff0c;用于提高问答系统、聊天机器人等应用的性能。 2 RAG 的工作流程 文档加载&#xff08;Document Loading&#xff09; 从各种来源加载大量文档数据。这些文档…

Redis 除了做缓存,还能做什么?

分布式锁&#xff1a;通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下&#xff0c;我们都是基于 Redisson 来实现分布式锁。关于 Redis 实现分布式锁的详细介绍&#xff0c;可以看这篇文章&#xff1a;分布式锁详解open in new window 。限流&#xff1a;一般是通过 …

json-server 安装成功,查看版本直接报错。安装默认版本埋下的一个坑,和node版本不匹配

文章目录 一、作者的错误二、作者安装的过程三、版本问题的解决方式四、安装成功&#xff0c;显示命令不存在的解决思路五、安装失败的解决思路六、json-server运行命令参考文档 一、作者的错误 安装成功 错误原文 file:///C:/Users/ljj/AppData/Roaming/nvm/v14.18.1/node_g…