qq_30251199 2022-10-17 19:51 采纳率: 60%
浏览 44
已结题

关于#python#中由坐标求出两点间距离

img

img


已经弄了一天了换几种方法总是算出的值不对,求解一下!这样竟然是Python的入门题目吗

  • 写回答

1条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2022-10-18 09:11
    关注

    正矢、半正矢等三角函数,在现有教育体系内从没有涉及到,理解起来相对困难一些。下面的代码将计算地球表面两点距离的半正矢公式翻译成可用numpy的三角函数计算的函数。另外,我有一个更容易理解的思路,希望对题主有帮助:

    1. 将两个点的经纬度换算成空间坐标;
    2. 计算地心与两个点所成的两个向量的点积(以向量模长之积乘以向量夹角余弦);
    3. 点积除以两个向量的模(也就是地球半径)之积,结果就是向量夹角的余弦;
    4. 反余弦值对应着两点所在大圆(即经过两点的地球表面最大的圆)的弧度;
    5. 弧度乘以地球半径,即得弧长。
    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月27日
  • 已采纳回答 10月19日
  • 创建了问题 10月17日

悬赏问题

  • ¥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 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)