编写Python程序求地球表面两点的球面距离
这是第一次使用Python针对具体需要来编写一个相对完整的程序。
需求分析
有一个朋友常常需要计算两个已知经纬坐标的海上石油平台之间的距离。
虽然这只是一个很简单的解析几何问题,但重复的计算依然耗时耗力。
设计一个程序来帮他完成这个重复性的工作便成为了我的第一个练习题。
他的电脑并没有安装Python,也没有Matlab等,因此我要给他提供一个在win10系统下可执行的exe文件。
安装 pyinstaller
本以为这会是个复杂的工作,然而它竟只需要一条命令,在命令行模式键入了以下指令:
pip install pyinstaller
然后就安装好了 pyinstaller,它可以将py文件打包为Windows系统下的exe文件。
设计程序
我感觉我似乎还停留在不使用类的那个时代,以后慢慢治吧。
以下是整个程序的代码,只是初版,太简单就不加太多注释了:
#coding=utf-8
import math
import time
lat_a = 0.0
lat_a_du = 0.0
lat_a_fen = 0.0
lat_a_miao = 0.0
lon_a = 0.0
lon_a_du = 0.0
lon_a_fen = 0.0
lon_a_miao = 0.0
lat_b = 0.0
lat_b_du = 0.0
lat_b_fen = 0.0
lat_b_miao = 0.0
lon_b = 0.0
lon_b_du = 0.0
lon_b_fen = 0.0
lon_b_miao = 0.0
r_earth = 6371000.0
pi = math.pi / 180
print("你好,我计算地球表面已知经纬度的两点间的距离。")
print("我将认为东经和北纬为正,西经和南纬为负。")
print("当你输入的某个度数为整数时,我会认为你还有分与秒要告诉我,并继续追问你。")
print()
lon_a_du = float(input("请输入点 A 的经度,单位度,以回车结束:"))
if lon_a_du == int(lon_a_du):
lon_a_fen = float(input("请输入分,以回车结束:"))
lon_a_miao = float(input("请输入秒,以回车结束:"))
lon_a = lon_a_du + lon_a_fen / 60 + lon_a_miao / 3600
lat_a_du = float(input("请输入点 A 的纬度,单位度,以回车结束:"))
if lat_a_du == int(lat_a_du):
lat_a_fen = float(input("请输入分,以回车结束:"))
lat_a_miao = float(input("请输入秒,以回车结束:"))
lat_a = lat_a_du + lat_a_fen / 60 + lat_a_miao / 3600
lon_b_du = float(input("请输入点 B 的经度,单位度,以回车结束:"))
if lon_b_du == int(lon_b_du):
lon_b_fen = float(input("请输入分,以回车结束:"))
lon_b_miao = float(input("请输入秒,以回车结束:"))
lon_b = lon_b_du + lon_b_fen / 60 + lon_b_miao / 3600
lat_b_du = float(input("请输入点 B 的纬度,单位度,以回车结束:"))
if lat_b_du == int(lat_b_du):
lat_b_fen = float(input("请输入分,以回车结束:"))
lat_b_miao = float(input("请输入秒,以回车结束:"))
lat_b = lat_b_du + lat_b_fen / 60 + lat_b_miao / 3600
print()
print("你输入的 A 、 B 两点的经纬坐标为:")
print("A: 经度 {}".format(lon_a))
print(" 纬度 {}".format(lat_a))
print("B: 经度 {}".format(lon_b))
print(" 纬度 {}".format(lat_b))
print()
print("计算使用的圆周率pi为:{},地球半径为:{} 千米。".format(math.pi, r_earth / 1000))
p1 = math.cos(lat_a * pi) * math.cos(lon_a * pi) * math.cos(lat_b * pi) * math.cos(lon_b * pi)
p2 = math.cos(lat_a * pi) * math.sin(lon_a * pi) * math.cos(lat_b * pi) * math.sin(lon_b * pi)
p3 = math.sin(lat_a * pi) * math.sin(lat_b * pi)
s = p1 + p2 + p3
angle = math.acos(s)
distance = angle * r_earth
print()
print("A B 两点与地球球心连线夹角为:{} 度。".format(angle * 180 / (math.pi)))
print()
print("A B 两点的球面距离为:{} 千米。".format(distance / 1000))
bye = input()
用到了三维向量的点乘来求取夹角的余弦值,不多说。
打包
最后找到py文件的路径下,在命令行模式下执行:
pyinstaller -F distance.py
完成工作。
经检验,程序可行。
下一步的计划是在学习一些GUI方面的方法后,给这个小程序做个漂亮的用户界面。
这篇日志用以记录我的第一个Python小程序~