已经弄了一天了换几种方法总是算出的值不对,求解一下!这样竟然是Python的入门题目吗
1条回答 默认 最新
关注 正矢、半正矢等三角函数,在现有教育体系内从没有涉及到,理解起来相对困难一些。下面的代码将计算地球表面两点距离的半正矢公式翻译成可用numpy的三角函数计算的函数。另外,我有一个更容易理解的思路,希望对题主有帮助:
- 将两个点的经纬度换算成空间坐标;
- 计算地心与两个点所成的两个向量的点积(以向量模长之积乘以向量夹角余弦);
- 点积除以两个向量的模(也就是地球半径)之积,结果就是向量夹角的余弦;
- 反余弦值对应着两点所在大圆(即经过两点的地球表面最大的圆)的弧度;
- 弧度乘以地球半径,即得弧长。
import numpy as np def haversine(p1, p2, r=6371): lat1, lon1, lat2, lon2 = map(np.radians, (*p1, *p2)) dlat, dlon = lat2 - lat1, lon2 - lon1 a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2 c = 2 * np.arcsin(np.sqrt(a)) return c * r def get_arc(p1, p2, r=6371): lat1, lon1, lat2, lon2 = map(np.radians, (*p1, *p2)) x1, y1, z1 = r*np.cos(lat1)*np.cos(lon1), r*np.cos(lat1)*np.sin(lon1), r*np.sin(lat1) x2, y2, z2 = r*np.cos(lat2)*np.cos(lon2), r*np.cos(lat2)*np.sin(lon2), r*np.sin(lat2) theta = np.arccos(np.dot((x1,y1,z1),(x2,y2,z2))/(r*r)) return theta * r 西安 = (34.260958, 108.942369) 莫斯科 = (55.755825, 37.617298) haversine(西安, 莫斯科) 5793.22364495678 get_arc(西安, 莫斯科) 5793.223644956781
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 win10权限管理,限制普通用户使用删除功能
- ¥15 minnio内存占用过大,内存没被回收(Windows环境)
- ¥65 抖音咸鱼付款链接转码支付宝
- ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
- ¥15 求螺旋焊缝的图像处理
- ¥15 blast算法(相关搜索:数据库)
- ¥15 请问有人会紧聚焦相关的matlab知识嘛?
- ¥15 网络通信安全解决方案
- ¥50 yalmip+Gurobi
- ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面