編寫Python程式求地球表面兩點的球面距離,並打包為exe檔案。
阿新 • • 發佈:2018-11-09
編寫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小程式~