已经弄了一天了换几种方法总是算出的值不对,求解一下!这样竟然是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
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
- ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
- ¥500 火焰左右视图、视差(基于双目相机)
- ¥100 set_link_state
- ¥15 虚幻5 UE美术毛发渲染
- ¥15 CVRP 图论 物流运输优化
- ¥15 Tableau online 嵌入ppt失败
- ¥100 支付宝网页转账系统不识别账号
- ¥15 基于单片机的靶位控制系统
- ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)