Python 两地之间距离计算

两地之间距离计算

两地之间距离计算(模块:numEx,所在文件名 num_hw.py,Level:★)
利用 Python 实现地球上两点之间的距离计算,地球上点的位置以经纬度坐标形式提供。
距离计算采用 Haversine 公式:
在这里插入图片描述

这里 r 是地球半径 6371Km, 代表点的(纬度,经度)坐标。
参考网站:https://en.wikipedia.org/wiki/Haversine_formula
完成距离计算函数:
函数原型:def sphere_distance(p1, p2)
参数 p1:tuple 元组类型,二元组,(纬度,经度),坐标精确到小数点后 7 位
参数 p2:tuple 元组类型,二元组,(纬度,经度),坐标精确到小数点后 7 位
纬度取值范围:[0-90],经度取值范围:[0-180],单位均为角度;而 Haversine 公式计算
采用的是弧度,注意转换。
返回值:如果输入的坐标数据合规,则返回两点之间的距离,单位为 Km,保留两位小
数;如果输入的坐标不合规,返回错误“Parameter Error.”

代码如下(函数引用)

# 题目:两地之间距离计算

# 计算两点p1, p2之间的距离
# p1:(纬度、经度)
# p2: (纬度、经度)
def sphere_distance(p1, p2):
    import math
    if p1[0] < 0 or p2[0] < 0 or p1[0] > 90 or p2[0] > 90 or p1[1] < 0 or p2[1] < 0 or p1[1] > 180 or p2[1] > 180:
        return 'Parameter Error.'
    r = 6371
    i1 = (p1[0] / 180) * math.pi
    j1 = (p1[1] / 180) * math.pi
    i2 = (p2[0] / 180) * math.pi
    j2 = (p2[1] / 180) * math.pi
    d = 2 * r * math.asin(math.sqrt((math.sin((i2 - i1) / 2)) ** 2 + math.cos(i1) * math.cos(i2) * (math.sin((j2 - j1) / 2)) ** 2))
    return d
<think>好的,我需要回答用户关于如何使用Python的Haversine公式计算两个经纬度之间距离的问题。首先,我得回忆一下Haversine公式的原理,以及如何在Python中实现它。根据用户提供的引用,引用[1]和引用[2]都提到了Haversine算法,并且引用[2]还提到了使用math模块中的函数,比如math.radians转换弧度和math.sin等函数进行计算。 首先,我需要确保公式的正确性。Haversine公式是用来计算球面上两点之间距离的,基于两点的经纬度。公式的致步骤应该是:将经纬度转换为弧度,计算经度和纬度的差值,应用Haversine公式中的各个步骤,包括计算a的部分,再计算c,最后用地球半径乘以c得到距离。 接下来,我需要按照用户的要求提供示例代码。用户提到要使用Python,所以代码应该包含导入math模块,定义函数,转换弧度,应用公式,并返回保留两位小数的结果。同时,用户希望看到具体的示例,比如入两个坐标,距离。 还要注意用户提到的格式要求,行内公式用$...$,独立公式用$$...$$。例如,Haversine的公式可能需要用独立公式展示。同时,代码块需要用正确的Python语法,并且注释是否需要添加?根据引用[2]中的描述,代码中使用了math.radians转换弧度,然后应用公式,最后用round保留两位小数。因此,示例代码应包括这些步骤。 另外,用户要求生成相关问题,可能需要考虑与Haversine公式相关的其他问题,比如误差分析、不同算法的比较、优化方法,或者实际应用场景等。 现在,检查是否有遗漏的部分。是否需要解释公式中的每个步骤?用户可能希望代码简洁,但注释可以帮助理解。根据引用[2]的描述,代码中已经进行了转换弧度和计算,所以可能需要简要说明每个步骤的作用。 最后,确保回答结构清晰,分步骤说明,并正确引用提供的参考引用,如[^1]和[^2]。例如,在解释Haversine公式时,提到它在航海和导航中的应用,引用[^1],而在代码部分提到使用math模块转换弧度,引用。 总结一下,回答的结构应该是: 1. 简要介绍Haversine公式及其应用,引用。 2. 分步骤说明实现过程,包括导入math模块、转换弧度、计算差值、应用公式。 3. 提供示例代码,并解释关键步骤。 4. 示例出。 5. 相关问题。 现在需要确认公式的正确性,避免数学错误。例如,Haversine公式的正确步骤是否包括以下计算: a = sin²(Δφ/2) + cosφ1 * cosφ2 * sin²(Δλ/2) c = 2 * atan2(√a, √(1−a)) d = R * c 是的,这是正确的。其中Δφ是纬度差,Δλ是经度差,φ1和φ2是两点的纬度,R是地球平均半径,约为6371公里。 在代码中,需要将纬度差和经度差计算出来,然后代入公式。同时,经纬度需要先转换为弧度,因为math模块的三角函数需要弧度值。 然后,按照这些步骤编写Python代码,并测试是否正确。例如,入北京的经纬度(116.4074°E, 39.9042°N)和上海的经纬度(121.4737°E, 31.2304°N),计算后的距离约是1068公里左右,保留两位小数可能需要检查是否正确。 在相关问题部分,可以提及其他计算距离的方法(如Vincenty公式),Haversine的精度问题,或者如何优化计算速度等。</think>### 使用Haversine公式计算经纬度距离Python实现 Haversine公式通过球面三角学计算地球表面两点间的距离,广泛应用于导航和地理数据分析。以下是分步实现方法: #### 1. 公式原理 Haversine公式的数学表达式为: $$ a = \sin^2\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cdot \cos\phi_2 \cdot \sin^2\left(\frac{\Delta\lambda}{2}\right) \\ c = 2 \cdot \arctan2(\sqrt{a}, \sqrt{1-a}) \\ d = R \cdot c $$ 其中: - $\phi_1, \phi_2$ 为两点纬度(弧度) - $\Delta\phi, \Delta\lambda$ 为纬度和经度差 - $R$ 为地球平均半径(6371公里) #### 2. Python代码实现 ```python import math def haversine(lat1, lon1, lat2, lon2): # 将十进制度数转换为弧度 lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2]) # 计算差值 dlat = lat2 - lat1 dlon = lon2 - lon1 # 应用Haversine公式 a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) # 地球半径(单位:公里) R = 6371 distance = R * c return round(distance, 2) ``` #### 3. 使用示例 ```python # 北京坐标(39.9042°N, 116.4074°E) # 上海坐标(31.2304°N, 121.4737°E) print(haversine(39.9042, 116.4074, 31.2304, 121.4737)) # 出:1068.09 ``` 代码通过`math.radians()`将经纬度转换为弧度,计算差值后应用公式,最终返回保留两位小数的距离(单位:公里)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值