python3关于经纬度、方向角、目标距离

博主搞了半天haversin公式倒腾距离之后,发现有现成的geopy可用,且网上查到的一些函数用法似乎有改变,遂整理如下

已知两点经纬度求距离

from geopy.distance import geodesic

nodes = [(-22.8981672 -43.2219277),(-22.8835229 -43.2631313)]

#以千米为单位求两点之间距离
distance = geodesic(nodes[0],nodes[1]).kilometers
print('两点之间距离:',distance)

注意以上geodesic是geopy2.0版本的用法,在1.19版本中使用时为VincentyDistance

 

已知两点经纬度求方向角(方向角:与正北顺时针夹角)

from math import sin, cos, atan2, pi

#计算方向角
def calcu_azimuth(lat1, lon1, lat2, lon2):
    lat1_rad = lat1 * pi / 180
    lon1_rad = lon1 * pi / 180
    lat2_rad = lat2 * pi / 180
    lon2_rad = lon2 * pi / 180
    y = sin(lon2_rad - lon1_rad) * cos(lat2_rad)
    x = cos(lat1_rad) * sin(lat2_rad) - sin(lat1_rad) * cos(lat2_rad) * cos(lon2_rad - lon1_rad)
    brng = atan2(y, x) / pi * 180
    return float((brng + 360.0) % 360.0)

已知一点经纬度、方向角、目标距离,求下一点经纬度

import geopy

node = (-22.8981672 -43.2219277)
distance = 1
#把int型距离转化为geopy.distance的格式,单位千米
distance = geopy.distance.geodesic(distance)

#计算下一个点坐标
next = distance.destination(node, direction)
next_node = (next.latitude, next.longitude)
print(next_node)

haversin公式已知两点坐标求距离,精度逊于geopy

from math import cos, asin, sqrt, pi

#haversin公式求球面两点间距离
def distance(lat1, lon1, lat2, lon2):
    r = 6731 # 地球平均半径
    p = pi / 180
    a = 0.5 - cos((lat2 - lat1) * p) / 2 + cos(lat1 * p) * cos(lat2 * p) * (1 - cos((lon2 - lon1) * p)) / 2
    return 2 * r * asin(sqrt(a))

geopy的根据坐标查地址,或者根据地址查坐标功能,博主没有用到,需要的移步这篇:Python地理位置信息库geopy的使用(一):基本使用

更多geopy应用见:geopy官方文档

你可能感兴趣的:(python,python)