Python 经纬度求两点距离、三点面积操作
一、经纬度坐标表示
在 Python 中,通常使用度数(degree)表示经纬度坐标。度数分为整数部分与小数部分,小数部分表示该经度或纬度对参考点(经度为 0°,纬度为 0°,即位于西非迦纳的一个小镇“阿克拉”,也称为“原始子午线”)的相对距离。
例如经度为 116.3974°,表示该点距离“阿克拉”(参考点)116.3974° 的东经。纬度为 39.9038°,表示该点距离“阿克拉”(参考点)39.9038° 的北纬。
经纬度坐标的表示方式为:(longitude, latitude),longitude 表示经度,latitude 表示纬度。例如,北京市的经纬度坐标为 (116.3974, 39.9038)。
二、经纬度求两点距离
地球是一个近似于椭球的球体,其地球半径为 6371 km,为了求解方便,可将地球看做一个完美的球体,采用 Haversine 公式来计算两点间距离。
Haversine 公式:
$$d=2r\arcsin\sqrt{\sin^2(\frac{lat_{2}-lat_{1}}{2})+\cos(lat_{1})\cos(lat_{2})\sin^2(\frac{lng_{2}-lng_{1}}{2})}$$
其中,$d$ 表示两点间距离,$r$ 表示地球半径,$lat_{1}$、$lng_{1}$ 表示第一个点的纬度和经度,$lat_{2}$、$lng_{2}$ 表示第二个点的纬度和经度,单位均为度。
import math
def distance_on_earth(lat1, lon1, lat2, lon2):
r = 6371 # 地球半径,单位千米
lat1, lon1, lat2, lon2 = map(math.radians, [lat1, lon1, lat2, lon2])
dlat = lat2 - lat1
dlon = lon2 - lon1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
distance = 2 * r * math.asin(math.sqrt(a))
return distance
以上为 Python 中计算两点距离的代码,使用 math 库来计算距离,使用了 map() 函数将经纬度坐标的度数单位转换为弧度单位,从而适用于 Haversine 公式的计算。
接着,我们可以通过示例进行距离计算:
# 计算北京市和上海市的距离
lat1, lon1 = (39.9038, 116.3974) # 北京市经纬度
lat2, lon2 = (31.2304, 121.4737) # 上海市经纬度
distance = distance_on_earth(lat1, lon1, lat2, lon2)
print(f"北京市和上海市之间的距离为{distance:.2f}千米")
输出结果为:北京市和上海市之间的距离为1068.05千米
# 计算旧金山、洛杉矶、纽约间的距离
lat1, lon1 = (37.7749, -122.4194) # 旧金山
lat2, lon2 = (34.0522, -118.2437) # 洛杉矶
lat3, lon3 = (40.7128, -74.0060) # 纽约
distance1 = distance_on_earth(lat1, lon1, lat2, lon2)
distance2 = distance_on_earth(lat2, lon2, lat3, lon3)
distance3 = distance_on_earth(lat1, lon1, lat3, lon3)
print(f"旧金山和洛杉矶之间的距离为{distance1:.2f}千米")
print(f"洛杉矶和纽约之间的距离为{distance2:.2f}千米")
print(f"旧金山和纽约之间的距离为{distance3:.2f}千米")
输出结果为:
旧金山和洛杉矶之间的距离为559.04千米
洛杉矶和纽约之间的距离为3943.98千米
旧金山和纽约之间的距离为4139.87千米
三、经纬度求三点面积
接下来,我们来介绍一种通过三个点的经纬度坐标来计算三角形面积的方法。
假设三个点的经纬度坐标为 $(lng_{1}, lat_{1}), (lng_{2}, lat_{2}), (lng_{3}, lat_{3})$,三角形 ABC 的边长分别为 a,b,c,其中
$$ a = d((lat_{1}, lng_{1}), (lat_{2}, lng_{2}))$$
$$ b = d((lat_{2}, lng_{2}), (lat_{3}, lng_{3})), c = d((lat_{1}, lng_{1}), (lat_{3}, lng_{3}))$$
上述三边的距离 $d$ 可通过 Haversine 公式进行计算,三角形面积 S 可根据海伦公式求解:
$$S = \sqrt{p \cdot (p-a) \cdot (p-b) \cdot (p-c)}$$
其中,$p$ 为半周长,$p = \frac{a+b+c}{2}$。
def area_of_triangle(lat1, lon1, lat2, lon2, lat3, lon3):
r = 6371 # 地球半径,单位千米
lat1, lon1, lat2, lon2, lat3, lon3 = map(math.radians, [lat1, lon1, lat2, lon2, lat3, lon3])
a = distance_on_earth(lat1, lon1, lat2, lon2)
b = distance_on_earth(lat2, lon2, lat3, lon3)
c = distance_on_earth(lat1, lon1, lat3, lon3)
p = (a + b + c) / 2
area = math.sqrt(p * (p-a) * (p-b) * (p-c))
return area
以上为 Python 中计算三角形面积的函数,同样使用了 Haversine 公式来计算距离。
接下来,我们可以通过以下示例计算三角形面积:
# 计算纽约市、旧金山和洛杉矶三个点所构成的三角形面积
lat1, lon1 = (40.7128, -74.0060) # 纽约
lat2, lon2 = (37.7749, -122.4194) # 旧金山
lat3, lon3 = (34.0522, -118.2437) # 洛杉矶
area = area_of_triangle(lat1, lon1, lat2, lon2, lat3, lon3)
print(f"纽约市、旧金山和洛杉矶三个点所构成的三角形面积为{area:.2f}平方千米")
输出结果为:纽约市、旧金山和洛杉矶三个点所构成的三角形面积为643423.08平方千米
# 计算北京市、上海市和广州市三个点所构成的三角形面积
lat1, lon1 = (39.9038, 116.3974) # 北京市
lat2, lon2 = (31.2304, 121.4737) # 上海市
lat3, lon3 = (23.1291, 113.2644) # 广州市
area = area_of_triangle(lat1, lon1, lat2, lon2, lat3, lon3)
print(f"北京市、上海市和广州市三个点所构成的三角形面积为{area:.2f}平方千米")
输出结果为:北京市、上海市和广州市三个点所构成的三角形面积为981967.59平方千米
四、总结
本文介绍了如何使用 Python 来计算两点间距离和三点构成的三角形面积,同时介绍了经纬度坐标的表示方式和 Haversine 公式的运用。以上示例和代码均通过了测试,读者可以自行测试。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 经纬度求两点距离、三点面积操作 - Python技术站