【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…

相机学习的知识积累

六个问题理解ISP全流程_哔哩哔哩_bilibili ISP (Image Signal Processing) - NPTEL公开课_哔哩哔哩_bilibili ISP Pipline_isp pipeline-CSDN博客 摄像头camera基础知识_哔哩哔哩_bilibili

PHP将HTML标签转化为图片

composer require yangshuanlin/php-html2img test.php <?php require vendor/autoload.php; use Html2image\Assets\html2Img;/*** html&#xff1a;可以是html文件 或者网页URL 或者为参数 必填* $data 额外的参数 必填* $back_url 回调地址 必填*/ $htmlfile_get_con…

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

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

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

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

前端React篇之React-Router的实现原理是什么?React-Router的路由有几种模式?

目录 React-Router的实现原理是什么&#xff1f;React-Router的路由有几种模式&#xff1f;HashRouterBrowserRouter React-Router的实现原理是什么&#xff1f; 基于hash的路由&#xff1a;通过监听浏览器的hashchange事件来感知URL中hash部分的变化。当hash发生变化时&#x…

名字空间和类型增强C++

一、名字空间 关键字&#xff1a;namespace&#xff1b; 作用&#xff1a;一个大项目中多个文件里的函数和变量名容易发生冲突&#xff0c;名字空间用来解决这种冲突 语法&#xff1a; namespace namespace_name {}例如&#xff1a; namespce Sample {int i;float f;void d…

PYTHON 120道题目详解(118-120)

118.解释Python中的迭代器&#xff08;Iterator&#xff09;和可迭代对象&#xff08;Iterable&#xff09;的区别和联系。 在Python中&#xff0c;迭代器&#xff08;Iterator&#xff09;和可迭代对象&#xff08;Iterable&#xff09;是两个非常重要的概念&#xff0c;它们在…

【微服务】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;所以它能够请求到与它相连…